私はiMX RT1011 Nano Kitを使用しています
素敵なボード
シフター0から8ビット並列処理用にEDMA Flexioをセットアップしようとしています
タイマー0を30MHzに設定。EDMAにより512バイト(リクエストごとに1バイト)を送信。
コード:
FLEXIO_DEV->SHIFTCTL[TX_SHIFTER] =
FLEXIO_SHIFTCTL_TIMESEL(WR_TIMER)
| FLEXIO_SHIFTCTL_TIMPOL(0U)
| FLEXIO_SHIFTCTL_PINCFG(3U) /* 出力 */
| FLEXIO_SHIFTCTL_PINSEL(DATA_PIN_START)
| FLEXIO_SHIFTCTL_PINPOL(0U)
| FLEXIO_SHIFTCTL_SMOD(2U); /* 送信 */
/* タイマー0: WRストローブ、1バイトあたり1パルス
* TIMCMP下位バイト = (flexio_clk / (2*wr_clk)) - 1
* TIMCMP[15:8] = (beats*2)-1 = 1 (シフタロードごとに1バイト) */
timDiv = (flexioClk_Hz / (2U * wrClock_Hz));
if (timDiv != 0U) { timDiv -= 1U; }
timDiv &= 0xFFU;
FLEXIO_DEV->TIMCMP[WR_TIMER] = (1U << 8U) | timDiv;
FLEXIO_DEV->TIMCFG[WR_TIMER] =
FLEXIO_TIMCFG_TIMOUT(1U)
| FLEXIO_TIMCFG_TIMDEC(0U)
| FLEXIO_TIMCFG_TIMRST(0U)
| FLEXIO_TIMCFG_TIMDIS(2U) /* 比較時に無効化 */
| FLEXIO_TIMCFG_TIMENA(2U) /* トリガーがハイのときに有効化 */
| FLEXIO_TIMCFG_TSTOP(0U)
| FLEXIO_TIMCFG_TSTART(0U);
FLEXIO_DEV->TIMCTL[WR_TIMER] =
FLEXIO_TIMCTL_TRGSEL((4U * TX_SHIFTER) + 1U) /* シフター0フラグ */
| FLEXIO_TIMCTL_TRGPOL(1U) /* アクティブロー */
| FLEXIO_TIMCTL_TRGSRC(1U) /* 内部 */
| FLEXIO_TIMCTL_PINCFG(3U) /* 出力 */
| FLEXIO_TIMCTL_PINSEL(WR_PIN)
| FLEXIO_TIMCTL_PINPOL(1U) /* WR アクティブロー */
| FLEXIO_TIMCTL_TIMOD(1U); /* デュアル 8 ビット ボー/ビット */
/* Shifter0からのDMAリクエストを有効にする */
FLEXIO_DEV->SHIFTSDEN |= (1U << TX_SHIFTER);
/* FlexIOを有効にする */
FLEXIO_DEV->CTRL |= FLEXIO_CTRL_FLEXEN_MASK;
ロジックアナライザで信号を確認しました
見た目は私と似ているが、512パックの一部でデータが欠落している。
つまり、例えば200バイト送信して、その後送信を停止し、512バイトすべて送信するということです。
ツァヒ
こんにちは、 @TZAHI さん。
私たちの製品にご関心を寄せ、コミュニティをご利用いただき、本当にありがとうございます。
最も可能性の高い確認方向は、eDMAが30 MHz WRクロックでFlexIO SHIFTBUFを十分に速く連続的に補充できるかどうかです。
現在のリクエストあたり1バイトの構成では、DMA要求レートは非常に高くなる可能性があります。これはeDMA、バス仲裁、FlexIOのSHIFTBUFリフィルタイミングには厳しい場合があります。
考えられる症状としては、TXシフトレバーのアンダーランが挙げられます。転送が失敗した場合は、FlexIOを再初期化またはクリアする前に、まずSHIFTERRをすぐに確認してください。
可能であれば、CPU/バスクロックを上げるか、WRクロックを30MHz未満(例えば20MHzまたは10MHz)に下げてみてください。より低いWRクロックで転送が安定する場合、問題はDMA/FlexIOのリフィルタイミングに関連している可能性が高い。
お役に立てれば幸いです。
よろしくお願いいたします。
5月