【SCCB接口协议简介(适用于OV系列摄像头)】

2023-11-10

SCCB总线简介

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

SCCB简介
  SCCB是欧姆尼图像技术公司(OmniVision)开发的一种总线,应用于OV系列图像传感器上,所以一般使用OV的图像传感器都离不开SCCB总线协议。
 可以通俗地讲SCCB有两种工作模式,一主多从,一主一从模式。
一主机多从机 也即3线操作:(通过控制使能端SCCB_E控制选中的从机)
在这里插入图片描述
一主一从 也即2线操作:(默认SCCB_E被拉低)

在这里插入图片描述

SCCB时序
SCCB_E(相当于片选信号)为低电平时传输有效,SIO_C为高电平时,SIO_D读取数据(SIO_C为低电平时SIO_D改变)
在这里插入图片描述
开始信号
在这里插入图片描述

开始传输开始于SCCB_E下降沿。在SCCB_E下降沿前,主机必须将SIO_D置1,这样可以避免读取传送之前产生的未知总线状态。
在SCCB_E下降沿之前,SIO_D必须有tPRC时长的高电平,tPRC至少要15ns
tPRA是SCCB_E下降沿之后SIO_D保持高电平的时间,tPRA至少要1.25us
注意:此图为3线图时序
2线操作的代码实现

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

结束信号
在这里插入图片描述
SCCB_E上升沿时表示结束传输,两个时间规定为tPSA和tPSC
tPSC为SCCB_E上升沿之后SIO_D维持高电平的时间,tPSC至少15ns
tPSA为SCCB_E之前SIO_D高电平的时间,tPSA至少0ns
注意:此图为3线图时序
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);
}

产生NA时序(用于读数据)
在这里插入图片描述

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

读时序
在这里插入图片描述

u8 SCCB_RD_Byte(void)
{
	u8 temp=0,j;    
	SCCB_SDA_IN();		//设置SDA为输入  
	for(j=8;j>0;j--) 	//循环8次接收数据
	{		     	  
		delay_us(50);
		SCCB_SCL=1;
		temp=temp<<1;
		if(SCCB_READ_SDA)temp++;   
		delay_us(50);
		SCCB_SCL=0;
	}	
	SCCB_SDA_OUT();		//设置SDA为输出    
	return temp;
} 

写时序
在这里插入图片描述

u8 SCCB_WR_Byte(u8 dat)
{
	u8 j,res;	 
	for(j=0;j<8;j++) //循环8次发送数据
	{
		if(dat&0x80)SCCB_SDA=1;	
		else SCCB_SDA=0;
		dat<<=1;
		delay_us(50);
		SCCB_SCL=1;	
		delay_us(50);
		SCCB_SCL=0;		   
	}			 
	SCCB_SDA_IN();		//设置SDA为输入 
	delay_us(50);
	SCCB_SCL=1;			//接收第九位,以判断是否发送成功
	delay_us(50);
	if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
	else res=0;         //SDA=0发送成功,返回0
	SCCB_SCL=0;		 
	SCCB_SDA_OUT();		//设置SDA为输出    
	return res;  
}	

传输规则

一个基本传输单元称作一个
一个相包含总共9比特,前8比特为数据,第9比特为 Don’t-Care bit (不关心比特),该第9比特的数据取决于传输任务是读还是写如果是写操作则don’t care,如果为读操作为NA。一个传输任务的最大相个数是3。
总结如下:
每一个单元组成:8位数据+don’t care/NA
如果是主机发送数据,即进行写操作,第九位就为don’t care(不关心比特)
如果是从机发送数据,即为读操作,第九位就为NA.

相1:主机向从机发送从机的ID号,SCCB协议支持一个主机和多个从机,因此这一个相目的是区分不同的从机,但如果我们只连接了一个从机时,也必须执行这样一个流程。实际上ID Address有8bit,其中bit7-bit1为从机的ID号,大小为0-127,一共能区分128个从机。OV2640的ID号为0x60。而bit0是用来区分对从机是写数据还是读数据,bit0=0代表写数据,bit0=1代表读数据,由于我们要向从机写数据,因此bit0应为0(0x60=01100000写入数据)。而相1中紧跟在ID Address这8位数据后的第九位是一个Don’t care bit(图中打X的位)。对于OV2640来说,从机在接收到主机送来的8bit数据后,将在SCL=1的期间,在SDA引脚输出低电平。在这期间,主机就可以读取SDA上的电平并进行判断,如果读取到低电平,表示从机已经顺利接收到了相1中的前8bit数据。说明数据传输成功,否则说明传输失败。

相2:主机向从机发送将要写入数据的寄存器的编号,寄存器的编号在OV传感器的数据手册上都能找到。寄存器的编号是一个8bit的数据。同样地,相2的第9bit也是一个Don’t care bit(图中打X的位),对该位的说明与相1相同
相3:前面两个相指定了数据传输的从机ID以及要写入数据的寄存器的编号,这时候在第三个相就可以向前面指定的寄存器写入数据了。bit7-bit0是我们希望写入寄存器的数据。而第9bit也是一个Don’t care bit(图中打X的位),对该位的说明与相1相同。
虽然每个相写入的数据不同,但其时序都是相同的,并且第九bit都是Don’t care bit。因此可以把每个相的写入编写成一个函数,如下:

u8 SCCB_WR_Byte(u8 dat)//写1个相
{
	u8 j,res;	 
	for(j=0;j<8;j++) //循环发送bit7-bit0
	{
		if(dat&0x80)SCCB_SDA=1;	
		else SCCB_SDA=0;
		dat<<=1;
		delay_us(50);
		SCCB_SCL=1;	
		delay_us(50);
		SCCB_SCL=0;		   
	}			 
	SCCB_SDA_IN();		//设置SDA为输入
	delay_us(50);
	SCCB_SCL=1;			//将SCL置1,此时如果数据已被从机接收,从机将把SDA置0
	delay_us(50);
	if(SCCB_READ_SDA)res=1;  //SDA置1,说明从机没有成功接收数据
	else res=0;         //发送成功
	SCCB_SCL=0;		 
	SCCB_SDA_OUT();		//设置SDA为输出,为下一个相的输出作准备  
	return res;  
}	

写寄存器值
在这里插入图片描述
写寄存器分三个阶段:写器件地址,写寄存器地址,写数据(以OV2640为例则)
在这里插入图片描述
表12和表13提供了OV2640中包含的设备控制寄存器的列表和描述。对于所有寄存器,启用/禁用位,启用=1和禁用=0。设备从地址是60用于写,61用于读。

u8 SCCB_WR_Reg(u8 reg,u8 data)
{
	u8 res=0;
	SCCB_Start(); 					//启动SCCB传输
	if(SCCB_WR_Byte(SCCB_ID))res=1;	//写器件ID	  
	delay_us(100);
  	if(SCCB_WR_Byte(reg))res=1;		//写寄存器地址	  
	delay_us(100);
  	if(SCCB_WR_Byte(data))res=1; 	//写数据	 
  	SCCB_Stop();	  
  	return	res;
}	

读寄存器值

读寄存器分两次两个阶段

第一个阶段:写器件地址,写要读的寄存器地址
第二个阶段:写器件地址+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);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SCCB接口协议简介(适用于OV系列摄像头)】 的相关文章

随机推荐

  • 一个顽疾——QT不能包含tslib的头和库文件联合编译的解决方法

    先介绍一下我的交叉编译环境 OS是Fedora9 交叉编译器是arm linux gcc 4 3 3 arm 2009q1 其它 tslib 1 4 QT4 7 2 硬件平台Omap3530 以前我的交叉编译器使用的是arm linux g
  • Java技术之提取指定文件

    目录 序幕 详解 开发工具 简介 主线程代码 静态变量 复制指定文件的方法创建 分析并实现 在Main主线程中的使用 简单搬运 序幕 嗨嗨 我又来咯 距离上一次发布已经有了很长一段时间 问我在干嘛 我在消磨人生 直到昨天 收到了来自父亲的这
  • java content-type设置_POST请求时 content-type的设置以及参数传递

    前提 在前后端联调的时候总会牵扯到一个问题 就是参数的传递方式 GET请求就不说了 参数往url后面一拼 万事大吉 然而一到POST请求的时候 花样就来了 后端童鞋跟你说 我这个接口在postman试过是没问题的 你content type
  • centos7将python升级为3.7

    centos7将python升级为3 7
  • Java实现二叉树的遍历(递归和非递归)

    现有一颗如下图所示的二叉树 一 基本概念 1 先序遍历 深度优先遍历 前 中 后这三个词是针对根节点的访问顺序而言的 先访问根结点 再访问左子结点 最后访问右子结点 图中的二叉树的先序遍历的顺序是1 2 4 8 9 5 3 6 7 2 中序
  • DHCP详解

    DHCP简介 我们都知道一台计算机或者手机想要上网 必须要有一个IP地址 要不然别人是找不到你的 如果我们要手动配置IP的话 是非常麻烦的 因为一个IP地址要对应着一个网络 而一个网络对应一个位置 如果主机更改位置了 要重新变换IP地址 实
  • ERROR: Could not find a version that satisfies the requirement setuptools_scm (from versions: none)

    一 项目场景 在使用百度飞桨导入paddlehub包时 一直出现没有 paddlehub 包的错误 换了好几个镜像源都不行 出现以下错误 WARNING The repository located at pypi douban com i
  • vue 实现Tabs 组件自定义删除+拖拽排序功能

    前言 目前市面上有很多实现拖拽排序功能的插件和方法 本节不过多累述 只讲一种 vue的v dragging内置组件 效果图 主图 拖拽中的图 1 安装 npm install awe dnd save 2 在 main js 文件中引入 i
  • 《算法图解》高清PDF版

    算法图解 高清PDF版 像小说一样好看容易理解的算法书籍 适合算法和竞赛入门者学习 书中的示例代码是python width 738 height 523 class preview iframe scrolling no src http
  • Flutter GetX使用详细解读

    FlutterGetX 是一个基于 Flutter 框架的状态管理和依赖注入库 它与其他状态管理库相比 具有以下优势 简单易用 FlutterGetX 采用简单明了的 API 设计 易于学习和使用 高性能 FlutterGetX 的状态更新
  • Android 学习之环境变量配置以及无法安装 intel HAXM问题的解决

    前提 已完成Java运行环境的全部配置 1 Android 开发工具Android Studio的下载和安装 自行百度 2 下载Android SDK以及设置环境变量 2 1 Android SDK 开发工具中可搜索下载 2 2环境变量配置
  • 02-像元大小

    https blog csdn net peckerzeng article details 78319935 在解释像元大小 Cell size of raster data 的概念的时候 我们有必要先引入另外一个名词叫做 像素 像素顾名
  • python最小二乘法拟合模型的loocc误差_最小二乘法拟合+3sigema去除误差大的点

    for i 1 96 for j 1 96 xdata 4 8 12 16 20 24 28 32 if ratio1 i j ratio2 i j ratio3 i j ratio4 i j ratio5 i j ratio6 i j r
  • C++模板template用法

    引言 模板 Template 指C 程序设计设计语言中采用类型作为参数的程序设计 支持通用程序设计 C 的标准库提供许多有用的函数大多结合了模板的观念 如STL以及IO Stream 1 模板 1 1 什么是函数模板 函数模板定义一族函数
  • Linux·内核的 4 大 IO 调度算法

    Linux 内核包含4个IO调度器 分别是 Noop IO scheduler Anticipatory IO scheduler Deadline IO scheduler 与 CFQ IO scheduler anticipatory
  • 资源编排

    ROSTemplateFormatVersion 2015 09 01 Parameters InstanceName Description 镜像名称 Type String Default localhost Resources Web
  • vben admin 之语言配置、使用、切换

    思路 语言导入逻辑 初始化 在 src locales setupI18n 内的根语言文件中 import lang locale ts import type App from vue import type I18n I18nOptio
  • 共模电感的工作原理

    共模电感的工作原理 在电路设计时 经常会听到利用共模电感来抑制电源噪声 但对共模电感的工作原理却不是很理解 在看了几篇文章后才有了比较清晰的认识 特此总结起来以增强认知和理解 共模电感 指在某种磁性材料的磁环上绕上同向的一对线圈 差模电流
  • 设计分享

    目录 具体实现功能 设计介绍 51单片简介 设计思路 设计内容 仿真图 protues8 7 程序 KeilC51 具体实现功能 利用滑动变阻器实现对直流电机转速的控制 仿真实现 汇编语言编写 设计介绍 51单片简介 51单片是一种低功耗
  • 【SCCB接口协议简介(适用于OV系列摄像头)】

    SCCB总线简介 SCCB协议与IIC协议十分相似 不过IIC是PHILIPS的专利 所以OmnVision在IIC的基础上做了点小改动 SCCB最主要是阉割了IIC的连续读写的功能 即每读写完一个字节就主机必须发送一个NA信号 SCCB简