2017-08-16 34 views
0

DMAを使用してSPIスレーブデバイスから固定バイト数(合計27バイト)を読み取ろうとしています。私はSTM32F4チップを実行しています。DMA循環モードを使用してSPIダミーバイトを書き込む

"SPIバスから読み込むには、クロックを生成する必要があります。したがって、読み込むために書き込む必要があります。私は循環モードでダミーバイト(0xFF)を書き込むように私のDMAコントローラを設定しました。

uint8_t tx_buffer[] = {0xFF}; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; 
DMA_InitStruct.DMA_BufferSize = 1; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)tx_buffer; 

と私のRx DMAストリームは、ダブルバッファモード使用してセットアップです:転送完了割り込みがある受信された27バイトの後

uint8_t rx_buffer0[27]; 
uint8_t rx_buffer1[27]; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; 
DMA_InitStruct.DMA_BufferSize = 27; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)rx_buffer0; 

DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)rx_buffer1, DMA_Memory_0); 
DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE); 

(私は他の無関係なinitialisationsを省略している。)

をトリガーされた。

void DMA2_Stream0_IRQHandler(void) 
{ 
    if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0) == SET) 
    { 
     DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); 
     DMA_Cmd(DMA2_Stream1, DISABLE); // disable Tx circular writes 
    } 
} 

問題は次のとおりです。最初のバッファに正しいデータが表示されます。しかし、割込みがTx循環DMAをトリガしている間、第2のバッファの最初の数バイトは、それがディスエーブルされるまで満たす。

ダミーデータ用に27バイトの予約を避けたいのですが、固定量のサイクルの後に循環DMAストリームを停止する方法はありますか?

答えて

0

DMAを通常モードで有効にし、要素数を27に設定します。

後で、メモリと周辺機器のメモリ使用量を無効にすると、あなたのアプローチが有効になります。

関連する問題