1

我正在尝试在嵌入式设备上使用 i2c 接口。

i2c-dev.h(用户空间头文件,不是内核同名文件!) i2c_msg 定义为

struct i2c_msg {
    __u16 addr; // slave address
    unsigned short flags;
    short len;      // msg length
    char *buf;      // pointer to msg data
};

我正在阅读struct i2c_msg<kernel root>/Documentation/i2c但它似乎没有提到*buf数组可以有多大(即 maxsize 是多少len)。

我遇到的最接近答案的是 doc-file writing-clients:327,其中指出:

...,第三个要读取/写入的字节数(必须小于缓冲区的长度,也应该小于 64k,因为 msg.len 是 u16。)

但这是指 i2c 函数“i2c_master_send”。所以不清楚发生了什么,

buf[len-1]真的能上到64k吗?IE。我可以通过 i2c 总线在一次写入操作(和一个设备)中发送多达 64kBytes 的数据吗?

谢谢您的帮助。

4

2 回答 2

2

理论上,是的,你可以。I2c 协议在速度和长度上都是非常“灵活”的协议。

如果慢速设备无法应对较快设备的速度,则允许慢速设备通过在需要时将时钟信号保持低电平来“减慢”快速设备。理论上永远,但在实践中,不在 I2c 主机上设置某种超时机制是不明智的。例如,“尝试从收件人发送或接收最多 5 次数据”。只要时钟保持低电平,就没有其他人可以在 I2c 总线上开始通信。到目前为止,关于速度部分。

关于长度部分,这里 I2c 也可以具有可以通过总线发送/接收的“不定式”字节数。唯一两个对识别 I2c 通信很重要且相关的“标记”是开始和停止组合。在这两者之间,您可以通过总线发送无限量的字节。但也在这里,常识是要使用的。

首先,我不知道有任何设备会占用 64k 字节(以获取您的号码)作为数据。到目前为止,我见过的最大的消费者(I2c 设备)将几百字节作为数据。但是这样的设备真的非常非常罕见。平均而言,一个 I2c 设备需要从一个字节到最多几个字节的数据流量,包括读取和写入。

因此,结构中short字段的数据类型足以覆盖所有可能的当前和未来 I2c 通信。lenstruct i2c_msg

可以在此处(规范)和此处(手册)找到更多信息。

于 2013-12-30T14:43:59.463 回答
0

GeertVc 在回答方面做得很好。如果处理 EEPROM,它们可以有 64K 字节的数据。但是,它们通常会有一个内部缓冲区并使用这个缓冲区来执行写入。例如,4K 字节设备 AT24C32 被组织为 128 页,每页 32 字节。一次可写入的最大内存块为 32 字节,从页边界的开头开始。在任何情况下,您都需要研究连接到 I2C 总线的设备。

于 2017-01-07T00:43:58.047 回答