i2c_msg.buf大小可以有多大?

i2c_msg.buf大小可以有多大?,c,size,buffer,i2c,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 }; 我正在阅读/Documentation/i2c中的struc

我正在尝试在嵌入式设备上使用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
};
我正在阅读
/Documentation/i2c
中的
struct i2c_msg
,但它似乎没有提到
*buf
数组有多大(即
len
的最大大小是多少)

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

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

但这指的是i2c功能“i2c\U主控发送”。所以现在还不清楚发生了什么

buf[len-1]
真的能达到64k吗?也就是说,我可以通过i2c总线在一次写入操作中发送高达64KB的数据吗


谢谢你的帮助。

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

如果一个慢的设备不能适应一个快的设备的速度,那么慢的设备可以通过在需要的时间内保持低的时钟信号来“减慢”快的设备。理论上永远如此,但实际上不在I2c主机上设置某种超时机制是不明智的。例如,“尝试从收件人发送或接收最多5次的数据”。 只要时钟保持在低位,其他人就无法在I2c总线上启动通信。 到目前为止,关于速度部分

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

首先,我不知道有哪种设备会将64k字节(以您的数字)作为数据。到目前为止,我所见过的最大的用户(I2c设备)使用了几百字节作为数据。但这样的设备真的非常非常罕见。平均而言,I2c设备的读写数据通信量从一个字节到最多几个字节

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


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

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