LPSPI を使用して DMA 経由で 24 ビット フレームを書き込もうとしています。アプリケーションは重要ではありませんが、私の例では、メモリから外部 DAC にデータを送信することです。私はこれを DMA で動作させたいと思っています。なぜなら、最終的には TCD のリンク リストを PIT と一緒に使用して、CPU オーバーヘッドなしで DAC を継続的に更新するためです。これは外部 ADC および DAC を使用する一般的なアプリケーションです。16 ビット DAC/ADC には 24 ビットのフレーム要件があることも一般的です (上位バイトはコマンド用、下位バイトはデータ用)。uint8_t データを使用して転送を 3 バイトに分割するのではなく、uint32_t データを使用して 24 ビットのフレーム サイズで送信し、先頭バイトを無視します。
さて、LPSPI と DMA の構成に移ります。
1.imxRT1060 SDK の API LPSPI_MasterInit 関数の lpspi_master_config_t 構造を使用すると、 bitsPerFrame を 24 に設定できます。DMA を使用せずに標準転送を行う場合、これは問題ではありません。
2. ただし、API の LPSPI_MasterTransferEDMA 関数で DMA を使用する場合、24 ビット フレーム サイズのケースは eDMA ハードウェアによって処理またはサポートされませんか?LPSPI_MasterTransferEDMALite では、DMA 転送幅は edma_transfer_config_t 構造体で設定されます。具体的には、srcTransferSize フィールドと destTransferSize フィールドは、SPI フレーム サイズ (bytesPerFrame) から導出される bytesEachRead 値と bytesLastWrite 値に基づいて構成されます。
/* LPSPI_MasterTransferPrepareEDMALite */
uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U;
if (bytesPerFrame <= 4U)
{
handle->bytesEachWrite = (uint8_t)bytesPerFrame; // for 24bit frames = 3
handle->bytesEachRead = (uint8_t)bytesPerFrame; // ....
handle->bytesLastRead = (uint8_t)bytesPerFrame; // ....
}/* now back in LPSPI_MasterTransferEDMALite */
switch (handle->bytesEachRead) //bytes each transfer
{
case (1U):
transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes;
transferConfigRx.minorLoopBytes = 1;
if (handle->isByteSwap)
{
addrOffset = 3;
}
break;
case (2U):
transferConfigRx.srcTransferSize = kEDMA_TransferSize2Bytes;
transferConfigRx.minorLoopBytes = 2;
if (handle->isByteSwap)
{
addrOffset = 2;
}
break;
case (4U):
transferConfigRx.srcTransferSize = kEDMA_TransferSize4Bytes;
transferConfigRx.minorLoopBytes = 4;
break;
default:
transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes;
transferConfigRx.minorLoopBytes = 1;
assert(false);
break;
}デフォルトのケースが発生し、3 バイトのケースは処理されないためエラーが発生します。EDMAハードウェアは3バイト転送をサポートしていますか?基本的に、uint32_tのデータとフレームを3バイトとして扱い、最上位バイトを無視してDMA転送を行いたいのですが、可能ですか?
こんにちは@azoneさん、
弊社の製品にご興味をお持ちいただき、またコミュニティをご利用いただき誠にありがとうございます。
次のリンクを確認してください。eDMA は 1、2、4、8、16、32、64 バイトの転送サイズをサポートしており、24 ビット (3 バイト) の転送サイズはサポートしていないことが説明されています。
MCUXpresso SDK APIリファレンスマニュアル: EDMA: 拡張ダイレクトメモリアクセス (eDMA) コントローラドライバ
よろしくお願いいたします。
メイリュー
わかりました。確認してくれてありがとう。これで、動作させるために時間を無駄にすることがなくなりました。したがって、唯一の方法は、すべてをuint8_tデータとしてkLPSPI_MasterPcsContinuousで3バイトとして送信することです。これは他のすべてのペリフェラルでも同じ方法で実行しているので問題ありませんが、16ビットDAC実装の場合は不要なオーバーヘッドが発生します。ありがとうございます。