!!!关于SPI FLASH DMA的疑惑

2019-07-20 21:32发布

这两天在捉摸SPI FLASH的DMA方式接收数据,其实论坛也有相关例程,但是因为是寄存器版本的,所有我只能望洋兴叹。思路很简单,就是从SST25064C(8M串行FLASH)中读取10个字节的数据, 这些数据我之前就通过普通方式写入了。不过程序一直卡在配置完DMA之后的 while(DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET);  里面。示波器上看,发送了读取命令和地址之后,CLK就莫名消失了,当然 在配置过程中我参考了一位高手的程序 http://blog.csdn.net/chenwei2002/article/details/49722373,将SPI先关闭,再配置为   SPI_Cmd(SPI1, DISABLE);   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;
   SPI_Init(SPI1, &SPI_InitStructure);
   SPI_Cmd(SPI1, ENABLE);
昨天看STM32的中文手册,看的我是晕乎乎的,(STM32中文参考手册_V10),发现在PDF中有这么一段,

单向只接收模式(BIDIMODE=0并且RXONLY=1)
在此模式下,传输过程可以简要说明如下(见):
1. 在SPI_CR2寄存器中,设置RXONLY=1;
2. 设置SPE=1,使能SPI模块:
a) 主模式下,立刻产生SCK时钟信号,在关闭SPI(SPE=0)之前,不断地接收串行数据;

立刻产生SCK信号,不过示波器上完全没有看到有SCK信号产生, 特发帖求助各位,还望有高手点播一二,不慎感激。


SPI肯定是启动了,只是发送完读取命令码和地址后,我更改了SPI的工作方式,改为了双向只接收。然后启动了DMA,打断点发现DMA压根儿就没有执行,因为发送完读取地址后,SCK脉冲就没了,意思是我的SPI的RXNE永远不会置位,手册上讲了设为双向只接收且MCU做主机模式的话,SCK是一直持续存在的。(中文的手册我怕有错误,还专门看了英文的手册)

Unidirectional receive-only procedure (BIDIMODE=0 and RXONLY=1)
In this mode, the procedure can be reduced as described below (see Figure 244):
1. Set the RXONLY bit in the SPI_CR2 register.
2. Enable the SPI by setting the SPE bit to 1:
a) In master mode, this immediately activates the generation of the SCK clock, and
data are serially received until the SPI is disabled (SPE=0).
b) In slave mode, data are received when the SPI master device drives NSS low and
generates the SCK clock.
3. Wait until RXNE=1 and read the SPI_DR register to get the received data (this clears
the RXNE bit). Repeat this operation for each data item to be received.



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
负西弱
1楼-- · 2019-07-20 23:10
 精彩回答 2  元偷偷看……
xuande
2楼-- · 2019-07-21 01:01
 精彩回答 2  元偷偷看……
349512492
3楼-- · 2019-07-21 04:16
楼上的观点完全正确 这两天我都在思考 看了很多例程 都是DMA接收数据的时候还开了DMA发送 用来产生SCK。 这样就意味着我在接收数据的时候 其实还开了一个DMA发送 只不过发的是dummy数据,现在稍微有点头绪了 还在调试过程中,谢谢楼上和资深版主 要调试通过了我会把相关代码贴上 供大家交流

一周热门 更多>