关于读写I2C总线的时候出错的问题

porkGui 2013-01-17 05:41:05
我的程序是这样的:
#include <stdio.h>
#include <linux/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

int main()
{
int fd,ret;
struct i2c_rdwr_ioctl_data codec_data;

fd=open("/dev/i2c-3",O_RDWR);
if(fd<0)
perror("open error");

codec_data.nmsgs=2;
codec_data.msgs=(struct i2c_msg*)malloc(codec_data.nmsgs*sizeof(struct i2c_msg));
if(!codec_data.msgs)
{
perror("malloc error");
exit(1);
}
ioctl(fd,I2C_TIMEOUT,1);/*超时时间*/
ioctl(fd,I2C_RETRIES,2);/*重复次数*/
sleep(1);

codec_data.nmsgs=1;
(codec_data.msgs[0]).len=2;
(codec_data.msgs[0]).addr=(0x36 >> 1);//我的音频硬件地址;
(codec_data.msgs[0]).flags=0; //write
(codec_data.msgs[0]).buf=(unsigned char*)malloc(2);
(codec_data.msgs[0]).buf[0]=0x04;
(codec_data.msgs[0]).buf[1]=0x55;//the data to write
ret=ioctl(fd,I2C_RDWR,(unsigned long)&codec_data);
if(ret<0)
perror("ioctl error1");
sleep(1);

/******read data from e2prom*******/
printf("read start\n");
codec_data.nmsgs=2;
(codec_data.msgs[0]).len=1; //e2prom 目标数据的地址
(codec_data.msgs[0]).addr=(0x36 >> 1);//yinpin;
(codec_data.msgs[0]).flags=0;//write
(codec_data.msgs[0]).buf[0]=0x04;
(codec_data.msgs[1]).len=1;//读出的数据
(codec_data.msgs[0]).addr=(0x36 >> 1);
(codec_data.msgs[1]).flags=I2C_M_RD;//read
(codec_data.msgs[1]).buf=(unsigned char*)malloc(1);//存放返回值的地址。
(codec_data.msgs[1]).buf[0]=0;//初始化读缓冲
ret=ioctl(fd,I2C_RDWR,(unsigned long)&codec_data);
if(ret<0)
perror("ioctl error2");
close(fd);
return 0;
}

音频的硬件地址是没有错误的。在开发板上运行的结果是这样的
ioctl error2: Remote I/O error
只提示了读的时候错误了。请问,这个错误是怎么造成的,我一直困惑了好久!
...全文
2190 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
porkGui 2013-01-22
  • 打赏
  • 举报
回复
引用 4 楼 terminalnt 的回复:
读的时候,codec_data.msgs[1] 没有赋值。
谢谢哦,是我的问题!已经解决了,就是这个问题~~~我错了~
hk-123 2021-06-22
  • 举报
回复
@porkGui 是codec_data.msga[1].的哪个变量没有赋值呢????没看出来呀
terminalnt 2013-01-22
  • 打赏
  • 举报
回复
读的时候,codec_data.msgs[1] 没有赋值。
porkGui 2013-01-21
  • 打赏
  • 举报
回复
引用 2 楼 terminalnt 的回复:
kernel debug
请问怎么看呢,我挂载了debug,然后在/sys/bus/i2c/看到了一些以硬件地址命名的文件夹,例如 1-0050 (这个是eeprom),还有 3-001b (估计就是我的音频了),还有几个i2c-1 , i2c-2, i2c-3。之后呢?就不会了~~
terminalnt 2013-01-21
  • 打赏
  • 举报
回复
kernel debug
HuaiShuShuV 2013-01-17
  • 打赏
  • 举报
回复
你的硬件连接好了吗? 你需要打印出更加具体的日志出来。

21,615

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧