为什么 i2cset 会发送额外的字节?
why does i2cset send extra bytes?
我研究 PIC18F55K42 芯片已有一段时间了。 PIC 设置为从属设备,并且正确接收字节。但是我遇到了一些问题。
例如,当我这样做时:
i2cset -y 1 0x54 0x80 0x01
在控制器端看起来是正确的,我可以看到地址 0x80(数据地址)和字节值 0x01。
当我以块模式发送时:
i2cset -y 1 0x54 0x80 0x01 0x02 0x03 0x04 i
我看到控制器上出现虚假字节。更准确地说,它看起来像这样:
ADDRESS 80 6c 00 2f 01 02 03 04 STOP
起初我认为这与我的控制器有关,甚至尝试深入了解它的时钟设置。也用过Salae逻辑分析仪。控制器没有问题或已设置。我唯一能想到的地方是 Linux.
完成的复杂洋葱驱动程序分层
我想知道为什么 Linux 发送 3 个额外字节 (6c 00 2f
)。为什么 i2c_smbus_write_block_data
发送额外的字节,如何避免?
使用 i2c_smbus_write_i2c_block_data
进行原始 i2c 传输
i2c_smbus_write_block_data
使用SMBUS协议进行数据传输
这是 Busybox i2cset
实现中的一个错误。见 miscutils/i2c_tools.c
:
/* Prepare the value(s) to be written according to current mode. */
switch (mode) {
case I2C_SMBUS_BYTE_DATA:
val = xstrtou_range(argv[3], 0, 0, 0xff);
break;
case I2C_SMBUS_WORD_DATA:
val = xstrtou_range(argv[3], 0, 0, 0xffff);
break;
case I2C_SMBUS_BLOCK_DATA:
case I2C_SMBUS_I2C_BLOCK_DATA:
for (blen = 3; blen < (argc - 1); blen++)
block[blen] = xstrtou_range(argv[blen], 0, 0, 0xff);
val = -1;
break;
default:
val = -1;
break;
}
应该是block[blen - 3] = xstrtou_range(argv[blen], 0, 0, 0xff);
。该错误导致从堆栈发送 3 个额外的垃圾字节。
我研究 PIC18F55K42 芯片已有一段时间了。 PIC 设置为从属设备,并且正确接收字节。但是我遇到了一些问题。
例如,当我这样做时:
i2cset -y 1 0x54 0x80 0x01
在控制器端看起来是正确的,我可以看到地址 0x80(数据地址)和字节值 0x01。
当我以块模式发送时:
i2cset -y 1 0x54 0x80 0x01 0x02 0x03 0x04 i
我看到控制器上出现虚假字节。更准确地说,它看起来像这样:
ADDRESS 80 6c 00 2f 01 02 03 04 STOP
起初我认为这与我的控制器有关,甚至尝试深入了解它的时钟设置。也用过Salae逻辑分析仪。控制器没有问题或已设置。我唯一能想到的地方是 Linux.
完成的复杂洋葱驱动程序分层我想知道为什么 Linux 发送 3 个额外字节 (6c 00 2f
)。为什么 i2c_smbus_write_block_data
发送额外的字节,如何避免?
使用 i2c_smbus_write_i2c_block_data
进行原始 i2c 传输
i2c_smbus_write_block_data
使用SMBUS协议进行数据传输
这是 Busybox i2cset
实现中的一个错误。见 miscutils/i2c_tools.c
:
/* Prepare the value(s) to be written according to current mode. */
switch (mode) {
case I2C_SMBUS_BYTE_DATA:
val = xstrtou_range(argv[3], 0, 0, 0xff);
break;
case I2C_SMBUS_WORD_DATA:
val = xstrtou_range(argv[3], 0, 0, 0xffff);
break;
case I2C_SMBUS_BLOCK_DATA:
case I2C_SMBUS_I2C_BLOCK_DATA:
for (blen = 3; blen < (argc - 1); blen++)
block[blen] = xstrtou_range(argv[blen], 0, 0, 0xff);
val = -1;
break;
default:
val = -1;
break;
}
应该是block[blen - 3] = xstrtou_range(argv[blen], 0, 0, 0xff);
。该错误导致从堆栈发送 3 个额外的垃圾字节。