您的位置 首页 主动

STM32 SPI 留意关键

觉得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里边去了,这个数据在没有被取走之前,是不会再承受新的数据的,所以在后来发送DUMMY的时分,读寄存器DR并没有更新,所以读到的数据自然是错的。
解决方法是,在发送指令之后,读一次数据,铲除DR,以便接纳下个数据。

下面临SPI其他关键做一些总结。
管脚界说:
MISO:主设备输入/从设备输出
MOSI:主设备输出/从设备输入
SCK:串口时钟,作为主设备的输出,从设备的输入
NSS:从设备挑选

关于NSS,关于从设备,输入低电平表明挑选该从设备,这个信号在硬件NSS形式时,由NSS管脚供给;在软件NSS形式时,由内部SSI位操控,NSS管脚能够用作一般IO运用。
关于主设备,假如NSS输出被使能,NSS会输出低电平,能够与从设备的NSS相连,当从设备为硬件NSS形式时,将主动变成从SPI设备(不答应多主环境);假如NSS输出被封闭:答应操作于多主环境。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/317415.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部