前言

今天测试 I2C ,又被 B 哥上了一课,灰常尴尬了属于是 好久都没测试了,手太生了。。。还是需要温故而知新啊。


正题

没那么多的前戏了,直接进入吧,干干涩涩你忍着点
这次测试的是 BUS 3 --> I2C_TEMP_SEN1_SDA,应该是 BMC 到 CPU 那边的一颗温度 IC 吧

Master.png

Slave.png

示波器上抓了很久找到了波形,但是呢,也没有相应的数据,想起来需要发包。于是登录 BMC 串口准备进行发包
发包有俩好处:

  1. 如果没有数据输出可以自定义数据输出,不至于卡波形卡在地址位
  2. 可以直接输出想要的波形,不用等到系统跑到这个BUS

BMC串口.png

在这里发包用的是i2cget,发包指令为i2cget -f -y 2 0x48 0x01,当然,最后一个0x01是自己编的,可以随便替换,比如后面我又换成0x48了。
其中里面参数 2 是代表了BUS,等等,为毛是BUS 2,线路图上不是 SDA 3 吗?因为在发包时i2cget计算 BUS 是从 0 开始的。
可以看到,原本的地址为0x90,这是8位地址,在i2cget中需要转换成7位地址。so easy,直接除以2,算出来是0x48
桥豆嘛嘚,怎么就0x48了?请自行百度~
i2cgettool 的具体的参数解释如下:

flag解释
-V显示当前的版本并退出
-f强制访问设备,即使它已经繁忙。默认情况下,i2cget 将拒绝访问已经在内核驱动程序控制下的设备。用这个flag可能比较危险,它可能会严重混淆有问题的内核驱动程序。它还可能导致 i2cget 返回无效值。因此,只有在您知道自己在做什么的情况下,才使用风险自负。
-y禁用交互模式。默认情况下,i2cget 将等待用户的确认,然后再处理 I2C 总线。使用此标志时,它将直接执行操作。这主要用于脚本。请谨慎使用
-a允许在 0x00 - 0x07 和 0x78 - 0x7f 之间使用地址。不推荐。i2cget 有两个必需的选项。i2cbus 表示要扫描的 I2C 总线的编号或名称。此编号应对应于 i2cdetect -l 列出的总线之一。chip-address 指定该总线上芯片的地址,是介于 0x08 和 0x77 之间的整数。data-address 指定该芯片上要读取的地址,并且是介于 0x00 和 0xFF 之间的整数。如果省略,将读取当前活动的寄存器(如果这对所考虑的芯片有意义)。mode 参数(如果指定)是字母 b、w 或 c 之一,分别对应于读字节数据、读字数据或写字节/读字节事务。还可以将 p 附加到 mode 参数以启用 PEC。如果省略 mode 参数,则 i2cget 默认为读字节数据事务,除非 data-address 也被省略,在这种情况下,默认(且唯一有效)事务是单个读取字节。

没错,生搬硬套,翻译的~
发包之后,对应的波形就出来了,也有相应我发的数据了。波形后面再补吧


能看出地址和数据的波形找不到了,随便换张图意思意思吧。

I2C_Adress

通过这张图很明显的可以看出七位地址了,在CLK高电平的时候进行数据采样,地址就是101 1000,换算过来就是0x58啦。如果是 8 位地址的话就是1011 0000,换算过来就是0xB0不过这张图是用的地址采样,真爽啊,我测试的那台机器没有I2C地址采样,需要手动去发包去抓。

结语

实际上我想表达的意思就是需要多温故而知新,有些东西其实之前都掌握了,也很简单,但是长时间不去做了,可能就忘记了。

最后修改:2024 年 01 月 08 日
如果觉得我的文章对你有用,请随意赞赏