SCCB与IIC的异同及FPGA实现的注意事项

本文主要参考了两种协议的规范文档和一个摄像头传感器(OV7725)的数据手册,文档链接如下:
IIC规范:UM10204
SCCB规范:SCCBSpec_AN
OV7725数据手册:OV7725

1. 概述

之所以写这篇文章,是因为我在使用SCCB接口控制的摄像头时,看到有的人说SCCB和IIC是兼容的,也有的人说它们有区别,但区别不大。网上众说风云,让我感觉很迷糊,所以在这里总结一下。
IIC接口有比较广泛的应用,而SCCB接口主要用于摄像头控制,可以说SCCB是低配版的IIC。因为IIC可以实现多主多从,IIC规范文档中有提到多主机的时钟同步、总线仲裁功能。而SCCB的文档中则没有这部分内容,因为一般来说都是单个主机控制多个摄像头,只有一主多从的功能。除此之外,SCCB和IIC的数据格式也有一点区别,这部分在后面详述。

2. 信号线

IICSCCB
SCL、SDASCCB_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节有写。

3. 时序

IIC和SCCB的时序可以分解为三个部分,分别是启动信号,数据传输和停止信号。

  • 启动信号就是在SCL为高电平的时候,SDA由高电平转变为低电平
  • 数据传输就是在启动信号和停止信号之间,SCL为高电平的时候,SDA上的数据不能发生变化,这也是数据有效的条件
  • 停止信号就是在SCL为高电平的时候,SDA由低电平转变为高电平

在IIC手册的48页和50页有具体的时序参数和波形图,SCCB的具体时序参数在规范中没有提及,但是在OV7725手册的第6页有相关的参数。经过比对可以发现,SCCB的时序参数和Fast-mode的IIC是一样的
主要有这几点要求:

  • 最大时钟频率400kHz,高电平时间大于600ns,低电平时间大于1.3us,所以不是占空比50%的方波
  • 对于启动信号和停止信号,我们如果把SDA的跳沿看做触发器的时钟,SCL看做输入触发器的信号,那么SCL的建立时间和保持时间都需要至少有600ns。特殊的,在停止信号之后,再发起启动信号,这两者之间的间隔需要至少有1.3us。
  • 数据的建立时间需要至少有100ns,也就是在数据传输阶段,SCL变成高电平之前,SDA上的数据需要至少稳定100ns。

4. SCCB数据传输格式

SCCB的数据传输格式在手册中的3.2节有介绍。所谓数据传输的格式就是在一个启动信号和停止信号之间的内容,每一次传输作为一个传输周期。SCCB接口主要实现目的寄存器的读写功能。有三种基本操作,分别是“3-Phase Write”、“2-Phase Write”和“2-Phase Read”

4.1 3-Phase Write

3-phase write
这里的IP address类似IIC的从机地址;sub-address是从机内的寄存器地址,也就是摄像头的一些控制寄存器的地址;最后就是要写入该寄存器的数据。

4.2 2-Phase Write

2-phase write
与3-Phase Write相比,2-Phase Write只是确定了要访问的寄存器,但是没有往里面写数据。2-Phase Write后一定会有一个2-Phase Read,两者一起构成一个完整的读操作。

4.3 2-Phase Read

2-phase read
2-Phase Read即读取目标寄存器的数据,它的前面一定要有一个3-Phase Write或者2-Phase Write用来明确目的寄存器的地址。

4.4 一些说明及注意事项

  1. 上面的每个phase都是由主机和从机一同完成的。上面的图片中,每个phase都被划分为两个部分,一部分是8位的数据,另一部分是1位的应答位。当数据是由主机发给从机时,应答位则是由从机发给主机;当数据是从机发给主机时,应答位就是主机发给从机。
  2. 写操作主要都是主机给从机发数据,从机的应答位是“X”,表示不关心,实际测试发现,从机会向主机发送低电平,这样与IIC的标准兼容;2-Phase Read中的phase 2是从机向主机发数据,因此后面的NA应答位是主机发给从机的,为高电平“1”。
  3. IIC规范中有明确地说明应答位ACK或NACK的作用,详见IIC规范的第10页3.1.6。
  4. SCCB能够实现的操作非常有限,仅能用3-Phase Write向目标寄存器写数据或者用3-Phase Write或2-Phase Write和2-Phase Read搭配来读数据。
  5. IIC完全能够实现SCCB的这些操作的,除此之外,IIC还能通过在两次连续的传输之间省去停止信号,采用重新启动的信号来读数据。每次读或者写的数据也不仅限于1个字节,而可以是连续的多个字节。

用IIC的驱动函数实现SCCB的读写时需要注意两点:

  • 写操作不要用restart,而是应该按照SCCB的协议规范,用两对完整的启动停止信号来实现;
  • 注意设备地址是否包含读写控制位,比如OV7725的手册第11页上方写的,“0x42是用来写的地址,0x43时用来读的地址”,这里的0x42和0x43就包含了读写控制位;而有的IIC驱动函数明确地有分读函数和写函数,这时传给这些函数的设备地址就应该传7位的不包含读写控制位的地址。

5. FPGA实现三态门的两种方法

5.1 用IOBUF原语实现

打开Vivado菜单栏中的Tools -> Language Template,搜索IOBUF,即可找到用于实例化IOBUF的原语。
iobuf
IOBUF实际上就是这样一个三态门,它有一个使能控制端,高电平时输出变为高阻,这里的sda_t和sda_o可以连起来作为同一个线网。因为当我们想输出高电平时,可以让三态门变为高阻,输出会靠上拉电阻拉高。
IOBUF
具体使用时,定义

    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
   );

5.2 由设计工具自动识别

分别定义sda_i,sda_o和sda_t后,进行逻辑设计,并打包成一个IP,将这些信号放到同一个interface里即可。
sda
这里实现的是IIC协议的接口,把scl和sda都做成了能够输入和输出。在命名上分别以“_o”、“_i”、“_t”结尾,在一个block design中调用自己设计的IP,并且将IIC接口make external,在generate output products之后,设计工具会自动添加IOBUF的原语。
iic实例化
打开Elaborated Design的I/O Ports就可以看到scl和sda两个信号都被实例化为inout的类型。
scl和sda

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小裘HUST

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值