もう長すぎるよ…。
単一のSPI/DMA転送の例を試してみましたが、これらは正常に動作します。
DMA/リンクメモリ転送のサンプルコードを確認しましたが、これらは正常に動作します。
しかし、どれも私の要件を満たしておらず、試してみても合うものが見つかりません。
最初は、リンク構成または単なるピンポン方式で、DMAを使用したフリーランニングSPI TX/RXが必要です。
きっとここには既にこれを実現した人がいて、その知識を共有してくれる人がいるはずですよね?
これまでのところ、私ができた最良の方法は、SPI_DMA用のリンクされた設定のセットを作成することです。これは(最後の設定が最初の設定にリンクしているにもかかわらず)一度だけ実行され、その後停止します。
最悪のケースは、連結された16ビット転送に対して、単一の8ビット転送しか行わない場合だ。
アイデアが尽きてきて、おそらく既に失敗したことを試しているだけだと思う。
誰かいますか…?
これは古い投稿だと分かっていますが、とにかく...問題は、送信転送の幅に関係しています。FIFOを設定するには、32ビット(16ビットのデータ + 16ビットの設定)である必要があります。そうでない場合、SPIのすべての設定ビットがゼロになり、発生している問題が発生します。
--gra
こんにちは、 @IanMcCarthy さん。
遅れてしまい申し訳ありません。最近、異常なほど多くの質問を受けています。辛抱強く待ってくださり、本当にありがとうございます。
ご質問に関してですが、一度手動で起動(デバッグセッションで実行)すると、すべてのコードが無限に実行され、SPIからのSCK信号は2パルス以上(停止ボタンを押すまで連続して)生成されなければなりません。LPC55S69で使用しているSDKのサンプルコードはどれでしょうか?コードにどのような変更を加えましたか?そうすることで、あなたのコードを私のボード上で再現し、何が起こっているのかを確認できます。
ご協力いただき、本当にありがとうございました。他に質問があれば、遠慮なくお尋ねください。
よろしくお願いします。
パブロ・アバロス。
更新情報の投稿、3回目の試みです…
スレーブSPIデバイスから一定のレートで継続的にデータを受信する必要があります(手動でトリガーする方法では要件を満たせません)。
以下のコードは現在の私の状態を示していますが、これはSPIクロックのプラス信号を2つ生成するだけで、それ以上何も起こりません。
SPIの設定が完了すれば、リンクされたDMA記述子のセットを設定でき、一度手動で起動すれば、その後は無期限に動作する、という理解で合っていますか?それとも間違っているでしょうか?
どなたかお手伝いいただける方がいらっしゃいましたら、大変ありがたいです。
srcClock_Hz = EXAMPLE_SPI_MASTER_CLK_FREQ;
SPI_MasterGetDefaultConfig(&masterConfig);
masterConfig.sselNum = (spi_ssel_t)EXAMPLE_SPI_SSEL;
masterConfig.sselPol = (spi_spol_t)EXAMPLE_MASTER_SPI_SPOL;
masterConfig.dataWidth = kSPI_Data8Bits;
masterConfig.baudRate_Bps = 8000;
SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, srcClock_Hz);
DMA_Init(EXAMPLE_DMA);
// Enable channels
DMA_EnableChannel(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_EnableChannel(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL);
// Set channel priorities
DMA_SetChannelPriority(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL, kDMA_ChannelPriority3);
DMA_SetChannelPriority(EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL, kDMA_ChannelPriority2);
// Create channel handles
DMA_CreateHandle(&masterTxHandle, EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_CreateHandle(&masterRxHandle, EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL);
// Set channel callbacks
DMA_SetCallback(&masterTxHandle, TxCallback, NULL);
DMA_SetCallback(&masterRxHandle, RxCallback, NULL);
DMA_SetupDescriptor(
&dmaTxDescriptors[0],
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
&masterTxData,
(void *)&SPI7->FIFOWR,
&dmaTxDescriptors[1]);
DMA_SetupDescriptor(
&dmaTxDescriptors[1],
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
&masterTxData,
(void *)&SPI7->FIFOWR,
&dmaTxDescriptors[2]);
DMA_SetupDescriptor(
&dmaTxDescriptors[2],
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
&masterTxData,
(void *)&SPI7->FIFOWR,
&dmaTxDescriptors[0]);
DMA_PrepareChannelTransfer(&dmaChannelConfig,
&masterTxData,
(void *)&SPI7->FIFOWR,
DMA_CHANNEL_XFER(true, false, true, false, 1, 0, 0, 1),
kDMA_MemoryToPeripheral,
NULL,
// &dmaChannelTrigger,
&dmaTxDescriptors[0]
);
DMA_SubmitChannelTransfer(&masterTxHandle, &dmaChannelConfig);
DMA_StartTransfer(&masterTxHandle);