I2C调试问题经验总结

文章目录

    • 【设计思考】I2C控制器常见设计方案 、CPU与I2C速率匹配思考
        • 1)典型的Master I2C控制器方案
        • 2)典型的Slave I2C控制器方案
        • 3)CPU执行速率与I2C速率匹配思考
    • 【常见问题】I2C读数据错误问题,读比写复杂得多---方式调整与延时设置
    • 【常见问题】地址冲突与设备探测---措施 做好地址规划、了解哪些设备地址可调
    • 【常见问题】高速率下干扰问题---措施 补充校验与重发机制 或者 降低速率
    • 【调试技巧】I2C调试难点依赖时序对接才能发送数据 与 逻辑分析仪使用

近期项目上用到了I2C接口,之前没有相关调试经验,以此机会整理一下自己的问题经验
关于I2C的概念介绍参考前文:https://blog.csdn.net/runafterhit/article/details/114935007

【设计思考】I2C控制器常见设计方案 、CPU与I2C速率匹配思考

通过I2C协议的理解,理论上我们可以通过控制GPIO模拟SCL时钟线、SDA数据线来做。为了简化处理 设备集成了I2C控制器。

1)典型的Master I2C控制器方案

通过配置一些寄存器 设置位 提前设置好发送速率、然后 往写fifo寄存器写入要发送的字节内容 比如slave设备地址、通过配置寄存器设置动作触发 如 起始信号 加 写动作, 收到动作是能后 I2C控制器就会按照 预先设置好的速率 控制时钟和数据线 发出一个起始信号,然后写出数据 也就是fifo里面的设备地址,紧接着需要通过读取状态寄存器判断是否发送完成和slave设备是否有相应,往往是阻塞循环读取一段时间。如果响应了就需要软件继续往fifo里面填写后续发送内容,然后再设置写动作,再判断写完成和从设备是否ACK响应,最后写停止动作。读的思路类似。

2)典型的Slave I2C控制器方案

提前配置寄存器设置好Slave的设备地址,设置中断响应模式,常见是 停止位P或者重新起始rS 触发中断(复杂点的可以设置fifo存储数据内容多少来触发中断),注册好中断处理函数。当slave收到master的起始信号就开始读取设备地址,如果是自己就开始自动响应ACK,然后接受master写的数据,连续接受存到逻辑FIFO中(逻辑fifo深度决定了单次命令一次能接受的最大数据量,比如100byte),这个过程不需要软件参与,当等到停止位时触发中断通知软件,CPU得到中断后在中断处理函数中把fifo里面的内容读取走,解析内容来进行对应命令处理。

3)CPU执行速率与I2C速率匹配思考

从上面的典型控制器设计思路上看,I2C控制器大部分还是基于 简化IO的控制角度设计的,中间的ACK响应判断和写完成等待都需要CPU阻塞判断,等到完成写数据和ACK后再开始发送下一个数据,并没有设计成写好要发送的数据和交互参数后控制器自己完成交互再通过中断等通知CPU读取结果(部分高性能SOC可持,类似dma模式自动发送)。因此在I2C读写期间需要大量等待,执行指令速率从CPU自生的几百M压低到I2C交互过程的如100K典型速率

【常见问题】I2C读数据错误问题,读比写复杂得多—方式调整与延时设置

从上面描述的典型master和slave控制器方案可见。
写数据一般master写入slave的逻辑fifo,在收到结束标志时 slave设备起一个中断进行解析fifo中的数据执行对应命令。
读取数据需要 master先把要读取哪里的内容传先写给slave然后开始读取内容,slave收到信息之后起一个中断解析fifo中读取命令,根据对应要求计算数据 写入读取fifo提供master读取走,这里面就涉及一个master什么时候可以读取的问题,如果读早了,slave设备并没有准备好数据,就可能读取到0数据或者异常数据
常见两种读取数据交互时序如下:
1)一条指令完成:master给slave写入要读取数据地址或者命令后,不发送P结束标志,再次发起一次S起始标志,slave设备会认为是一次rS(重复起始)得到一个中断 开始准备数据,可用的准备时间几个时钟周期为级别,就是master再次发送slave读设备得到Act时间。然后master发送完成后就开始读取。只能用于从设备准备数据基本不耗时情况。
2)两条指令完成:master给slavev写入要读取数据地址或者命令后,发送一次P结束标志。此时slave设备收到P后得到一个中断开始准备数据,master会经过一个delay(按需要设置比如1ms),master再次发起S起始标志,然后发出设备地址(R)后开始读取,此时准备时间就等于delay+再次发起设备读的时间。用于从设备数据需要准备耗时大的情况。
I2C调试问题经验总结_第1张图片

【常见问题】地址冲突与设备探测—措施 做好地址规划、了解哪些设备地址可调

地址冲突:由于I2C是多对多设备网络。当链路中两个设备有相同的设备地址时,命令发送就会出现问题,双方都会尝试参与交互过程响应命令,导致数据交互失败。 在设计产品场景的时候 一定要 先确认同一个链路中 各个设备地址,确认哪些是固定的,哪些是可以调整地址的(通常两种调整方式:1、设备可以通过修改启动code选择任意地址;2、设备通过外部io管脚高低选择特定预设地址),进行排查,确认调整方式。
设备探测:即master访问slave的时候,先尝试去读取slave设备的一个地址,如果得到Act并读取出来说明这个设备存在,按流程执行。如果没有得到Act说明slave不存在。用于一些兼容性场景。

【常见问题】高速率下干扰问题—措施 补充校验与重发机制 或者 降低速率

I2C的数据传输速率通常在100kbit~1Mbit:需要Master和Slave同时支持到这个速率才能正常传输。并且速率越高 对于线材(要足够短)和 外部信号干扰(足够低)就有更高要求。最常用安全速率是100Kbit,如果对速率有要求的场景,也用到了400Kbit。
关于干扰环境下安全校验:由于存在上述传递干扰问题,会导致数据传递过程bit数据错误,可以添加一些安全校验。比如数据传递以:cmd+len+data+checksum的方式,cmd用来表达命令类型,len表示数据传递长度,然后checksum是基于前面cmd+len+data的校验值,如crc8、crc16或者单纯的位运算校验结果。slave接受完成后就经过校验正常才进行配置。

【调试技巧】I2C调试难点依赖时序对接才能发送数据 与 逻辑分析仪使用

I2C调试由于其ACK和地址响应 机制存在 不能简单从接受方 与 发送方 单独测量送出或接受的数据,数据线master和slave都在控制。 必须要对接后 通过 波形来判断 起始结束信号、设备地址、读写ACK 的 实际测量情况来定位问题。推荐使用逻辑分析仪器来进行测量定位。
举例如下图通过Kingst LA5032进行采样分析,逻辑分析仪一般提供解析器如I2C解析器 可以直观的体现出交互数据。
I2C调试问题经验总结_第2张图片
使用逻辑分析仪基本流程: 连接好测量信号,设置采样率、采样深度、触发模式(I2C通常设置下降沿-匹配起始信号),点击开始采集,然后发送一个访问命令进行通信。举例 某款逻辑分析仪器 I2C测试的解析情况:
I2C调试问题经验总结_第3张图片

你可能感兴趣的:(ARM嵌入式类,单片机,stm32,嵌入式硬件)