本文主要包含以下几部分内容:
1. 通过OV7725分析模块原理图。
2. 讲解部分寄存器的含义、RGB565格式图像输出时序、帧率计算。
3. 讲解SCCB协议与I2C协议的区别。
1、OV7725功能
OV7725是一款1/4英寸单芯片图像传感器,其感光阵列达到640*480,能实现最快 60fps 分辨率的图像采集。传感器内部集成了图像处理功能,包括自动曝光控制(AEC)、自动增益控制(AGC)和自动白平衡(AWB)等。同时传感器具有较高的感光灵敏度,适合低照度的应用,下图为OV7725的功能框图。
感光阵列(image array)在XCLK时钟的驱动下进行图像采样,输出640*480阵列的模拟数据;接着模拟信号处理器在时序发生器(video timing generator)的控制下对模拟数据进行算法处理(analog processing)。
模拟数据处理完成后分成 G(绿色)、 R(红色)、B(蓝色)三路通道经过AD转换器后转换成数字信号,并且通过DSP进行相关图像处理,最终输出所配置格式的10位视频数据流,如果需要使用RGB565格式输出,那么只有高8位的数据有效。
其中测试模块(test pattern generator)是用来进行彩条测试之类的,可以通过配置寄存器来启用这个模式,测试数据通路。
模拟信号处理以及DSP等都可以通过寄存器(registers)来配置,配置寄存器的接口就是SCCB接口,该接口协议是阉割版的I2C协议。
下表是OV7725的管脚含义的介绍,没有列出电源和接地相关引脚。
管脚 | I/O | 含义 |
---|---|---|
PWDN | I | 掉电模式,0:正常模式,1:掉电模式。 |
RSTB | I | 系统复位,低电平有效。 |
VREFH | I | 参考电压,通过0.1uF电容接地。 |
VREFN | I | 参考电压,通过0.1uF电容接地。 |
FSIN | I | 帧同步输入。 |
VSYNC | O | 场同步输出。 |
HREF | O | 像素有效指示信号。 |
XCLK | I | 系统时钟输入。 |
PCLK | O | 像素时钟输出。 |
SCL | I | SCCB接口时钟输入。 |
SDA | I/O | SCCB接口双向数据线。 |
D0~D9 | O | 十位像素数据输出,D[9:2]用于8位YUV或RGB 565/RGB 555格式。 |
下图是OV7725模块的原理图,其中RESET引脚通过4.3K电阻上拉到VCC,并且通过一个0.1uF电容降低抖动。而PWDN引脚通过4.3K电阻下拉到地。也就是说该模块没有掉电模式和复位操作。
其余的XCLK、PCLK、VSYNC、HREF、D9~D0均引出,XCLK是需要外部提供给OV7725的系统时钟,该时钟输入OV7725之后,可以经过内部锁相环和寄存器配置生成PCLK,然后像素数据D9~D0在PCLK的下降沿输出数据,FPGA就可以在PCLK上升沿采集D9~D0的数据。场同步VSYNC的高电平表示传输一帧数据,HREF位高电平时表示D9~D0的数据有效。
而OV7725内部锁相环的倍频系数、输出像素的大小、自动曝光、自动增益等都可以通过SCCB接口进行配置。
最终多数模块引出的引脚如下所示,由于大多使用RGB565格式输出数据,因此像素信号只需要输出D9~D28位即可。CMOS_CTL这些保留信号暂时不考虑。
2、寄存器
OV7725内部包含171个寄存器,每个寄存器有8位数据,寄存器的数目还是比较多的。而且很多寄存器与图像有关,对于我们不是专业研究图像的人来说,并不能很好的理解这些参数。本文只简单分析几个会经常用到的寄存器,如果需要其余寄存器可以通过数据手册自己查看。
地址为0x12寄存器,该寄存器的bit7为1时,复位所有寄存器,发出该命令后,需要至少延迟1ms才能配置其余寄存器。
而bit1~0用于选择图像输出格式,为2’b00时输出YUV格式,为2’b01时输出Processed Bayer RAW格式,为2’b10时输出RGB格式,为2’b11时输出Bayer RAW格式。
当输出RGB格式时,需要通过bit3~2确定具体的RGB格式,2’b00输出RGB422,2‘b01输出RGB565,2’b10输出RGB555,2’b11输出RGB444格式的图像数据。
OV7725的XCLK生成PCLK的频率公式为:finternal clock = finput clock × PLL multiplier / [(CLKRC[5:0] + 1) × 2]。其中finternal clock为PCLK频率,finput clock为XCLK的频率。
PLL multiplier由地址为0x0D寄存器的bit7和bit6决定。如果为2’b00则PLL multiplier为1,如果为2’b01则PLL multiplier为4,如果为2’b10则PLL multiplier为6,如果为2’b11则PLL multiplier为8。
CLKRC[5:0]是地址为0x11寄存器的低6位数据,如果输入XCLK为12MHz,PLL 倍频设为4倍,CLKRC[5:0]设置为0,则可以得到PCLK为24MHz。
如何设置输出图像尺寸呢?
首先可以通过地址为0x18的bit7~0和0x32的bit1~0设置输出图像数据的水平像素个数。由于OV7725水平像素最大支持640,所以需要10位二进制数据才能表示,一个寄存器只有8位数据,需要两个寄存器才能存储10位数据。
地址为0x1A的bit7~0和0x32的bit2设置输出图像数据的垂直像素点个数,OV7725垂直像素最大支持480,需要9位二进制数据才能表示,因此需要两个寄存器进行存储。
其余寄存器还有很多,这里就简要介绍这几个重要的,其余的可以通过官方通过的初始化参数进行设置。
3、RGB565格式
OV7725输出RGB565格式的图像数据时序如下图所示,由于数据线只有8位,而每个像素点包含16位数据,因此需要两个PCLK时钟才能输出1个像素数据。
第一PCLK时钟下降沿输出5位红色像素和3位绿色像素数据,第二个PCLK时钟下降沿输出3位绿色像素和5位蓝色像素数据,两个时钟传输的数据拼接为一个像素点的数据。
由于OV7725在PCLK下降沿输出数据,那么FPGA就可以在PCLK的上升沿采集数据线D[9:2]上的数据。
下图是VGA输出640*480像素的时序图,本次使用的是HREF信号,没有使用HSYNC信号。注意下图中tp表示传输1个像素数据的时钟,经过上述分析可知,在传输RGB565格式的数据时tp=2*PCLK。
HREF信号为高电平表示D[9:2]传输的数据是有效的,每次连续输出1行像素数据,因此上图中HREF信号每次拉高时间为640tp。由于显示前沿、后沿等东西的存在,每次传输完一行图像数据之后,需要拉低144tp才能在次传输下一行图像数据。因此传输一行数据的时间为640tp+144tp=784tp,将传输一行数据消耗的时间称为tLINE,因此tLINE=784tp。
场同步信号VSYNC拉高表示一帧数据传输的开始,因为显示前沿、后沿这些东西的存在,需要等一段时间HREF才会拉高输出有效像素数据。传输一帧图像数据需要510tLINE。
因此可以计算出传输一帧图像数据所需要的时钟个数为510tLINE=510*784tp=510*784*2*tpclk=799680*tpclk。
当PCLK时钟频率为24MHz时,则帧率为24M/799680≈30.012Hz,所以说当PCLK为24MHz时,每秒可以输出30张图片。PCLK为48MHz时,可以输出60帧的图像数据。
下图是时钟和复位的一些说明,PCLK最小为10MHz,最大为48MHz,即最大支持60帧640*480的图像输出。当复位后,需要等待1ms,配置寄存器之后,需要等待10帧数据输出的时间,输出的图像数据才会稳定。
一般最常用的就是RGB565格式,关于RGB565格式本文就介绍这么多,该接口常被称为DVP接口,后文直接使用FPGA实现数据采集。
4、SCCB时序
最后在讲解一下SCCB(Serial Camera Control Bus)协议的相关内容,该协议是OmniVision公司参考I2C协议为自家的图像传感器提出的接口协议。可以通过百度直接获取手册,据说厂家这么做是为了规避 I2C 总线的版权,手册里关于协议的描述采用三相写、两相写来对读写时序进行描述,搞得反而不好理解。
一般有三线和两线的两种连接方式,一般的传感器为了节省引脚,都将SCCB_E直接拉高处理了,只引出了SIO_C和SIO_D两个引脚。
下面是SCCB的写时序,与I2C的写时序基本一致,首先发送器件地址,然后发送寄存器地址,最后发送写入数据,OV7725的器件地址为7’h21。
需要注意SCCB的应答位为X,表示不应答,含义就是从机可能不会对主机的指令做出应答,但是这段时间主机依旧要释放总线。即主机不需要检测从机是否应答,只需要传输对应的数据即可。
因此SCCB的写时序可以直接使用I2C的写时序,不用关心输出的应答信号即可。
下图是SCCB的读时序,区别在于虚写完成时,由于SCCB没有重复起始位的功能,必须先发送停止位,之后才能发送起始位进行读操作。
因此I2C和SCCB协议有两个区别,第一SCCB的从机可能不会应答主机,主机也不需要去检测从机的应答位。第二就是SCCB在读操作时,发送完虚写之后,需要发送停止位,才能发送起始位读出数据。第三SCCB不支持连续地址读、写操作。
对于OV7725来说,一般只会通过写操作来配置其寄存器,不会使用读操作。因此在初始化OV7725寄存器时,完全可以使用I2C协议代替SCCB协议,因为不会使用读操作,所以不需要修改I2C读时序。
其余起始位、停止位均与I2C时序一致,可以查看前文I2C协议的详解。
最后注意有的原理图上SDA数据线上可能会串接电阻,这是为了在主机和从机争夺总线时,减小总线电流。
如下图所示,当主机输出高电平,从机输出低电平时,电流会从主机的VCC通过电阻直接到从机的GND,如果没有电阻,由于MOS管导通电阻一般很小,可能导致电流很大,烧毁器件吧。
下图是SCCB接口时序,为了了解相关时序参数,需要查看该图。
上图配合下表即可得知OV7725对SCCB协议相关要求,首先得知SCL最大频率为400KHz,没有最低频率的要求。
由于SCL频率较低,且数据均在SCL低电平的时候传输,所以数据相关的建立时间和保持时间一般是不会出现问题的。
由于使用FPGA,两次读、写操作的间隔时间可以达到系统时钟周期的(10ns)级别,所以需要关注一些OV7725对于两次SCCB操作的间隔时间要求。tBUF在上图可以看出是停止位和起始位之间的间隔,下表规定该时间必须大于1.3us。
前文写I2C时序代码时,起始位和停止位间隔时间大致是半个SCL周期,如果SCL为200KHz,那么半个SCL周期时间为2.5us,大于1.3us,不需要额外增加延时,当模块空闲即可开始下一次读写操作。
如果SCL频率为400KHz,半个SCL周期时间为1.25us,小于1.3us,可能需要增加额外延时。此处是针对我前文写的I2C模块进行分析的,如果不使用该模块可以忽略。
本文相关内容到此结束了,需要SCCB手册或者OV7725手册的在后台恢复“OV7725手册“(不包括引号)即可。建议看I2C手册,描述比SCCB简单多了,SCCB手册绕了一大圈,还是讲的相同问题。
如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!
如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!