一、SCCB简介

SCCB(Serial Camera Control Bus)是OmniVision公司公布的串行相机总线协议。OV开头的相机模块例如OV7670都使用SCCB协议。鉴于它与I2C协议类似,为了方便,本文将其SIO_C线称为SCL,SIO_D线称为SDA。主要讲解两线SCCB协议的内容与程序实现(stm32平台,其他平台也可参考)。

二、电路连接图

对于两线SCCB,只需连接SIO_C和SIO_D即可。

三、协议的内容与程序实现

②两线SCCB总线协议分析:
<1>传输开始标志:每次传输(无论是读数据还是写数据),都要由主机操作总线,按时序图向SDA和SCL输出规定电平,这样从机在接收到相应电平时会知道数据的传输将要开始。传输开始的标志为:在SCL保持高电平期间,SDA完成高电平到低电平的转变,随后SCL恢复低电平。

void SCCB_Start(void)
{SCCB_SDA=1;       SCCB_SCL=1;        delay_us(50);  SCCB_SDA=0;delay_us(50);     //并不是必须为50us,不要太短即可SCCB_SCL=0;
}

<2>传输结束标志:
通知从机一次传输过程结束。标志:在SCL为高电平期间,SDA由低电平向高电平的转变

void SCCB_Stop(void)
{SCCB_SDA=0;delay_us(50);   SCCB_SCL=1;   delay_us(50); SCCB_SDA=1;  delay_us(50);
}

<3>传输相(Transmission Phases):
传输相是每次数据传输的一个基本单元。它由九个bit组成,其中高bit在前。第一位到第八位为bit7-bit0,第九位为Don’t care bit或NA bit。Don’t care bit及NA bit的具体含义将在下面介绍具体的相时介绍。而第九位究竟是Don’t care bit还是NA bit是由传输相的内容决定的,不同的相有不同的规定,也将在下面介绍具体的每一个相时进行说明。

<4>写操作:
每向从机写一个字节数据称为一次写操作,但要向从机写入我们想要的一个字节数据前,还要告诉从机ID号是多少,将要写入数据的寄存器编号(Sub-Address)是多少,因此写操作的一个过程由三个相(Phase)组成。

相1:向从机发送从机的ID号,SCCB协议支持一个主机和多个从机,因此这一个相是为了区分不同的从机,但如果我们只连接了一个从机时,也必须执行这样一个过程。实际上ID Address有8bit,其中bit7-bit1为从机的ID号,大小为0-127,一共能区分128个从机。OV7670的ID号为0x42。而bit0是用来区分该相所在的cycle是向从机写数据还是读数据,bit0=0代表写数据,bit0=1代表读数据,由于我们要向从机写数据,因此bit0应为0。而相1中紧跟在ID Address这8位数据后的第九位是一个Don’t care bit(图中打X的位)。对于OV7670来说,从机在接收到主机送来的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置0delay_us(50);if(SCCB_READ_SDA)res=1;  //SDA置1,说明从机没有成功接收数据else res=0;         //发送成功SCCB_SCL=0;       SCCB_SDA_OUT();        //设置SDA为输出,为下一个相的输出作准备  return res;
}

根据上面写操作的说明,每向从机的某一个寄存器写一个字节的数据都要完成3个相的数据传输,将这3个相的数据写入过程编写成一个写寄存器函数。

u8 SCCB_WR_Reg(u8 reg,u8 data)
{u8 res=0;SCCB_Start();                    //启动传输的标志if(SCCB_WR_Byte(SCCB_ID))res=1;   //写入OV7670传感器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;
}

<5>读操作:
根据SCCB协议,要从从机的寄存器读取一个字节的数据,需要完成两次数据传输过程:①包含两个相的写过程(2-Phase Write Transmission Cycle)②包含两个相的读过程(2-Phase Read Transmission Cycle)下面分别介绍:
①两相写传输过程:这个过程包含了两个相,均由主机发送给从机。第一个相指明从机的ID号。第二个相指明将要从从机的哪个寄存器读取数据。这些相各个bit的含义与上面写操作介绍过的含义是一致的。

②两相读传输过程:
上面一个传输过程告诉从机做好准备,主机将要读取数据了。而这一个传输过程则是真正的从从机读取数据。它也包含了两个相。

相1:与上面相1的定义是一致的。但需要注意的是,此时是从从机读取数据,因此bit0应设置为1,可以用SCCB_ID|0x01(SCCB_ID是从机ID号的宏)来得到。
相2:从机向主机发送数据。因此应把主机连接SDA的IO口设置为输入模式。读取八个字节后,为了告诉从机已经成功收到数据,主机应向从机发送一个bit的应答信号(NA)。这个信号的时序定义如下:

这个应答信号需要主机将SDA先拉高,然后在SDA高电平期间,将SCL由原来的低电平变为高电平再变为低电平。实现NAbit的代码如下

void SCCB_No_Ack(void)
{delay_us(50);SCCB_SDA=1;  SCCB_SCL=1;    delay_us(50);SCCB_SCL=0;   delay_us(50);SCCB_SDA=0;   delay_us(50);
}

我们可以把相2中读取bit7-bit0的数据封装成一个函数

u8 SCCB_RD_Byte(void)
{u8 temp=0,j;    SCCB_SDA_IN();        //设置主机SDA连接的IO口为输入for(j=8;j>0;j--)  //循环读取bit7-bit0{                  delay_us(50);SCCB_SCL=1;temp=temp<<1;if(SCCB_READ_SDA)temp++;   //SCCB_READ_SDA是从IO口读到的数据delay_us(50);SCCB_SCL=0;} SCCB_SDA_OUT();     //将主机连接SDA的IO口设置为输出  return temp;
}

有了以上的两个函数,再借助我们先前编写的写一相数据的u8 SCCB_WR_Byte(u8 dat)
函数,我们就可以编写一个完成整个读操作的函数

u8 SCCB_RD_Reg(u8 reg)
{u8 val=0;//对应两相写操作SCCB_Start();               //启动传输SCCB_WR_Byte(SCCB_ID);  //相1        delay_us(100);     SCCB_WR_Byte(reg);    //相2  delay_us(100);   SCCB_Stop();             //结束传输delay_us(100);    //对应两相读操作SCCB_Start();            //启动传输SCCB_WR_Byte(SCCB_ID|0X01);    //相1delay_us(100);val=SCCB_RD_Byte();         //相2SCCB_No_Ack();            //读取完8bit数据后的应答SCCB_Stop();              //结束传输return val;
}

至此我们已经实现了SCCB的读寄存器和写寄存器操作的函数SCCB_RD_Reg和SCCB_WR_Reg。调用这两个函数就可以实现向OV传感器指定寄存器读写数据,从而完成传感器的初始化工作。

SCCB总线协议的详细讲解与程序实现相关推荐

  1. 西门子伺服分拣机西门子S7-1200 PLC程序,有自己录4平详细讲解项目程序

    西门子伺服分拣机西门子S7-1200 PLC程序,有自己录4平详细讲解项目程序 有电气CAD图,机械整机结构,动作流程 西门子PLC 3轴伺服分拣机程序,西门子触摸屏程序,V90 走PN 口控制3轴, ...

  2. 多种详细讲解小程序页面传值

    开发小程序,总是避免不了页面和页面之间数据共享,实现方法有很多种,今天就详细讲解下小程序页面传值,需要的朋友可以参考下. 1 使用wx.navigateTo()传值 这种传值方式有两种, url后面拼 ...

  3. QCC51XX-QCC30XX系列开发教程(实战篇) 之 10.4-结合协议代码详细讲解方案B通信

    查看全部教程开发请点击:全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中) ========================================= ...

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

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

  5. i2c通信的详细讲解_【博文连载】SCCB(I2C)初始化时序介绍

    在正式开始OV7725视频采集实现之前,Bingo不得不先讲解一下OV7725的寄存器配置接口.OV7725上电会默认输出YUV422格式的视频流,但我们希望传感器能够按照我们预期的模式工作,我们需要 ...

  6. 再议IIC协议与设计【3】 --SCCB总线介绍

    SCCB (Serial Camera Control Bus) 是由OmniVision公司所定义的串行相机控制总线.用于控制OmniVision公司生产的Camera Sensor.本文通过对SC ...

  7. 【Docker之Swarm详细讲解Swarm集群搭建管理节点工作节点Raft一致性协议overlay网络Docker结合Swarm部署WordPress个人博客实战】

    一.知识回顾 之前的内容都帮你整理好了,在这里哟! [0.Docker相关目录文章整理,可自行查看,包含多节内容] [1.Docker详细安装部署&阿里镜像地址配置] [2.Docker架构& ...

  8. 微信小程序更新功能详细讲解

    我在之前的文章中详细讲解了:今天和大家来详细聊一聊微信小程序一些新功能. 微信小程序操作教程(个人用户注册)和 微信小程序操作教程(企业用户注册) 一.小程序短信功能介绍 短信广告作为全新的媒体传播形 ...

  9. react的超详细讲解

    create-react-app 项目目录 在HTML中使用react 1 2 3基础 React的注意事项 模拟的React 和 render React组件 函数组件 类组件 React 的数据源 ...

最新文章

  1. AI项目对接第二期——缺陷检测
  2. scala学习笔记(一)入门初探
  3. 接上一篇Ansible和celery的结合,在celery的tasks.py文件里为了实现并发不阻塞的需求,用到了多进程
  4. how to prepare reading club
  5. redis学习(四) 登录和cookie缓存
  6. 在eclipse上Checkstyle的安装和使用
  7. Hello JavaFX 2.0:命令行介绍
  8. Oracle笔记:数据库启动的三个阶段
  9. ajax实现评论区功能,Ajax实现评论中顶和踩功能的实例代码
  10. ListCtrl使用
  11. Linux笔记之shell script
  12. CMU 15-213 Introduction to Computer Systems学习笔记(3) Floating Point
  13. linux下实现getch()函数的功能,linux下有没有和windows下的getch函数功能基本一样的函数?...
  14. mysql数据库保存文件_MySQL数据库文件介绍及存放位置
  15. 谷歌正式宣布退出中国 关闭google.cn
  16. zmud之潜能武学技能计算器。
  17. 如何做一份详细的百度推广投放方案
  18. Qt 之 QSS(白色靓丽)
  19. 非线性规划MATLAB求解原理,专题六--非线性规划介绍及其Matlab求解方法.ppt
  20. linux磁盘分区什么意思,linux 磁盘分区详解

热门文章

  1. ECShop V2.7.3 补丁包集合 请直接去ECSHOP官方网站下载
  2. NCC修改logo及背景图片方法
  3. APP漏洞扫描器之本地拒绝服务检测详解
  4. 怎么从简历看候选人性格_我从拒绝设计候选人中学到的东西以及您不应该做的申请人...
  5. JVM原理及性能调优
  6. java中文章的阅读数统计
  7. 两个非常使用的工具仿站小工具7.0以及排版页面的工具
  8. 电脑用java怎么编程,使用java编程从0到1实现一个简单计算器
  9. 共享盘/文件夹加密及连接
  10. 南开大学计算机考研资料汇总