SCCB协议理解及实现

前记:
  众说周知,SCCB协议与IIC协议十分相似,不过IIC是PHILIPS的专利,所以OmnVision在IIC的基础上做了点小改动,然后你懂的。SCCB最主要是阉割了IIC的连续读写的功能,即每读写完一个字节就主机必须发送一个NA信号。

SCCB简介

  SCCB是欧姆尼图像技术公司(OmniVision)开发的一种总线,并广泛的应用于OV系列图像传感器上,所以一般使用OV的图像传感器都离不开SCCB总线协议。
  可以通俗地讲SCCB有两种工作模式,一主多从,一主一从模式。

  1. 一主机多从机 也即3线操作:(通过控制使能端SCCB_E控制选中的从机)
    在这里插入图片描述
  2. 一主一从 也即2线操作:(默认SCCB_E被拉低)
    在这里插入图片描述

管脚定义

可与IIC对比来看

SCCBIIC方向描述
SIO_E\主机发出低电平有效,总线空闲时主机驱动此引脚为1,驱动为0时表示开始传输或者挂起模式
SIO_CSCL主机发出总线空闲时主机驱动此引脚为1;
当驱动SIO_E为0时,主机驱动此引脚为0或1;当挂起时主机驱动SIO_C为0;
SIO_D只能在SIO_C为0时发生变化。
SIO_DSDA双向传输当总线空闲时保持浮动,状态不固定(0、1或高阻态)
相当于数据位!

SCCB时序

  1. SCCB_E为低电平时传输有效,SIO_C为高电平时SIO_D读取数据(SIO_C为低电平时SIO_D改变)

在这里插入图片描述

  1. 开始传输的时序

在这里插入图片描述
tPRC>=15ns
tPRA>=2.5ns
2线操作的代码实现

void SCCB_Start(void)
{
	SCCB_SDA_OUT();		//数据线为输出模式
	SCCB_SDA=1;			//数据线高电平
	delay_us(50);
	
	SCCB_SCL=1;			//在时钟高的时候数据线由高至低
	delay_us(50);
	
	SCCB_SDA=0;
	delay_us(50);
	
	SCCB_SCL=0;			//数据线恢复低电平,单操作函数必要
	delay_us(50);
}
  1. 结束传输的时序

在这里插入图片描述
tPSC>=15ns
tPSA>=0ns
2线操作的代码实现

void SCCB_Stop(void)
{
	SCCB_SDA_OUT();		//数据线为输出模式
	SCCB_SDA=0;			//数据线低电平
	delay_us(50);
	
	SCCB_SCL=1;
	delay_us(50);
	
	SCCB_SDA=1;
	delay_us(50);
}
  1. 产生NA时序(用于读数据)

在这里插入图片描述

//SCCB_D先拉高,再把SCCB_C拉高,后把SCCB_C拉低,最后把SCCB_D拉低
void SCCB_NA(void)
{
	SCCB_SDA_OUT();
	SCCB_SDA=1;
	delay_us(50);
	
	SCCB_SCL=1;
	delay_us(50);
	
	SCCB_SCL=0;
	delay_us(50);
	
	SCCB_SDA=0;
	delay_us(50);
}

读\写时序

  1. 读时序
    在这里插入图片描述
u8 SCCB_RD_Byte(void)
{
	u8 read,j;
	read=0x00;
	
	SCCB_SDA_IN();			//设置SDA为输入
	delay_us(50);
	for(j=8;j>0;j--)
	{
		delay_us(50);
		SCCB_SCL=1;
		
		read=read<<1;			
		if(SCCB_READ_SDA) read++;		//左移一位,若读取到高电平 read相应位写1
		
		delay_us(50);
		SCCB_SCL=0;
	}
	
	SCCB_SDA_OUT();
	return (read);
}
  1. 写时序
    在这里插入图片描述
u8 SCCB_WR_Byte(u8 dat)
{
	u8 temp=0,j;
	
	for(j=0;j<8;j++)
	{
		if((dat<<j)&0x80)	//高位先发送
		{
			SCCB_SDA=1;
		}
		else	
		{
			SCCB_SDA=0;
		}
		delay_us(50);
		SCCB_SCL=1;			//高电平时写入
		delay_us(50);
		SCCB_SCL=0;			//低电平时 改变SDA
	}
	
	SCCB_SDA_IN();			//设置SDA为输入
	delay_us(50);
	SCCB_SCL=1;				//高电平时读取第九位,以判断是否发送成功
	delay_us(50);
	if(SCCB_READ_SDA)		//SDA=1 发送失败
	{
		temp=1;
	}
	else
	{
		temp=0;						
	}
	SCCB_SCL=0;				//写完字节后 SCL拉低 方便继续操作
	SCCB_SDA_OUT();			//设置SDA为输出
	return (temp);
}

传输规则

  1. 写寄存器值
    在这里插入图片描述
    写寄存器分三个阶段:写器件地址,写寄存器地址,写数据
u8 SCCB_WR_Reg(u8 reg, u8 data)
{
	u8 res=0;
	SCCB_Start();						//启动SCCB传输
	
	if(SCCB_WR_Byte(SCCB_ID))	res=1;	//写器件地址 失败返回1
	delay_us(100);
	
	if(SCCB_WR_Byte(reg)) res=1;		//写寄存器地址 失败返回1
	delay_us(100);
	
	if(SCCB_WR_Byte(data)) res=1;		//写数据	  失败返回1
	SCCB_Stop();						//停止
	
	return(res);
}
  1. 读寄存器值
    在这里插入图片描述
    在这里插入图片描述

读寄存器分两次两个阶段

  • 写器件地址,写要读的寄存器地址
  • 写器件地址+1(表示读命令),读取数据,最后在发送NA信号
u8 SCCB_RD_Reg(u8 reg)
{
	u8 val=0;
	SCCB_Start();				//启动SCCB传输
	
	SCCB_WR_Byte(SCCB_ID);		//写器件ID
	delay_us(100);
	
	SCCB_WR_Byte(reg);			//写寄存器地址
	delay_us(100);
	
	SCCB_Stop();
	delay_us(100);
	
	SCCB_Start();				//设置完寄存器后才是读
	SCCB_WR_Byte(SCCB_ID|0x01);	//发送读命令
	delay_us(100);
	
	val=SCCB_RD_Byte();			//读取命令
	SCCB_NA();					//发送NA信号
	SCCB_Stop();
	return(val);
}

后记:
  学习SCCB协议主要还是为了配合OV的图像传感器食用的,顺道巩固一下IIC协议。第一次写文章,有疏漏的地方也请指出,谢谢啦!
  下期出个OV7670的调试文章,调了三四天,能实现缩放,调分辨率,RGB565,YUV输出。觉得有帮助的评论一下,或有疑问的我们一起探讨撒!

  • 50
    点赞
  • 222
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
1、SCCB协议简述 SCCB协议有两线也有三线,两线为SIO_C与SIO_D,三线为SIO_E、SIO_C与SIO_D。 2线的SCCB总线只能是一个主器件对一个从器件控制,但3线SCCB接口可以对多个从器件控制,因此当只有一个从机(slave device)时用两线,有多个从机时用三线。 其中SIO_C只能由主机配置(FPGA),SIO_D是一个三态门,双向数据线,既可以由主机控制,也可以由从机控制。 2、数据传输 当写数据到从机被定义为写传输(write transmission),当从机中读数据被定义为读传输 (read transmission),每一个传输都要有开始和结束来释放总线(start + sotp) 完整的数据传输包括两个或三个阶段,每一个阶段包含9位数据,其中高8位为所要传输的数据,最低位根据器件所处情况有不同的取值: 总结如下: 每一个阶段组成:8位数据+don't care/NA 如果是主机发送数据,即进行写操作,第九位就为don't care 如果是从机发送数据,即为读操作,第九位就为NA. 在进行主器件写操作时,全部阶段的最低位均是Don’t care bit 在进行主器件读操作时,第一阶段的最低位是自由位,第二阶段的最低位为NA,请结合第三部分好好理解 3、SCCB的读写操作 写操作是三个阶段构成一个传输的写,每一阶段都是9位,具体如下 ID地址(7位ID地址+1位读写控制+don't care) + 要写的寄存器地址(8位寄存器地址+don't care) +要写入的数据(8位数据+don't care) 要强调的是ID地址,写为8'h42,读为8'h42 , 8'h42即ID地址的读写控制位为0,8'h43即ID地址的读写控制位为1 总结为: start + ID地址(42)+ 寄存器地址 + 数据 + stop

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值