博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I2C与OV9650的问题
阅读量:6453 次
发布时间:2019-06-23

本文共 1093 字,大约阅读时间需要 3 分钟。

转: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协议。

转载于:https://www.cnblogs.com/crazybingo/archive/2012/03/31/2426226.html

你可能感兴趣的文章
FastDFS分布式文件系统nginx模块安装和部署
查看>>
关于JVM CPU资源占用过高的问题排查
查看>>
Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
查看>>
史上最全的maven pom.xml文件教程详解
查看>>
使用Xmanager连接CentOS 7远程桌面
查看>>
java web中使 Browser 不缓存页面的过滤器(Filter - 2)
查看>>
D3在ID中selection.html()获取不到数据
查看>>
Ubuntu 下使用apt-get安装最新版本的MySQL
查看>>
ORACLE数据库日常维护
查看>>
zookeeper分布式锁的原理
查看>>
Highcharts Example
查看>>
TCP/IP详解学习笔记(二)--链路层笔记
查看>>
Maven 标准目录结构
查看>>
(转载)Hive学习笔记--Hive 高级编程
查看>>
创建树上每级节点与叶子节点的映射[PHP]
查看>>
借助Handler,实现ViewPager中页面的自动切换
查看>>
Java 8 中的 Streams API 详解
查看>>
python 元数据和inspect
查看>>
五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
查看>>
uva 548 - Tree
查看>>