i2c驱动的基本问题

发布于 2022-09-18 18:19:11 字数 237 浏览 12 评论 0

请教使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

燃情 2022-09-25 18:19:11

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:记不清了,无法具体回答。

別甾虛僞 2022-09-25 18:19:11

具体来说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

傾旎 2022-09-25 18:19:11

0x30是ov9650的i2c地址

旧时光的容颜 2022-09-25 18:19:11

找地址,得用电路图。
还有,linux下的i2c驱动,应该可以直接作为参考把

神也荒唐 2022-09-25 18:19:11

这个问题解决了。。。。
写个ov9650的驱动。。注册为i2c从设备。。在内核启动的时候就能对ov9650的寄存器进行赋值。。
但是现在遇到个新问题:读寄存器得到的pid是0x34,而正确应该是0x96,现在可以确定的是0x34的确是从ov9650的0x0a的寄存器上读出的值(拔下摄像头后不能读到此值),请问现在是不是时钟的问题么?如果是时钟问题,该如何设置摄像头时钟PCLK和供给摄像头的时钟mclk??

逆光飞翔i 2022-09-25 18:19:11

在分别读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总线出的问题么????

鹿! 2022-09-25 18:19:11

我正想做ov9650的驱动,不知道怎么做了,能不能分析下v4l2的框架,最好整点资料。谢谢各位了

我的影子我的梦 2022-09-25 18:19:11

例子很多

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文