为什么i2cset发送额外的字节?

时间:2018-09-27 05:31:33

标签: linux linux-kernel i2c

我从事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 Logic Analyser trace

起初,我认为这与我的控制器有关,甚至尝试深入研究其时钟设置。也使用了Salae逻辑分析仪。控制器没有错,也没有设置。我唯一能想到的就是Linux完成的复杂洋葱驱动程序分层。

我想知道为什么Linux发送3个额外的字节(6c 00 2f)。为什么i2c_smbus_write_block_data发送多余的字节,如何避免?

2 个答案:

答案 0 :(得分:3)

这是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个额外的垃圾字节。

答案 1 :(得分:0)

使用i2c_smbus_write_i2c_block_data进行原始i2c传输

i2c_smbus_write_block_data使用SMBUS协议进行数据传输