SCCB协议理解及实现
前记:
众说周知,SCCB协议与IIC协议十分相似,不过IIC是PHILIPS的专利,所以OmnVision在IIC的基础上做了点小改动,然后你懂的。SCCB最主要是阉割了IIC的连续读写的功能,即每读写完一个字节就主机必须发送一个NA信号。
SCCB简介
SCCB是欧姆尼图像技术公司(OmniVision)开发的一种总线,并广泛的应用于OV系列图像传感器上,所以一般使用OV的图像传感器都离不开SCCB总线协议。
可以通俗地讲SCCB有两种工作模式,一主多从,一主一从模式。
- 一主机多从机 也即3线操作:(通过控制使能端SCCB_E控制选中的从机)
- 一主一从 也即2线操作:(默认SCCB_E被拉低)
管脚定义
可与IIC对比来看
SCCB | IIC | 方向 | 描述 |
---|---|---|---|
SIO_E | \ | 主机发出 | 低电平有效,总线空闲时主机驱动此引脚为1,驱动为0时表示开始传输或者挂起模式 |
SIO_C | SCL | 主机发出 |
总线空闲时主机驱动此引脚为1; 当驱动SIO_E为0时,主机驱动此引脚为0或1;当挂起时主机驱动SIO_C为0; SIO_D只能在SIO_C为0时发生变化。 |
SIO_D | SDA | 双向传输 |
当总线空闲时保持浮动,状态不固定(0、1或高阻态) 相当于数据位! |
SCCB时序
- SCCB_E为低电平时传输有效,SIO_C为高电平时SIO_D读取数据(SIO_C为低电平时SIO_D改变)
- 开始传输的时序
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);
}
- 结束传输的时序
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);
}
- 产生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);
}
读\写时序
- 读时序
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相应位写1delay_us(50);SCCB_SCL=0;}SCCB_SDA_OUT();return (read);
}
- 写时序
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);
}
传输规则
- 写寄存器值
写寄存器分三个阶段:写器件地址,写寄存器地址,写数据
u8 SCCB_WR_Reg(u8 reg, u8 data)
{u8 res=0;SCCB_Start(); //启动SCCB传输if(SCCB_WR_Byte(SCCB_ID)) res=1; //写器件地址 失败返回1delay_us(100);if(SCCB_WR_Byte(reg)) res=1; //写寄存器地址 失败返回1delay_us(100);if(SCCB_WR_Byte(data)) res=1; //写数据 失败返回1SCCB_Stop(); //停止return(res);
}
- 读寄存器值
读寄存器分两次两个阶段
- 写器件地址,写要读的寄存器地址
- 写器件地址+1(表示读命令),读取数据,最后在发送NA信号
u8 SCCB_RD_Reg(u8 reg)
{u8 val=0;SCCB_Start(); //启动SCCB传输SCCB_WR_Byte(SCCB_ID); //写器件IDdelay_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输出。觉得有帮助的评论一下,或有疑问的我们一起探讨撒!
SCCB协议理解及实现相关推荐
- OV7725学习之SCCB协议(一)
OV7725摄像头只能作为从机,通过SCCB协议配置内置的172个寄存器.因此首先要了解的就是SCCB总线 1.SCCB协议简述 SCCB协议有两线也有三线,两线为SIO_C与SIO_D,三线为SIO ...
- SCCB协议学习笔记
目录 一.前言 二.SCCB是什么 三.SCCB与IIC 四.OG02B10中的SCCB 一.前言 在配置某项目的主摄像头时,由于暂时没有现成的驱动文件,需要先根据平台其他摄像头的驱动格式进行移植,在 ...
- SCCB协议介绍与应用和OV7670摄像头的寄存器配置
SCCB协议简介: 以OV7670的配置传输为例 OV770中,8'h42是写操作ID,8'h43是读地址 从数据传输时序可以看出,其传输的顺序是: 开始位,数据[7:0] ,X位,其中X位为任意,手 ...
- Socket编程、协议理解
Socket编程.协议理解 简单说明 Socket编程 Socket 常用接口 Socket服务端业务编码 代码说明 文件服务(fileServe) 消息服务(msgServe) 消息写会(write ...
- FPGA利用SCCB协议配置OV5640摄像头
FPGA利用SCCB协议配置OV5640摄像头 为什么要配置摄像头 配置代码 测试代码 总结 为什么要配置摄像头 OV5640摄像头有许多工作模式,如可以工作在1080P,720P,480P分辨率的情 ...
- 软件SCCB协议学习笔记
一.SCCB协议简介 SCCB协议是OV公司公布的摄像头用的串行总线协议,相当于一个简易的I2C协议.本文写作意图在于记录使用软件SCCB驱动OV7670模块的配置方法. 二.SCCB协议时序简介(二 ...
- SCCB协议与IIC协议的对比
SCCB协议与IIC协议对比 SCCB协议的作用 两种协议的不同点 两种协议的相同点 参考文档 结束语 SCCB协议的作用 SCCB协议是摄像头中最常用的协议,该SCCB协议可以使用去配置摄像头的寄存 ...
- STM32F407--驱动OV2640采集图像数据,通过W5500传输至上位机---第一篇:OV2640简介及SCCB协议
以下内容皆是个人学习过程中的总结,记录一下整个过程,用于后期复习,如有不对之处,麻烦各位大佬指出~ (喜欢的朋友麻烦点个关注~~~ 后期还会进行持续更新) OV2640概述: OV2640是OV (O ...
- 深入理解 gRPC 协议--理解protobuf/.proto/http2
RPC 无非是做两件事情:一是数据编码,二是请求映射. 1. 数据编码–protobuf vs json 数据编码顾名思义就是在将请求的内存对像转化成可以传输的字节流发给服务端,并将收到的字节流再转化 ...
最新文章
- 用Tableau画改进版幂函数柱状图
- 步步深入:MySQL架构总览-gt;查询执行流程-gt;SQL解析顺序
- 喜讯 | 国际智慧城市大会巨杉喜获两项大奖
- Linux基础(4)--用户与权限
- 油猴脚本使用waitForKeyElements报错eslint: no-undef - `waitForKeyElements` is not defined
- vue: 从组件通讯到vuex (上)
- read()/write()的生命旅程之四——第四章:writeback
- nyoj 410 how many ones?
- Hadoop 集群 傻瓜式搭建手记 (一) 软件准备
- 【2020年领域新星】 Ruibo Liu 达特茅斯学院
- 在线招聘风起,周伯通怎么玩社区招聘?
- 如何在Java中以编程方式阅读,添加或删除PPT中的幻灯片便笺?
- 飞塔防火墙虚拟服务器,飞塔防火墙模拟(1):模拟器使用方法 | 网络之路博客(公众号同名)(其他平台网络之路Blog)...
- 宅家神器—epub阅读器
- 如何使用腾讯云轻量应用服务器搭建免费开源企业CMS?
- 嵌入式新闻早班车-第5期
- oracle 通过身份证号 查询年龄大于60岁的人
- 怎么样防止文档泄密呢?
- NOJ - 2070 马尔扎哈的疑惑
- 【业务架构】价值实现、价值定位、价值创造
热门文章
- matlab实验一报告,matlab实验报告一二三
- 关于温度气压传感器MS5611计算公式—温度低于20℃时出错问题的解决办法及验证结果
- 王川:我与雷军和而不同
- 计算机英语课的总结,英语优质课心得体会
- python--千库网素材爬取
- How to use Clang Static Analyzer
- 关于Arduino图形化编程插件ArduBlock的安装方法
- 预告丨中国计算语言学大会(CCL 2020)将于10月底在线召开
- oracle保留款数据,系列之五:ORACLE EBS 系统主数据管理(B) - season的日志 - 网易博客...
- 渐变折射率(GRIN)镜头的建模