2017-08-16 137 views
0

我正嘗試從使用DMA的SPI從器件讀取固定數量的字節(總共27個字節)。我正在運行一個STM32F4芯片。使用DMA循環模式寫入SPI虛擬字節

「爲了從SPI總線上讀取,需要生成一個時鐘,所以你需要寫入才能讀取。」我設置了我的DMA控制器以循環模式寫入一個虛擬字節(0xFF)。

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流是設置:

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)

的27個字節之後接收到傳輸完成中斷觸發。

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繼續時,填充第二個緩衝區的前幾個字節,直到它被禁用。

我想避免爲虛擬數據保留27個字節,那麼有什麼辦法可以在固定的週期數量後停止循環DMA流嗎?

回答

0

在正常模式下啓用DMA並將元素數設置爲27

後來,禁用內存和外圍設備的內存增加,你的方法將工作。