首页 > 编程知识 正文

linux串口指令,Linux i2c 怎么用

时间:2023-05-06 05:04:53 阅读:153468 作者:4853

最近遇到了i2c接入的奇怪问题:

现象如下。

1. i2c上的设备是e2prom,e2prom的访问方式是block格式。 (相当于一个block,与一个i2c地址对应,共有8个block。 因此,如果用i2c tools工具检测的话,会检测到i2cdetect -r -y 5,我理解检测时检测到的其实和悬挂8个i2c设备是一样的

使用i2cdump -f -y 50x50是为了发现dump的数据固定的地址指示XX,在调试中发现XX意味着此i2c read失败,rann将用于发现读数据即写入地址restart读出地址数据),测定信号后,CPU写入地址后,机器返回的是random read

3 .而且,上述现象一定会出现,而且每次都是固定地址。 1110的寄存器地址有问题。0xe寄存器的地址读取有问题,写下地址后,设备都是返回的NACK。

想法:

怀疑i2cdump是否有问题,在i2cget -f -y 50x500xe上报告i2c访问失败。

怀疑i2c tool是不是有问题,自己写代码实现,也还存在问题

已发现使用i2cset -f -y 50x500xe 7成功,但无法成功读取

即使在i2cdump上读写数据寄存器,也没有问题。 无法访问固定地址。 怀疑CPU I2C控制器的驱动能力的可能性,虽然不充分,但从信号中没有发现电压下降等现象。 之后试着增大驱动能力也没有效果

测量i2cget后发现,0xe的i2c信号虽然没有信息,但i2cdump能量发出信号,最后是用硬件示波器一次也测量不到的i2c信号。 换了几个硬件也没量出来。 只有一个女孩会后量。 bsp调试的时候,好的硬件的重要性,这个量不出来的时候,硬件说软件有问题)

6 .之后,继续调查有硬件问题的i2c总线和没有问题的i2c总线的区别。 之后,有问题的i2c总线的e2prom和没有问题的i2c总线的e2prom,除了e2prom的制造商不同之外,有问题的i2c总线在中间安装了适配器,该适配器的目的是为了避免信号干扰和热插拔引起的问题请注意,这里也说明了好硬件的重要性。 最初,硬件告诉bsp,此适配器对i2c信号没有任何影响。 后来我发现,其实这个适配器是i2c信号所要求的。 处理器与坞站连接的其实是此适配器,而不是与坞站连接的e2prom。 同时,此适配器不受CPU控制,完全由硬件连接,但此适配器对i2c信号有要求

之后,在测量信号时,发现适配器之前的i2c信号和适配器之后的i2c信号有差异。 这种差异信号明显恶化,适配器后面的sda hold time时间明显比以前小得多,时间是临界的。 之后,调查CPU I2C控制器手册和device i2c驱动程序代码,发现这个sda hold time可以增加,之后增加到300ns就没有问题。

这个问题的总结:

1 .检查I2C总线和设备之间是否有其他设备,总线是否过长

2. i2c信号的测量非常重要,对设备的理解也很重要。 (发现刚毕业的硬件和工作了几年的硬件和工作了十几年的硬件,差别很大。 这里的适配器问题是工作了十几年的硬件同事发现的,其他硬件同事与硬件无关,是软件问题,奶奶,我本来想骂你的) )。

3 .如果中间存在器件,请尝试测量中间器件前后的信号是否有变化

4. i2c信号的时机有很多,需要与设备手册对照,如上升时间、下降时间、hold time等。 这是最好的请有经验的硬件同事帮忙分析。

5 .另外,关于这个sda hold time的配置问题,经过检查,某个CPU的I2C控制器、软件可以配置,但某个CPU的I2C控制器没有这个配置。 此时,我们可以通过修正I2c的上拉电阻,降低电容器,在一定程度上增加这个时间。 如果无论如何都不可能,请避免使用在这些时间有特殊要求的设备。 然后发现e2prom设备本身对sda hold time时间的要求只要大于0即可,主要是中间适配器对i2c的sda hold time有300ns的要求。

6 .最后,在i2c定时,i2c被高电平采样。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。