STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】
1:平臺 STM32F413 + GD5F4(spi nand flash)(沒開啟DMA中斷,讀寫操作NAND 都是單片機發起,所以知道什么時候讀,什么時候寫)
2: 問題(STM32 SPI+DMA機制發送,接收理解不到位)
能狗發送數據,但是接收數據不對且接收后,SCK時鐘一直存在
在不使用DMA情況下,正常讀寫
使用DMA后,DMA接收數據后一直有時鐘存在
當時思想是單寫和單讀數據;
Direction_CfgSpiHard(SPI_Direction_1Line_Tx); //設置SPI工作模式及方向
NAND0_CS_0();
// bsp_spiWrite1(PROGRAM_LOAD);
// bsp_spiWrite1( 0x0f & ((0&0xff00)>>8)); //讀內存塊+地址
// bsp_spiWrite1(0&0xff);
SPI_DMACmd(SPI2,SPI_DMAReq_Tx,ENABLE); //使能串口1的DMA發送
MYDMA_Enable(SPI2_TX_DMA_STREAM,20); //開始一次DMA傳輸!
while(DMA_GetFlagStatus(SPI2_TX_DMA_STREAM,DMA_FLAG_TCIF4)==RESET)
{
//等待 DMA1_Steam4 傳輸完成
NAND0_CS_1();單獨寫
void read_test(void)
{
//等待 DMA1_Steam4 傳輸完成
Direction_CfgSpiHard(SPI_Direction_2Lines_RxOnly); //設置SPI工作模式及方向 SPI_DMACmd(SPI2,SPI_DMAReq_Rx,ENABLE); //使能串口1的DMA發送 MYDMA_Enable(SPI2_RX_DMA_STREAM,20); //開始一次DMA傳輸!while(DMA_GetFlagStatus(SPI2_RX_DMA_STREAM,DMA_FLAG_TCIF3)==RESET){printf("\r\n read err! %d",DMA_GetCurrDataCounter(SPI2_RX_DMA_STREAM)); //得到當前還剩余多少個數據};DMA_ClearFlag(SPI2_RX_DMA_STREAM,DMA_FLAG_TCIF3);//清除DMA1_Steam3傳輸完成標志 DMA_Cmd(SPI2_RX_DMA_CHANNEL,DISABLE);SPI_DMACmd(SPI2,SPI_DMAReq_Rx,DISABLE); //使能串口1的DMA發送 NAND0_CS_1();}
單獨讀;數據不對,后用SPI讀設備ID,發現ID號滯后一個字節(估計是DMA接收后,讀ID時沒有清除標準位的原因);
參考這位博主的這段話 及 參考了官方的例程
現在收發同時進行
數據OK,波形正常
思考:DMA為什么不能通過SPI的單線收發工作模式,來接收收數據(難道是發送時需要清楚接收標準,接收時需要清楚發送標準?)
總結
以上是生活随笔為你收集整理的STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 体育、医药、股票思维导图模板
- 下一篇: 输出所有的最长公共子序列