Camera IIC总线
- 该文章写于2016年,一直未发表。近期工作中又涉及到了Camera相关的内容,重新温习了下相关知识。决定把这篇文章发表出来,大家共同学习。
IIC即Inter-Integrated Circuit:集成电路总线,有时简写为I2C,是飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线。,IIC是一种多向控制总线,多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。IIC协议标准规定同一时刻只可以有一个设备发起通信,称为主设备(Master),主设备发起一次通信后,其它设备均为从设备(Slave)。IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用两条信号线“serial data”(SDA) 和“serial clock” (SCL)。IIC通信是一种广播式通信,挂在IIC总线上的从设备都可以收到主设备发起的通信请求,为将通信只指向某个设备,给每个从设备取一个名字即IIC地址,通信之前先发送IIC地址,只有对应IIC地址的从设备才会响应回答,其它从设备会将信息忽略掉不作响应。就如同对着人群里喊“张三,找你有事”,只有叫张三的人会回答“找我什么事”,喊话的人便是主设备,人群里的人都是从设备,张三是某从设备的IIC地址,当然如果人群里多个叫张三的人,就都会回答,便不知道找的该是哪个张三了,为解决此问题,可以给每个叫张三的人安装一个开关,只有开关打开了才可以开口说话,这样便可以实现只有一个张三回话了。即IIC总线上的从设备可以有相同的IIC地址,但同一时刻只允许有一个从设备处在工作活跃态对通信请求作出回答响应。
按IIC协议规定,每一个IIC设备都有一个唯一的7位设备地址,即IIC地址,用一个字节的高7位来表示,最低位bit[0]是读写标志位,“0”表示“写”操作;“1”表示“读”操作。某些Sensor资料给出的8位全地址,有的给出的是7位半地址,有些平台注册IIC时注册的是8位全地址,有的注册的是7未半地址,调试的时候一定要注意。
IIC总线只有两根信号线,一根双向数据线SDA,,一根时钟线SCL。连接到总线输出端时的各设备漏极开路(OD)输出或集电极开路(OC)输出,IIC总线必须要接上拉电源,上拉电阻一般采用2.2KΩ、4.7KΩ或10KΩ,上拉电阻越小,IIC驱动电流越大,上拉电源接与IO电压域同电平的电源,一般直接接DOVDD。IIC总线空闲时,因各设备都是开漏输出,上拉电阻使SDA和SCL线都保持高电平。只有在数据传输时,才由主设备、或从设备拉低为低电平。主设备控制了总线的运行(数据传输),即启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号,主设备一般是微控制器(主控);从设备接收到信号后,能够拉低SDA予以回应(ACK信号),或者将数据通过SDA发送给主设备,所以SDA是双向数据线,从设备一般是外围IC,如感光芯片、G-Sensor、Memory等。
在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件(见图4.2-3):当SCL保持“高”时,SDA由“高”变为“低”为开始条件;当SCL保持“高”且SDA由“低”变为“高”时为停止条件。开始和停止条件均由主设备产生。
IIC总线标准规定SDA线的数据转换必须在SCL线的低电平期,在SCL线的高电平期,SDA线的上数据是稳定的。IIC总线通信过程大概如下:首先,主设备发起一个START信号,通知从设备开始监听总线准备接受数据,接着,主设备发送一个7位设备地址加一位的读写操作的数据帧,然后SDA从输出切换为输入,等待从设备的回应,当从设备接收数据后,比对自己的地址是否目标设备。如果比对不符,SDA保持高电平,设备进入等待状态,等待STOP信号的来临;如果比对相符,从设备会把SDA拉低,给主设备发送一个ACKNOWLEDGE应答信号作为回应。输出到SDA线上的数据帧大小为8位的字节,每次传输的字节不受限制,但每个字节后必须要有一个应答ACK信号,数据传输完成后,主设备必须发送一个STOP信号给从设备,通知本次通信结束,从而使从设备释放总线,如图4.2-4。如果从设备在完成其他功能前不能接收数据的完整字节时,它可以保持时钟线SCL为低,以促使主设备进入等待状态;当从设备准备好接收数据的其它字节并释放时钟SCL后,数据传输继续进行。IIC总线速率在标准模式下可达100kbps,快速模式下可达400kbps。
Camera使用的SCCB(Serial Camera Control Bus)接口和IIC是相同的协议,由omnivision开发,SIO_C相当于IIC的SCL时钟线,SIO_D相当于IIC的SDA数据线。它支持只支持100Kbps或400Kbps的传输速率。SCCB总线时序与I2C基本相同,它的响应信号ACK被称为一个传输单元的第9位,分为A和NA。A位由从机产生;NA位由主机产生,NA位必须为高电平。另外,在SCCB的读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件,重新开始,不然在发送读命令时,从机将不能产生A响应信号。读写过程如下,绿色表示数据流向是主设备到从设备,白色是从设备到主设备。
如果Register Address是16bit双字节的,发送顺序为:Register Address [15:8]、A、Register Address [7:0]、A。
Camera Control Instance(CCI)是IIC的一种快速模式,INCLK频率可达到11.4~27MHz,数据传输协议同IIC标准一样。CCI支持寄存器的连续读写,即发送一个寄存器地址读写操作完成后,寄存器地址会自动增加,指向下一个寄存器,不需要重新发送寄存器地址,只发送数据即可,如下,这样可以大大提高寄存器的读写速度,特别在初始化寄存器较多时,可以提高打开摄像头的速度。
下图4.2-5是示波器抓的IIC读操作的波形,从波形里可以解读出:Slave Wrtire Address=0x42,Slave Read Address=0x43,Register Address=0xf1,读出的数据Data=0x69。从左往右依次为:Start、0x42、ACK、0xf1、ACK,Stop、Start、0x43、ACK、0x69、NACK、Stop。符合上面我们讲的读寄存器的流程。