背景
我司有一款安全芯片,主要用于实现PC、移动端加解密方案。安全芯片有多种硬件存在形式,比如TF卡、USB设备、也可以直接贴到主板上。安全芯片内部支持SD协议,对外的接口是SD接口,当然也可以用SPI接口来发送SD协议的数据。 本篇文章介绍在展讯SC9835平台上调试SPI接口所遇到的问题及解决问题的思路。这里要说明一下展讯SC9835平台是x86架构的,手机厂商用的比较少。
问题现象
安全卡测试工具无法访问安全芯片(SPI驱动没通)。
问题分析
- 检查芯片供电以及IO供电,测试发现1.85V,改成1.8V后仍不通。
- 用示波器测量波形。CLK引脚有波形输出。发送CMD0命令时在MOSI引脚上的输出也是正确的。
- 用逻辑分析仪测量波形,发现CMD0命令发出去后,在读取响应时没有波形输出,说明SPI控制器丢包了(一开始没有逻辑分析仪,后来恒达买了一个)。
- 实验发送1个10字节数据包和发送10个1字节数据包发现:发送1个10字节数据包时逻辑分析仪上显示10个波形;发送10个1个字节数据包时,逻辑分析仪显示不足10个,8个或9个不等,说明连续发送有丢包现象。
- 打印SPI控制器状态寄存器SPI_STS2 。该寄存器的bit[7]为TXF_REAL_EMPTY,当该位为1时表示TX FIFO没有数据,该位为0时表示TX FIFO有数据。理论上,在发送之前SPI_STS2 的bit[7]应该指示的是没有数据,发送开始时该位应该由硬件立即置位,在软件上通过该标志位来判断是否发送完成。测试发现,在丢包时,该位的值是0,说明上一包数据还未传输完成,但在波形上看上一包数据的波形已经发出。
- 推测可能原因是在启动发送时SPI硬件没有及时置位SPI_STS2的bit[7]位,导致” 在软件上通过该标志位来判断是否发送完成”失败。经测试发现问题原因就是SPI硬件没能及时置位SPI_STS2的bit[7]位。
解决方案
在开始发送时延时几个微秒,确保SPI硬件将SPI_STS2的bit[7]位置位后,再执行软件上判断该标志位。
PS:芯片在供电和IO为1.85V时能正常工作。