为什么我的 i2cset 块写入命令不起作用

问题描述 投票:0回答:2

我正在尝试使用 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
  • 0x01 是总线#,
  • 0x55 是设备地址#,
  • 0x00 是起始寄存器地址#,
  • i 代表块写入。
i2c eeprom
2个回答
1
投票

尝试i2ctransfer

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

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.