SPI读取LSM303D加速度数据错误

下图展示了数据错误的测试情况

SPI读取LSM303D加速度数据错误故障现象和测试条件:DIY飞控(CTRL V5),后面贴出部分原理图;从PCB右上角丝印可见坐标轴方向。程序中先读LSM303D的加速度计,后读L3GD20。
电脑串口右上框乃LSM加速度数据,红色=x轴,蓝色=y轴;这两个数据一直在0和3000左右来回变,是不正常的。
下图是此电路一主两从SPI连接图:
SPI读取LSM303D加速度数据错误
下图是LSM303D连接:
SPI读取LSM303D加速度数据错误
下图是示波器测得MISO(黄色)和LSM_CS即CS1的(蓝色)波形:
SPI读取LSM303D加速度数据错误
此图颇耐人寻味,是故障确立之关键。
下图是关键程序流程:
SPI读取LSM303D加速度数据错误
图中的中断定时(5ms)进入,此间先读LSM的加速度计,再读L3GD20陀螺仪,均采用STM32F103RCT6的SPI3硬件读取;
下图是LSM303A_Raed函数(读加速度3轴数据)的真面目:
SPI读取LSM303D加速度数据错误
下图是LSM303ReadReg函数(读LSM某个寄存器)的庐山真面:
SPI读取LSM303D加速度数据错误
下图是LSM初始化配置:
SPI读取LSM303D加速度数据错误
此LSM设置通俗解释:LSM以400Hz频率持续更新其acc 数据寄存器,不用“转换完成”中断,使用滤波器(应该无关紧要);设置测量上限±12g;以及LSM内部地磁计设置。从最后的故障原因来看L3GD20的设置是无关紧要的。
一切状况似乎都在掌握之中,故障何来?

试验1:去掉L3GD20的操作L3GD20_Read

可以更严谨地把L3GD20的初始化一并注释;同样的姿态将得到正确的结果:
SPI读取LSM303D加速度数据错误
仍然贴出示波器的波形,MISO(黄色)和LSM_CS即CS1的(蓝色):
SPI读取LSM303D加速度数据错误
当然,这次示波器捕获的数据不可能和之前的一致,只能说大同小异。分析故障成因对技术和心态是个巨大地挑战!万幸地是有正确地范例有以对比。
对故障波形进行个梳理:
SPI读取LSM303D加速度数据错误
似乎除了波形有些异常和干扰外看不出时序有啥毛病。扪心自问:为啥加了L3GD20读就不行,去掉就好使?为啥?
1.读L3GD20时LSM的CS确定是高电平未使能,L3GD的读写应该不会影响到LSM!
2.不读L3GD20时LSM数据完全正确,说明时序上没有毛病!
难道:L3GD和LSM的MISO都是是推挽输出造成部分短路?
有网友指出MISO是3态门,CS高致使MISO高阻态;经测试,CS高时,都时高阻态,没问题,不会短路。
难道:焊接不牢?
焊接不牢焉能有正确读数的时候?
难道:芯片坏的?
又不能解释正确读数的时候啊!
难道:信号干扰?外星人?玄学?。。。
一而再,再而三,问题肯定还是出在LSM上!而且重点在引脚上;扒开LSM手册“细品”,在SPI部分找到这么一句话:SPC is the serial port clock and it is controlled by the SPI master. It is stopped high when CS is high (no transmission).
SPI读取LSM303D加速度数据错误
MothFuc,不传输的时候SCK(SPC)应该是高啊!这是一直被忽略的地方!看下SCK波形:
SPI读取LSM303D加速度数据错误
果然SCK并没有在CS为高的时候拉高。这可能时硬件SPI配置的问题。但是还不能100%确定就是它引起的。

试验2

SPI读取LSM303D加速度数据错误
让SCK在CS高时也为高,同时L3GD也改一下:
SPI读取LSM303D加速度数据错误
居然就正常啦!
SPI读取LSM303D加速度数据错误
在看一下SCK波形:
SPI读取LSM303D加速度数据错误
虽然SCK只在间隙处短暂拉高,但是数据已经完全正常了!没想到这就是我找了3天的bug!真的幸福,如果恰好帮到你,那就幸福上天啦!

相关文章: