近期碰到实际应用中客户一个SPI小问题,可以分享下,实际设计中可以适当注意。
应用背景:客户在应用中存在BOOT+APP架构,在跑APP时没有遇到问题,当APP跳转到BOOT时,概率性存在读取SPI外设失败,且概率非常不稳定,无法准确统计,通过修改相位和极性,发现只有在BOOT中使用模式3,APP中使用模式3才能将出错概率降低(由于样本有限,只是感受上降低了)。
分析:
1).抓包SPI数据,
在使用SPI 模式0情况下,通讯会出现电平无法拉高情况,修改成模式3后,可以正常通讯。
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; ----极性是低电平的话,很难改变电平。SPI_CPHA_2Edge MISO很难拉低; SPI_CPHA_1Edge MISO很难拉高
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; MISO 拉低/拉高正常
具体如下图一紫线(MISO),电压在1.32V,在模式0情况下,MCU无法识别到高电平。
如下图二紫线(MISO),电压在3.3V,在模式3情况下,MCU可以识别到高电平。
2)复现场景确认。
在极限条件下,如低温情况,该现象可以稳定出现,因此,怀疑与抗干扰能力有关系,在增加外接干扰情况下,更易复现。
3)删减代码测试。
不断删减客户代码同步用低温进行压力测试时,发现当删除完某个传感器驱动代码后,不再复现改现象,多次验证后,能验证跟该传感器驱动有关系。
4)查看原理图。
在跟客户研发确认完后,同步查验了客户原理图,该SPI外挂了两个外设,而CS片选管脚是通过MCU两个GPIO来控制,这两个GPIO均无加上拉,存在一定概率,两个外设同时打开,同时在MISO管脚上输出电频,出现MISO管脚电平异常情况。结合来看:
4.1 在跳转boot时,MCU管脚重新复位处于浮空状态,也无稳定电平更容易出现;
4.2 低温情况下,外挂设备也容易出现低压低于1.5V情况(已同步抓波形验证),论证了更容易复现异常的原因;
4.3 模式0可以而模式3不行,大概率是由于模式0下,外设无法正确识别通信协议,直接丢包,从而躲过了异常情况。
总结,在实际应用当中,当涉及到SPI外挂多个外设时,一定要在每个CS管脚上都要加上拉电阻,以确保产品在恶劣情况下,依然能稳健运行。
|