赞
踩
本文主要参考了两种协议的规范文档和一个摄像头传感器(OV7725)的数据手册,文档链接如下:
IIC规范:UM10204
SCCB规范:SCCBSpec_AN
OV7725数据手册:OV7725
之所以写这篇文章,是因为我在使用SCCB接口控制的摄像头时,看到有的人说SCCB和IIC是兼容的,也有的人说它们有区别,但区别不大。网上众说风云,让我感觉很迷糊,所以在这里总结一下。
IIC接口有比较广泛的应用,而SCCB接口主要用于摄像头控制,可以说SCCB是低配版的IIC。因为IIC可以实现多主多从,IIC规范文档中有提到多主机的时钟同步、总线仲裁功能。而SCCB的文档中则没有这部分内容,因为一般来说都是单个主机控制多个摄像头,只有一主多从的功能。除此之外,SCCB和IIC的数据格式也有一点区别,这部分在后面详述。
IIC | SCCB |
---|---|
SCL、SDA | SCCB_E、SIO_C、SIO_D、PWDN |
IIC只有两根信号线,SCCB的SIO_C、SIO_D和IIC的SCL、SDA分别对应,SCCB额外还有SCCB_E和PWDN两根控制线,这个影响不大。
SDA和SCL都是需要靠电阻上拉的,硬件设计上需要注意这一点。IIC的Ultra-Fast模式下,能够达到5MHz的传输速率,这时在硬件上,IIC采用的是推挽输出,为了进行区分,相应的信号称为USDA和USCL,仅在这时是不需要上拉电阻的。
SCCB如果要实现一主多从的话,需要用三根线,除了SIO_C和SIO_D,还有一根SCCB_E。而如果仅控制一个摄像头,那么可以只用两根线SIO_C和SIO_D。手册第5页1.1节有写。
IIC和SCCB的时序可以分解为三个部分,分别是启动信号,数据传输和停止信号。
在IIC手册的48页和50页有具体的时序参数和波形图,SCCB的具体时序参数在规范中没有提及,但是在OV7725手册的第6页有相关的参数。经过比对可以发现,SCCB的时序参数和Fast-mode的IIC是一样的。
主要有这几点要求:
SCCB的数据传输格式在手册中的3.2节有介绍。所谓数据传输的格式就是在一个启动信号和停止信号之间的内容,每一次传输作为一个传输周期。SCCB接口主要实现目的寄存器的读写功能。有三种基本操作,分别是“3-Phase Write”、“2-Phase Write”和“2-Phase Read”
这里的IP address类似IIC的从机地址;sub-address是从机内的寄存器地址,也就是摄像头的一些控制寄存器的地址;最后就是要写入该寄存器的数据。
与3-Phase Write相比,2-Phase Write只是确定了要访问的寄存器,但是没有往里面写数据。2-Phase Write后一定会有一个2-Phase Read,两者一起构成一个完整的读操作。
2-Phase Read即读取目标寄存器的数据,它的前面一定要有一个3-Phase Write或者2-Phase Write用来明确目的寄存器的地址。
用IIC的驱动函数实现SCCB的读写时需要注意两点:
打开Vivado菜单栏中的Tools -> Language Template,搜索IOBUF,即可找到用于实例化IOBUF的原语。
IOBUF实际上就是这样一个三态门,它有一个使能控制端,高电平时输出变为高阻,这里的sda_t和sda_o可以连起来作为同一个线网。因为当我们想输出高电平时,可以让三态门变为高阻,输出会靠上拉电阻拉高。
具体使用时,定义
input wire sda_i,
output wire sda_o,
output wire sda_t
用于逻辑设计,另外在顶层模块中定义inout sda,用IOBUF原语实例化。
IOBUF IOBUF_inst (
.O(sda_i), // 1-bit output: Buffer output
.I(sda_o), // 1-bit input: Buffer input
.IO(sda), // 1-bit inout: Buffer inout (connect directly to top-level port)
.T(sda_t) // 1-bit input: 3-state enable input
);
分别定义sda_i,sda_o和sda_t后,进行逻辑设计,并打包成一个IP,将这些信号放到同一个interface里即可。
这里实现的是IIC协议的接口,把scl和sda都做成了能够输入和输出。在命名上分别以“_o”、“_i”、“_t”结尾,在一个block design中调用自己设计的IP,并且将IIC接口make external,在generate output products之后,设计工具会自动添加IOBUF的原语。
打开Elaborated Design的I/O Ports就可以看到scl和sda两个信号都被实例化为inout的类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。