I2C与OV9650的问题
转:http://www.likeint.com/news_show.asp?id=1319&SonID=139
之前做摄像头方面的测试,现在写一些总结:
原计划使用I2C接OV9650的SCCB接口,SDA接SIO_D,CLK接SIO_C口,由于SCCB和I2C标准协议类似,就可以用标准的I2C协议中的函数直接对OV9650中的寄存器进行配置,比较简单。就没有考虑其他的内容,后来发现这个思路行不通。
把摄像头接到I2C总线上后,就使用Iprobe命令探测I2C设备,结果没有发现摄像头,然后用示波器检测各个引脚的电压,发现电压均正常,但是没有时钟输入信号,后来查阅手册,发现摄像头的时钟由CSI控制,在CSI的寄存器中,有一位专门负责打开与关闭输出时钟,默认情况下,设置为关闭,将这一位设置为打开。然后用Iprobe命令探测,结果出现了摄像头的设备号,为30。
然后用I2C的读写命令操作摄像头的寄存器,结果失败,经过几天的网上搜索,原来是SCCB与I2C标准协议有微小的差别,就是这个微小的差别,导致不能用标准的I2C协议读写OV9650的寄存器。
差别如下:
OV79650控制采用SCCB(SeriaI Camera ControlBus)协议。SCCB是简化I2C协议,SIO-l是串行时钟输入线,SIO-O是串行双向数据线,分别相当于I2C协议SCL和SDA。SCCB总线时序与I2C基本相同,它响应信号ACK被称为一个传输单元第9位,分为Don’t care和NA。Don’t care位由从机产生;NA位由主机产生,由于SCCB不支持多字节读写,NA位必须为高电平。另外,SCCB没有重复起始概念,因此在SCCB读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件。不然在发送读命令时,从机将不能产生Don’t care响应信号。
由于I2C和SCCB一些细微差别,所以采用GPIO模拟SCCB总线方式。SCL所连接引脚始终设为输出方式,而SDA所连接引脚在数据传输过程中,通过设置IODIR值,动态改变引脚输入/输出方式。SCCB写周期直接使用I2C总线协议写周期时序;而SC-CB读周期,则增加一个。
另外,SCCB的地址位为8位,即第60,61分别为读写位,但I2C协议地址为7位,所以检索到的地址是30。
网上大部分采用GPIO模拟I2C协议,由于使用标准的I2C协议行不通,只好换用GPIO模拟I2C协议。
posted on 2012-03-31 00:00 CrazyBingo 阅读(5577) 评论(1) 编辑 收藏 举报