文档库 最新最全的文档下载
当前位置:文档库 › STM32 SPI 注意要点

STM32 SPI 注意要点

STM32 SPI 注意要点

STM32 SPI 注意要点

觉得SPI 很简单,所以从来没有去仔细去看就直接用了,这次在调一

个芯片的时候出现了一个比较奇怪的问题,以为是程序逻辑的问题,浪费了好

几天的时间都没有找到原因。今天乖乖查阅了一些手册,最后在《STM32 不完

全手册》里找到了线索,现在索性对SPI 做个总结。首先说最近碰到的问题。

问题一:错以为SPI 的读数据,直接读取SPIx->DR 寄存器就可以完成。这个问题我一直没注意,十分惭愧。原来SPI 的时钟只有在往DR 寄存器里面写

数据的时候才会产生,读是不会产生的(暂时没有从哪个资料中得到确认,不

过我猜就是这样)。所以要读取slave 发过来的数据,master 必须先发一个DUMMY 数据,这个数据内容不重要,目的只是为了产生一组clock 给

slave,slave 的数据就沿着这一组clock 给发了出来。master 给slave 读写数据的过程是这样的:写:master 对DR 写数据,产生clock,同时数据从MOSI 管脚移位发送到slave 的MOSI 管脚;读:master 对DR 写DUMMy,产生clock,同时DUMMy 由MOSI 发给slave(这个数据没有意义),同时读

取的数据从slave 的MISO 管脚移位发送到master 的MISO 管脚。问题二:在配置为双线全双工的时候,如上面所说,在master 写数据的时候,其实stm32 的SPI 同时也往master 的DR 寄存器里面读进数据(读写虽然都是DR,其实

是两个不同的寄存器)。对这点的忽略,就是这次问题产生的原因。我在对采

集芯片读取数据之前,需要向芯片发送一个读取数据的指令,在发送指令后,

理论来说采集芯片会自动等待发送数据过来,只要我stm32 这边发一个

DUMMy 产生一组clock,然后就可以从DR 中读取数据。但是由于在发送读取

指令的时候,其实STM32 也同时也把一个无用的数据读到DR 里面去了,这

个数据在没有被取走之前,是不会再接受新的数据的,所以在后来发送

相关文档