i2c驱动的基本问题
请教使用i2c总线传输数据的详细步骤?
还有如何获得从设备的地址?
比如 2440的camera接口驱动注册了video0,是否可直接用fd=open("/dev/i2c-0",O_RDONLY); ioctl(fd1,0x0703,CAM_ADDR),然后依照 i2c的读写方法write read?这个 CAM_ADDR 地址如何得到?如何测试i2c总线和 camera接口是否有通信?是否还要把这个设备注册为i2c设备???
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
Q:请教使用i2c总线传输数据的详细步骤?
A:你是问协议层吗?请参看协议,没啥好说的。
Read: start+(Address+Read)+ACK+Data+ACK..... NAK/ACK + Stop
Write: Start+(Addr+W)+...................................................Stop
Q:还有如何获得从设备的地址?
A:一般是查硬件资料获得。或是发广播包,获得所有从设备的地址。Linux下有个i2c-detect工具。
Q:比如 2440的camera接口驱动注册了video0,是否可直接用fd=open("/dev/i2c-0",O_RDONLY); ioctl(fd1,0x0703,CAM_ADDR),然后依照 i2c的读写方法write read?这个 CAM_ADDR 地址如何得到?如何测试i2c总线和 camera接口是否有通信?是否还要把这个设备注册为i2c设备??
A:记不清了,无法具体回答。
具体来说camera驱动是和V4L2这个接口结合在一起的,V4L2模块里调用I2C模块导出的读写操作。在应用层只用到V4L2 模块。
推荐看 :http://lwn.net/Articles/203924/
谢谢tacoe 提供的资料哈,不过我用的是v4l接口,只能在应用层自己实现i2c的通信,
我写了一小段测试i2c通信的代码:
fd1 = open("/dev/i2c-0",O_RDONLY);
if(fd1 < 0)
printf("open i2c error \n");
else
printf("open i2c success \n");
if(ioctl(fd1,0x704,0) < 0)
printf("set 7bit mode error \n");
else
printf("set 7bit mode success \n");
if(ioctl(fd1,0x0703,0x30)<0)
printf("set cam address error \n");
else
printf("set cam address success \n");
data[0] = 0x12;
unsigned char c =0x61;
memcpy(data+1, &b, 1);
int s;
if((s=write(fd1,data,2))==2)
printf("write success\n");
else
printf("write error\n");
printf("write return %d \n",s);
int addr=0x12;
if((s=write(fd1,&addr,1))!=1)
printf("write addr error return %d \n",s);
else
printf("write addr success \n");
unsigned char a;
if(read(fd1,&a,1)!=1)
printf("read error \n");
else
printf("read %d \n",a);
下面是我运行代码的打印信息:
open success
open i2c success
set 7bit mode success
set cam address success
write error
write return -1
write addr error return -1
read 1
从信息看 出错的代码是 write 返回值是-1 ,
是否说明i2c 的写函数没有正确调用?
请问问题处在哪?如何解决?
内核版本是 2.6.22.6
0x30是ov9650的i2c地址
找地址,得用电路图。
还有,linux下的i2c驱动,应该可以直接作为参考把
这个问题解决了。。。。
写个ov9650的驱动。。注册为i2c从设备。。在内核启动的时候就能对ov9650的寄存器进行赋值。。
但是现在遇到个新问题:读寄存器得到的pid是0x34,而正确应该是0x96,现在可以确定的是0x34的确是从ov9650的0x0a的寄存器上读出的值(拔下摄像头后不能读到此值),请问现在是不是时钟的问题么?如果是时钟问题,该如何设置摄像头时钟PCLK和供给摄像头的时钟mclk??
在分别读0x1d 0x1c 0x0a 0x0b时出现
mid h : 0x9e
s3c2440-i2c s3c2440-i2c: cannot get bus (error -110)
s3c2440-i2c s3c2440-i2c: cannot get bus (error -110)
意思是读取超时,而且每次启动读出的寄存器的值都不同,求问这是i2c总线出的问题么????
我正想做ov9650的驱动,不知道怎么做了,能不能分析下v4l2的框架,最好整点资料。谢谢各位了
例子很多