【连载6.2.1.2】SCCB(I2C)初始化时序介绍
0赞万事开头难……
在正式开始OV7725视频采集实现之前,Bingo不得不先讲解一下OV7725的寄存器配置接口。OV7725上电会默认输出YUV422格式的视频流,但我们希望传感器能够按照我们预期的模式工作,我们需要配置分辨率,配置内部时钟,配置亮度、色差、3A参数等。因此我们需要一个接口,来完成OV7725寄存器的配置——这就是SCCB接口,即Serial Camera Control Bus,串行相机控制总线。
OV7725的SCCB总线,实际上就是我们常用的I2C通信总线,这在前文已经提到过,只不过OmniVision针对Camera的控制,专门提供了一个术语。OV7725的SCCB接口有两个信号,即时钟信号SCL、数据信号SDA。OV7725通过这两个信号,完成寄存器的配置,实现预期配置的视频流输出。
Bingo曾在2012年的时候写过《从零开始走进OV7670世界》,详细的介绍了OV7725的SSCB(I2C)接口的HDL初始化,介绍了CMOS视频数据的采集,同时介绍了YUV2RGB等内容。由于OV7760与OV7725属于OmniVision的同系列数字相机,驱动方式与时序完全一样,因此SCCB总线的初始化可以参照该手册。I2C/SCCB总线制方式简单,器件封装形式小,主要有一下几个特点:
(1) I2C总线只需要两条总线:一条串行数据线SDA,一条串行时钟线SCL
(2) I2C总线不需要片选就可以实现多个设备的链接,并且通过从机为唯一地址识别器件,通过地址的响应,完成每一个器件的配置
(3) I2C是一个真正的多主机总线,如果多个主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏
(4) 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s
(5) 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制
官方手册给出了SCCB总线8Bit数据串行发送的时序图,如下图所示(其中SCCB_E作为I2C的使能信号,类似于SPI总线的CS信号,这里我们不需要关心):
SCCB总线通过串行方式发送8Bit数据,先发送MSB,再发送LSB,与SPI总线协议的数据发送很类似(除了不需要SPI_CS)。在发送完8Bit数据后,通过器件的响应信号,完成一次数据的传输。
很久前在《从零开始走进OV7670世界》中,Bingo移植并优化了Terasic的I2C控制器;但是可读性和bug实在太多,因此后面花了九牛二虎之力,自己大淘了一套I2C读写代码,每一个代码都经过苛刻的追求,无数次Modelsim+CMOS测试(虽然完美是没有极限的)。在没个Sensor采集工程中的cmos_i2c_oVxxxx,均可找到i2c_timing_ctrl.v文件,该模块完整的描述了I2C时序,实现了CMOS Sensor的SCCB寄存器读写功能。详情请仔细分析i2c_timing_ctrl.v文件,Bingo在状态机的基础上完美的实现了I2C总线时序的封装,接口及例化如下所示:
从接口例化中可见,Bingo还额外的为OV7725 SCCB初始化配套的设计了寄存器接口,如下表所示(部分参照了Terasic的代码):