I2C驱动中i2c_transfer函数返回-6

作者在使用alinx7010开发板驱动时遇到写入EEPROM后无法读取的问题。经过排查,发现打印设备地址和正确格式对于解决I2C传输错误至关重要。具体来说,必须同时打印msg[0].addr和msg[1].addr,并确保格式规范,否则会导致读写错误。

本人用的是alinx7010开发板进行驱动。在应用层随便写入两个数到EEPROM中,然后读取这两个数的值,发现可以写入,读取时i2c_transfer函数返回-6,查询得知:

驱动打开时会显示:于是我开始检测是否时client的addr没检测到,再检测寄存器是否有问题,发现都是不行,能写不能读。

于是,我直接打印出msg[0].addr和msg[1].addr和reg,看看哪个是乱码,结果惊奇的发现……

竟然可以读也可以写了???什么情况,pinntk立大功。于是对这三个参数我一个一个排查……

我发现msg[0].addr和msg[1].addr最少要打印其中一个,如果只打印寄存器一个,还是返回-6:

而打印了设备地址后只需打印其中一个就不会报错:

另外,我发现一定要打印  msg[0].addr = %#x,msg[1].addr = %#x\r\n   如果少了“=”号前面的也会报错,少了换行符 \n 也是一样的错误:

至于原因……找了一天还没找出来

### i2c_transfer 返回 -6 的错误原因及解决方案 `i2c_transfer` 函数返回 `-6` 表示发生了 `EINVAL` 错误,即传递给函数的参数无效[^1]。这通常意味着 I2C 控制器无法识别所提供的消息结构或某些配置不正确。 以下是可能的原因及其对应的解决方法: #### 可能原因 1:I2C 消息结构配置错误 如果 `struct i2c_msg` 中的消息长度 (`len`) 或者缓冲区指针 (`buf`) 配置不当,则可能导致此错误。 **解决方法**: 确保 `struct i2c_msg` 结构体中的字段被正确定义。例如: ```c struct i2c_msg msg; msg.addr = 0xD6 >> 1; // 设备地址右移一位 msg.flags = 0; // 写操作标志位 msg.len = sizeof(data); // 数据长度 msg.buf = data; // 缓冲区指针 ``` #### 可能原因 2:设备未初始化或驱动加载失败 如果没有正确初始化 I2C 总线或者相应的内核模块未加载,也可能导致该错误。 **解决方法**: 使用以下命令确认 I2C 模块已加载并检查总线状态。 ```bash lsmod | grep i2c dmesg | grep i2c ``` 如果发现模块缺失,可以通过以下方式手动加载: ```bash sudo modprobe i2c-dev ``` #### 可能原因 3:目标设备地址错误 如果指定的目标设备地址不符合实际硬件连接情况,也会触发此类错误。 **解决方法**: 使用 `i2cdetect` 工具扫描 I2C 总线上存在的设备地址,并验证其与程序中使用的地址一致。 ```bash i2cdetect -y 1 ``` #### 可能原因 4:传输超时或其他硬件问题 有时由于硬件设计缺陷(如拉高电阻不足),可能会引发通信异常。 **解决方法**: 检查电路板上的 I2C 上拉电阻是否正常工作,推荐阻值范围为 4.7kΩ 至 10kΩ[^2]。 --- ### 示例代码片段 下面提供一段用于测试 I2C 通信的基础代码作为参考: ```c #include <linux/i2c-dev.h> #include <fcntl.h> #include <stdio.h> #include <sys/ioctl.h> int main() { int file; char buf[1]; struct i2c_rdwr_ioctl_data packets; struct i2c_msg messages[1]; if ((file = open("/dev/i2c-1", O_RDWR)) < 0) { perror("Failed to open the bus."); return 1; } ioctl(file, I2C_SLAVE, 0xD6 >> 1); buf[0] = 0x0F; // 寄存器地址 messages[0].addr = 0xD6 >> 1; messages[0].flags = 0; messages[0].len = 1; messages[0].buf = buf; packets.msgs = messages; packets.nmsgs = 1; if (ioctl(file, I2C_RDWR, &packets) < 0) { perror("I2C transfer failed"); close(file); return 1; } printf("Data sent successfully.\n"); close(file); return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值