首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么i2cset要发送额外的字节?

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

Stack Overflow用户
提问于 2018-09-27 05:31:33
回答 2查看 1.7K关注 0票数 3

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

例如,当我这样做时:

代码语言:javascript
复制
i2cset -y 1 0x54 0x80 0x01

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

当我发送块模式时,如下所示:

代码语言:javascript
复制
i2cset -y 1 0x54 0x80 0x01 0x02 0x03 0x04 i

我看到控制器上出现了假字节。更确切地说,看起来是这样的:

代码语言:javascript
复制
ADDRESS 80 6c 00 2f 01 02 03 04 STOP

起初,我认为这与我的控制器有关,甚至试着挖掘它的时钟设置。也使用了Salae逻辑分析仪。控制器没什么问题,或者是设置好了。我唯一能想到的地方是Linux所做的复杂的洋葱驱动程序分层。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-28 06:49:38

这是Busybox中的i2cset实现中的一个bug。请参阅miscutils/i2c_tools.c

代码语言:javascript
复制
    /* 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个额外的垃圾字节。

票数 4
EN

Stack Overflow用户

发布于 2018-09-27 08:43:00

使用i2c_smbus_write_i2c_block_data进行原始i2c传输

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52530009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档