IIC协议与SCCB协议

本文记录主要因为在OV7725的调节测试中出现对寄存器的不了解以及对通信协议的先后顺序理解不当。

IIC协议  --2019-03-04  20:10PM

 

1、IIC通信组成

I2C总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。

IIC总线上可以挂很多设备:多个主设备,多个从设备(外围 设备)。上图中主设备是两个单片机,剩下的都是从设备。

多主机会产生总线裁决问题。当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线

 

从图中可以知道,每一个设备都具有自己的一个独一无二的地址,一般地址为八位,由前面四位0101固定加上后面的三位自定义和最后一位读写位组成,当也有些

 

是厂商已经固定好的不能再修改的,比如摄像头的0x42,如果修改这列的固定地址的读写位,你只能用 | 符号修改后面的高第八位 如:0x42 | 0x01 

 

 

从图中可以知道,SDA和SCL数据总线总是上拉接上VDD,所以在总线位空闲的时候,两线都是高点平,任何一设备输出低电平都将拉低总线

2、数据的有效性以及时序

             SDA : 由高到低,起始信号

             SDA:由低到高,终止信号

值得注意的一点就是,在主机发送起始信号的时候,总线就处于被占用的状态中,避免其他设备扰乱

 

 

3、数据的传输

它是怎样传输字节的呢?

其实很简单就是主机发一个起始信号(第一个应该为设备的通信地址,第二个为通信寄存器地址,第三个以及终止信号前的才是我们实际的数据)之后就可以传输八位字节数据了,但是第九位为从机返回的起始应答信号(0为应答,1为非应答)

值得注意的是:(1)从机不对主机的寻址信号应答,从机在忙状态,不接受请求,此时主机应该发出停止信号,释放总线空闲并打印请求失败

                                      (2)从机在接受数据过程中如果出现有更高优先级的中断请求,应发出SCL低电平从而使主机处于等待状态

主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,则认为自己正在被主机寻址,根据R/T位将自己确定为发送器和接收器

 

在总线的一次数据传输中,可以有一下几种组合方式:
       (1)、主机向从机发送数据,数据传送方向在整个传递过程中不变:     

 

        (2)、主机在第一个字节后,立即从从机读数据(传输方向不变):

 

        (3)、在传送过程中,当需要改变传递方向时,起始信号和从机地址都被重复一次产生一次,但两次读/写方向位正好相反(也就是说当你使用这个不断地向不同的从机发数据的时候,你要改变的有从机地址以及读写位的改变),在这之后从机自动发回数据。

 

 

 

SCCB协议-- 21:13:28  21:13PM

 其实SCCB就是IIC协议的改版,略有不同,一下会说明其他不同之处。

SCCB(SeriaI Camera ControlBus)是简化的I2C协议,SIO-l是串行时钟输入线,SIO-O是串行双向数据线,分别相当于I2C协议的SCL和SDA。SCCB的总线时序与I2C基本相同,它的响应信号ACK被称为一个传输单元的第9位,分为Don’t care和NA。Don’t care位由从机产生;NA位由主机产生,由于SCCB不支持多字节的读写,NA位必须为高电平。另外,SCCB没有重复起始的概念,因此在SCCB的读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件。不然在发送读命令时,从机将不能产生Don’t care响应信号。

由于I2C和SCCB的一些细微差别,所以采用GPIO模拟SCCB总线的方式。SCL所连接的引脚始终设为输出方式,而SDA所连接的引脚在数据传输过程中,通过设置IODIR的值,动态改变引脚的输入/输出方式。SCCB的写周期直接使用I2C总线协议的写周期时序;而SC-CB的读周期,则增加一个总线停止条件。

SCCB是和I2C相同的一个协议。    SIO_C和SIO_D分别为SCCB总线的时钟线和数据线。目前,SCCB总线通信协议只支持100Kb/s或400Kb/s的传输速度,并且支持两种地址形式:①从设备地址(ID Address,8bit),分为读地址和写地址,高7位用于选中芯片, 第0位是读/写控制位(R/W),决定是对该芯片进行读或写操作;②内部寄存器单元地址(Sub_ Address,8bit),用于决定对内部的哪个寄存器单元进行操作,通常还支持地址单元连续的多字节顺序读写操作。SCCB控制总线功能的实现完全是依靠SIO_C、SIO_D两条总线上电平的状态以及两者之间的相互配合实现的。SCCB总线传输的启动和停止条件如图 


过程:采用简单的三相(Phase)写数据的方式,即在写寄存器的过程中先发送OV7649的ID地址(ID Address),然后发送写数据的目地寄存器地址(Sub_address),最后发送要写入的数据(Write Data),见图3。如果给连续的寄存器写数据,写完一个寄存器后,OV7649会自动把寄存器地址加1,程序可继续向下写,而不需要再次输入ID地址,从而三相写数据变为了两相写数据,由于本系统只需对有限个不连续寄存器进行配置,如果采用对全部寄存器都加以配置这一方法的话,会浪费很多时间和资源,所以我们只对需要更改数据的寄存器进行写数据。对于每一个需更改的寄存器,都采用三相写数据的方法。

 

OV79650控制采用SCCB(SeriaI Camera ControlBus)协议。SCCB是简化I2C协议,SIO-l是串行时钟输入线,SIO-O是串行双向数据线,分别相当于I2C协议SCL和SDA。SCCB总线时序与I2C基本相同,它响应信号ACK被称为一个传输单元第9位,分为Don’t care和NA。Don’t care位由从机产生;NA位由主机产生,由于SCCB不支持多字节读写,NA位必须为高电平。另外,SCCB没有重复起始概念,因此在SCCB读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件。不然在发送读命令时,从机将不能产生Don’t care响应信号。 
由于I2C和SCCB一些细微差别,所以采用GPIO模拟SCCB总线方式。SCL所连接引脚始终设为输出方式,而SDA所连接引脚在数据传输过程中,通过设置IODIR值,动态改变引脚输入/输出方式。SCCB写周期直接使用I2C总线协议写周期时序;而SC-CB读周期,则增加一个。

另外,SCCB的地址位为8位,即第60,61分别为读写位,但I2C协议地址为7位,所以检索到的地址是30。

转载于:https://www.cnblogs.com/cadenBlog-1998/p/10472959.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值