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

标签 linux linux-kernel i2c

我研究 PIC18F55K42 芯片已有一段时间了。 PIC 设置为从属设备,并且正确接收字节。但是我遇到了一些问题。

例如,当我这样做时:

i2cset -y 1 0x54 0x80 0x01

它在 Controller 端看起来是正确的,我可以看到地址 0x80(数据地址)和字节值 0x01。

当我以 block 模式发送时,例如:

i2cset -y 1 0x54 0x80 0x01 0x02 0x03 0x04 i

我看到 Controller 上出现虚假字节。更准确地说,它看起来像这样:

ADDRESS 80 6c 00 2f 01 02 03 04 STOP

Salae Logic Analyser trace

起初我认为这与我的 Controller 有关,甚至尝试深入了解它的时钟设置。也用过Salae逻辑分析仪。 Controller 没有问题或已设置。我唯一能想到的地方就是 Linux 完成的复杂的洋葱驱动程序分层。

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

最佳答案

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

关于linux - 为什么 i2cset 会发送额外的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530009/

相关文章:

linux-kernel - Linux I2C通信问题

linux - 如果内核是交叉编译的,我必须交叉编译模块吗?

linux - 在linux(CENTOS)上为多个ORACLE HOME配置.bash_profile

linux - 由于 "missing separator"无法运行 make 文件

c - 如何避免多个原始套接字绑定(bind)到同一 IP 地址?

linux-kernel - linux 内核中的 path_lookup 如何工作?

linux - U-Boot i2c 检测到我的设备 (70) 但 Linux i2c 没有。为什么?

html - 如何授予 apache 从目录中检索图像的权限?

java - 进程 killer 识别

c - Raspberry pi 上的 I2C_SLAVE 和 I2C_RDWR 返回值错误