i2c_msg.buf大小有多大?

时间:2013-07-24 20:54:02

标签: c size buffer i2c

我正在尝试在嵌入式设备上使用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数组有多大(即最大值为{{ 1}} be)。

我遇到的答案中最接近的是doc-file len,其中声明:

  

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

但这指的是i2c功能“i2c_master_send”。所以发生的事情并不明显,

writing-clients:327真的能达到64k吗?即。我可以在i2c总线上的一次写操作(和一个设备)中发送高达64kB的数据吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

理论上,是的,你可以。 I2c协议是一种非常“灵活”的协议,无论是速度还是长度。

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

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

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

因此,结构short中字段len的数据类型struct i2c_msg非常大,足以涵盖所有可能的当前和未来的I2c通信。

可以找到更多信息here(规范)和here(手动)。

答案 1 :(得分:0)

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