我正在尝试使用 i2c 工具来读写 I2C 设备。 i2cset块写入似乎不起作用。我收到“错误:参数太多!”
字节和字写入可以工作。 块到底是什么意思?是256字节吗?
我使用的命令是
./i2cset -y 0x01 0x55 0x00 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0x00 0x9A 0x00 0xEC 0x00 i
i2ctransfer [-f] [-y] [-v] [-a] i2cbus desc [data] [desc [data]] ...
i2ctransfer 1 w54@0x55 0x00 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0x9A 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0xCD 0x00 0x9A 0x00 0xEC 0x00
i2cset块写入成功取决于底层I2C Linux内核驱动。
要检查系统中的 I2C 驱动程序是否支持块操作,请使用
i2cdetect -F
,如下所示:
$ sudo i2cdetect -F 1
Functionalities implemented by /dev/i2c-1:
I2C yes
SMBus Quick Command no
SMBus Send Byte yes
SMBus Receive Byte yes
SMBus Write Byte yes
SMBus Read Byte yes
SMBus Write Word yes
SMBus Read Word yes
SMBus Process Call no
SMBus Block Write yes
SMBus Block Read yes
SMBus Block Process Call no
SMBus PEC no
I2C Block Write yes
I2C Block Read yes
对于
i2cset
和 i2cget
,I2C 驱动程序应支持 SMBus Block 操作。
对于 i2ctransfer
,I2C 驱动程序应支持 I2C 块 操作。
然后,I2C 客户端设备应该有一个有效的地址范围。否则,I2C 事务将会失败。 0x50 - 0x57 范围内的 I2C 客户端设备地址属于 I2C EEPROM 芯片。他们通常支持页面写入。 页写操作允许在同一写周期中写入最多页大小的字节,前提是所有字节都位于存储器阵列的同一行中。部分页面 小于页面大小字节的写入也是允许的。
在单个 I2C 写入事务中使用新数据覆盖 EEPROM 芯片数据的前 4 个字节的示例,先使用
i2cset
执行,然后再使用 i2ctransfer
。
读取前4个字节的内容:
$ sudo i2cset -y 1 0x57 0
$ sudo i2cget -y 1 0x57
0x00
$ sudo i2cget -y 1 0x57
0x01
$ sudo i2cget -y 1 0x57
0x02
$ sudo i2cget -y 1 0x57
0x03
通过单个
0x01020304
命令用 0xdeadbeef
覆盖 i2cset
:
$ sudo i2cset -y 1 0x57 0 0xde 0xad 0xbe 0xef i
再次读取前4个字节的内容:
$ sudo i2cset -y 1 0x57 0
$ sudo i2cget -y 1 0x57
0xde
$ sudo i2cget -y 1 0x57
0xad
$ sudo i2cget -y 1 0x57
0xbe
$ sudo i2cget -y 1 0x57
0xef
使用
i2ctransfer
也可以实现同样的效果。
将0xcafecafe
写入EEPROM芯片的前4个字节:
$ sudo i2ctransfer -y 1 w5@0x57 0x00 0xca 0xfe 0xca 0xfe
$ sudo i2cset -y 1 0x57 0
$ sudo i2cget -y 1 0x57
0xca
$ sudo i2cget -y 1 0x57
0xfe
$ sudo i2cget -y 1 0x57
0xca
$ sudo i2cget -y 1 0x57
0xfe