1405288_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1405288_ja-JP

1405288_ja-JP

LPC55S69 SPI - DMA - リンク転送またはピンポン転送でうまくいかない

もう長すぎるよ…。

単一のSPI/DMA転送の例を試してみましたが、これらは正常に動作します。

DMA/リンクメモリ転送のサンプルコードを確認しましたが、これらは正常に動作します。

しかし、どれも私の要件を満たしておらず、試してみても合うものが見つかりません。

最初は、リンク構成または単なるピンポン方式で、DMAを使用したフリーランニングSPI TX/RXが必要です。

きっとここには既にこれを実現した人がいて、その知識を共有してくれる人がいるはずですよね?

これまでのところ、私ができた最良の方法は、SPI_DMA用のリンクされた設定のセットを作成することです。これは(最後の設定が最初の設定にリンクしているにもかかわらず)一度だけ実行され、その後停止します。

最悪のケースは、連結された16ビット転送に対して、単一の8ビット転送しか行わない場合だ。

アイデアが尽きてきて、おそらく既に失敗したことを試しているだけだと思う。

誰かいますか…?


全般LPC55xxペリフェラルRe: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers

これは古い投稿だと分かっていますが、とにかく...問題は、送信転送の幅に関係しています。FIFOを設定するには、32ビット(16ビットのデータ + 16ビットの設定)である必要があります。そうでない場合、SPIのすべての設定ビットがゼロになり、発生している問題が発生します。

--gra


Re: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers

こんにちは、 @IanMcCarthy さん。


遅れてしまい申し訳ありません。最近、異常なほど多くの質問を受けています。辛抱強く待ってくださり、本当にありがとうございます。


ご質問に関してですが、一度手動で起動(デバッグセッションで実行)すると、すべてのコードが無限に実行され、SPIからのSCK信号は2パルス以上(停止ボタンを押すまで連続して)生成されなければなりません。LPC55S69で使用しているSDKのサンプルコードはどれでしょうか?コードにどのような変更を加えましたか?そうすることで、あなたのコードを私のボード上で再現し、何が起こっているのかを確認できます。


ご協力いただき、本当にありがとうございました。他に質問があれば、遠慮なくお尋ねください。


よろしくお願いします。
パブロ・アバロス。

Re: LPC55S69 Getting nowhere with SPI - DMA - Linked or Ping-Pong transfers

更新情報の投稿、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);

Tags (1)
No ratings
Version history
Last update:
‎04-04-2026 03:30 AM
Updated by: