今天使用STM32F407读取flash中的数据的实验中,发现一个问题读取到的问题一直不对,找了半天问题,后面找到原子的例程看了一下,发现是SPI数据的读取与发送函数写的有问题,我原本的发送与接收函数是单独的两个函数,而原子的发送与接收函数全都放在 一起。看了半天没搞懂为什么要这么写,但这么写读写确实正常,网上找了找终于找到了一个解答,因此分享出来,方便自己记忆也方便遇到同样问题的人能尽快找到解决办法。
u8 SPI1_ReadWriteByte(u8 TxData) { while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
SPI_I2S_SendData(SPI1, TxData);
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
return SPI_I2S_ReceiveData(SPI1);
} 发送与接收为什么这么写? 首先我们 要知道数据寄存器(SPIX->DR)分为 2 个缓冲区,一个用于写入(发送缓冲区),一个用于读取(接收缓冲 区)。对数据寄存器执行写操作时,数据将写入发送缓冲区,从数据寄存器执行读取时,将返回接收缓冲区中的值。因此这样写并不会出现读到的数据等于发送的数据,而且发送与接收在全双工通信模式下是并行进行的。另一个要注意的问题,因为从模式是没法提供时钟的,所以主模式下必须要在接收的同时提供时钟。办法就是发送一个字节来实现,因为还是上面说的,发送一个字节就意味着收到一个字节,代码和写完全一样,只要把读出来的字节保存即可。
|