I.问题现象、
2023年1月18日,A7核心板 升级内核版本时,发现SPI总线无法跟wk2168通讯,打印信息如下:
nts_io_init in==
gpmi-nand 1806000.gpmi-nand: mode:4 ,failed in set feature.
[bus:0~select:0]wk2xxx_probe() GENA = 0xFF
register spi return v = :0
II.问题分析
一、检查正常的SPI波形如下:
1:CLK 2:MOSI 数据为 01000000 3:MISO 数据 30 4:CS
4:RST
二、异常的SPI波形如下:
4:CS
4:RST
发现MISO波形有差异:
抓一个完整的CS波形:发现问题点:CLK信号多一个下降沿:
正常的SPI波形如下:
再此基础上进行数据解析: MISO 1XX00000
解决措施:
因CLK只有第一次是从高到底再CS之后,因此probe时多读两次就OK。
后续:
测试扩展串口时,不通过。跟踪数据发现:2168打印信息 RX前9个字节变成了0。
0x1—0x10----0x70----0x0----0x0----0x4----0xdb----0xa----
0x1----0x3----0x12----0x0----0x65----0x0----0xf3----0x32----0x34----0x30----0x47----0x53----0x32—0x31----0x31----0x30----0x30----0x38----0x34----0x38----0x36----0xcf----0x43----
0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x1d----0x71----0x0----0x0----0x8----0xd4----0x8----0xd4----0x5----0xe2----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x0----0x1----0x0----0x0----0x0----0x0----0x0----0x0—0x0----0x0----0x0----0x0----0x13----0x8a----0x0----0x0----0x65----0x8b----
串口跟踪的打印信息如下:
2023-02-01 14:48:57_351【Read :25】:01 10 70 00 00 04 08 DE A8 0E 30 02 01 07 E7 FF 78 01 10 70 00 00 04 DB 0A
2023-02-01 14:48:57_530【Read :31】:01 03 A0 2C 00 09 66 05 01 03 12 00 65 00 F3 32 34 30 47 53 32 31 31 30 30 38 34 38 36 CF 43
2023-02-01 14:48:57_779【Read :73】:01 03 00 00 00 1E C5 C2 01 03 3C 00 00 00 00 58 54 1D 71 00 00 08 D4 08 D4 05 E2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 13 8A 00 00 65 8B
主控SPI读出数据也是从第三帧开始前9个字节变成0。
进一步进行抓包。抓2168 uart接口波形:
1:TX 2:EN 3:RX 由图可知,TX,RX,EN波形正常可识别。前四个字节为01 03 3C 00。
修改读FIFO模式为读Fdat模式,故障消失。
进一步分析:
更换4.1.15zImage,确保硬件OK。经确认 4.1.15 可正常读写。问题应该出再第一次下拉的 CLK上。检查一下 是否可以调整CS。
改用模拟SPI,工作正常。设备调整如下:
spi {
compatible = “spi-gpio”;
#address-cells = <0x1>;
// #size-cells = <0x1>;
ranges;
gpio-sck = <&gpio4 25 0>;
gpio-miso = <&gpio4 28 0>;
gpio-mosi = <&gpio4 27 0>;
cs-gpios = <&gpio4 26 0>;
num-chipselects = <1>;
/* clients */
wk2166@0{
#address-cells = <1>;
#size-cells = <1>;
compatible = "wk2xxxspi";
spi-max-frequency = <10000000>;
reg = <0>;
irq-gpio = <&gpio5 3 GPIO_ACTIVE_LOW>;
rst-gpio = <&gpio5 4 GPIO_ACTIVE_LOW>;
};
};
抓波形如下: 第一个波形正常应答。
此时 CLK最大抓到500K。
远达不到10M这么大。
实际通讯效果顺序杂乱:
正常的一发一收:
模拟SPI 顺序杂乱:
Spi-imx 更换成4.1.15 驱动波形加载无改善。
驱动加载成功后,给2168拉RST,无效果。
有效的措施:
1、IO初始化为低(集成SPI怎么改?)
2、采用模拟SPI。
3、2168读FIFO改为读FDAT。
综上,先按3修改继续测试。后续再考虑措施1。
1尝试:
A、修改IO口:设备树增加模拟SCK初始化,无效。还原设备树
B、设备树模拟初始化,关闭集成。有效,打印OK。还原设备树
设备树集成初始化:如下,无效。还原设备树
D、移植4.1.15 spi-imx.c 无效。还原
3、检查21xx RST信号下图4.驱动加载完成后,发过一个RST信号。后续读取数据错误 跟第一个CLK错误的边沿已经没有关系了。
解决措施:
1、驱动加载阶段多读两次,读正确为止。
2、
采用调整读FIFO模式为 读FDAT模式:条件编译1 改为0。其他未调整。
(实际测试 FDAT模式 性能较低,存在扩展串口丢包问题,还需继续解决)2.17.2023
继续尝试:
1、采用集成CS。 要改硬件,暂不调整。
2、更新新版本2168驱动。
检查新版本驱动 读取FIFO代码完全一致。尚未调整。
3、降低SPI波特率看看:降低到5M,修改dtb文件
降低到5M,1M 读取FIFO均无改善。
4、抓包分析丢包情况:实际发现被统计丢包的,实际应答是正常的。
查看丢包程序,逻辑是发送没有应答就判定为丢包,实际SPI通讯出错可能性大。
对策:
1、发送改为FIFO,接收采用FDAT。
测试丢包问题解决。
III.解决措施
1、永久措施:
Wk2xxx 驱动 probe时 重复三次,避免一次错误导致驱动无法加载的情况。
2、wk2xxx 发送采用FIFO寄存器,接收读FDAT寄存器。
经测试通讯稳定。
3、更新最新的2168驱动(待更新)
IV.总结建议
SPI 总线波形排查时 需抓一个完整的CS段,关注CLK以及 MISO,MOSI波形。