A7+linux4.14内核SPI 总线通讯异常问题分析

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波形。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值