关于stm32的spi发送命令时的注意事项
2019-08-14 来源:eefocus
近日在进行一个倾角仪产品操作时,发现了stm32在往外发送数据时出现的一个问题。类似问题以前也出过,现在再次出现。特地写下来提醒自己注意以后防止再犯错。
该倾角仪adis16210与主控制器stm32通信时选用的是spi接口,并且在后续的操作过程中是使用stm32的官方函数库。在初期程序调试时,只是进行了spi的读操作(adis可以不用设置初试参数),能正常进行spi的读操作,能获取到随姿态变好的角度值。
在使用过程中,发现倾角仪更新数据太慢,因此需要对倾角仪进行设置。在程序的初始化阶段,增加了一个spi的写操作,写入一个字节以设置该传感器。更新完程序,运行程序发现再无法正常读取传感器数据了,传感器总是返回0。多次测试,发现该写操作导致倾角仪数据出现问题。
查阅数据手册,发现在进行spi双向通信时,需要及时读出spi接收寄存器数据,否则会出现缓存溢出问题。尽管在程序的初始阶段,我们只是进行了spi的发送操作。但是因为spi是双向通信,在主设备发送数据时,有发送时钟,因此主设备也会接收到数据,也即接收缓冲器中有数据,我们需要进行一下读取操作(结果可以当无效数据丢弃),以读空数据。
因此,在stm32发送一个设置参数之后,我等待发送完成,等待接受完成,再进行了一下读spi接受寄存器的操作。再在程序原来位置进行倾角数据读出时,可以正常读取数据。
因为spi的工作原理类似,因此其它器件在多次发送数据时,中间如果不进行spi接收缓冲器清空操作,就有可能导致接收缓存器溢出,当然有的器件溢出了可能会继续正常工作,但stm32系列芯片在溢出时肯定不会再继续正常工作了。