常用通信接口、协议:SCCB

2023-11-23 05:20

本文主要是介绍常用通信接口、协议:SCCB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概述

        SCCB(串行摄像头控制总线)是由欧姆尼图像技术公司(OmniVision)开发的一种类IIC的总线,主要用于其OV系列的图像传感器上(但目前有很多家的图像传感器都有采用该控制总线)。相对于IIC总线来说SCCB与之最主要的差异在于连续读写模式;SCCB不支持该模式,即每次读写完一个字节,主机必须发送一个NA信号。

        采用了SCCB总线的图像传感器都工作在Slave模式,对应的主控端为Master模式,也就是说和IIC一样的为主从模式的总线,同样的支持一主多从和单主单从(通过SCCB_E控制从机使能,低电平使能)。

二、信号线定义

        完整的SCCB总线包含:SCCB_E、SIO_C、SIO_D、PWDN四根信号线,其具体的作用分别为:

        SCCB_E:传输使能,主端输出,从端输入,默认空闲状态为高电平。低电平时传输有效,电平高到低表示 总线通信开始,电平低到高表示 总线通信结束。

        SIO_C:数据传输时钟,主端输出,从端输入,默认空闲状态为高电平。在SCCB_E使能(拉低)传输开始后电平由高到低表示数据传输开始,数据传输过程中高电平期间SIO_D数据采样有效,低电平期间SIO_D状态切换。

        SIO_D:数据传输信号,双向输入、输出,默认总线空闲为浮空电平(通常主端在空闲状态会选择将其拉高),高电平表示逻辑1(bit 1),低电平表示逻辑0(bit 0)。在总线通信开始,SCCB_E产生下降沿前,主机需要将SIO_D拉高,可以有效的避免总线出现未知错误。

        PWDN:输出、输入关闭。

三、通信过程

        SCCB的数据传输发生在通信开始信号(起始信号)和通信结束信号(结束信号)之间,由称之为相(phase)的基础传输单元组成。

        通信开始(起始信号):通信开始时序由SCCB_E下降沿前后的各信号线的序列时序状态组成;在SCCB_E下降沿前主端将SIO_D置1,并且SIO_D必须保持间隔一个不低于15ns的tPRC的高电平时间;在SCCB_E下降沿后SIO_D必须要保持间隔一个不低于1.25us的tPRA的高电平时间;在此期间,SIO_C必须始终保持在高电平状态。

        通信结束(结束信号):通信开始时序由SCCB_E上升沿前后的各信号线的序列时序状态组成;在SCCB_E上升沿前SIO_C拉高,并且要保持间隔一个不低于0ns的tPSA时间;在SCCB_E上升沿后SIO_D拉低,并且期间要保持间隔一个不低于15ns的tPSC时间。

        SCCB的数据传输主要分为:3相写、2相写、2相读,三种传输时序类型。这里的3相、2相的相指的是基础传输单元。

        每一个相元(phase)由8位数据位 + 1位 don’t care/NA位组成。如果是主端发数据(写操作),第9位就是don’t care(不关心)位;如果是从端发数据(读操作),第9位就是NA位。数据比特流都是MSB高比特在前的方式传输的。

        相元1传输的主要是从机的ID信息,SCCB支持单主多从,所以主机需要在相元1阶段发送从机ID信息,以便总线上的从机识别当前主机要与谁通信(单主单从时也不可省略)。从机ID为7bit,表示范围为0~127,bit 0 用于表示读/写操作,0为读取数据,1为写入。在相元1的8位数据之后的x位为don’t care位(但有的sensor会在该位通过SIO_D向主端发送一个逻辑0的NA数据,主机端可以通过该位判断对应ID的从机是否在线)。

        相元2传输的主要是从机寄存地址信息或者读取的数据信息;8bit后的1bit位也同样的为don’t care/NA位。

        相元3传输的主要是主机向从机寄存要写入的数据信息;8bit后的1bit位也同样的为don’t care/NA位。

        3相写时序:3相写时序是一个完整的主机向指定从机的指定寄存地址写入指定8bit数据的一个完整数据传输周期(相元1的bit0为1),每一个相元的第9bit都是don’t care位。

        2相写时序:2相写时序实际上是前半个主机从指定从机的指定寄存地址读取8bit数据的完整数据传输周期(和2相读时序共同组成一个完整的读时序),每一个相元的第9bit都是don’t care位。先向目标从机传输读标志(相元1的bit0和相元2中的8bit寄存地址)。

        2相读时序:2相读序实际上是后半个主机从指定从机的指定寄存地址读取8bit数据的完整数据传输周期(和2相写时序共同组成一个完整的读时序))。第一个相元的第9bit都是don’t care位,第二个相元的第9bit为NA位(主端向从端发送的确认信号)。

四、伪代码实现

//通信开始
void sccb_start(void)
{sccb_sda_out();sccb_sda_set(1);sccb_scl_set(1);delay_us(25);sccb_sda_set(0);delay_us(25);sccb_scl_set(0);delay_us(25);return;
}//通信结束
void sccb_stop(void)
{sccb_sda_out();sccb_sda_set(0);delay_us(25);sccb_scl_set(1);delay_us(25);sccb_sda_set(1);delay_us(25);return;
}//NA信号
void sccb_na(void)
{sccb_sda_out();delay_us(25);sccb_sda_set(1);sccb_scl_set(1);delay_us(25);sccb_scl_set(0);delay_us(25);sccb_sda_set(0);delay_us(25);return;
}//读取1字节,返回读取的数据
unsigned char sccb_read_byte(void)
{unsigned char byte = 0, index = 0;sccb_sda_in();for(index = 0; index < 8; index++) {delay_us(25);sccb_scl_set(1);byte = byte << 1;if(1 == sccb_read_sda()) {byte++;}delay_us(25);sccb_scl_set(0);}sccb_sda_out();return byte;
}//写入1字节,写入成功返回1,失败返回0
unsigned char sccb_write_byte(unsigned char data)
{unsigned char res = 0, index = 0;for(index = 0; index < 8; inde++) {if(1 == (data & 0x80)) {sccb_sda_set(1);} else {sccb_sda_set(0);}data <<= 1;delay_us(25);sccb_scl_set(1);delay_us(25);sccb_scl_set(0);}sccb_sda_in();delay_us(25);sccb_scl_set(1);delay_us(25);if(1 == sccb_read_sda()) {res = 1;} else {res = 0;}sccb_scl_set(0);sccb_sda_out();return res;
}//向寄存器写入1字节,写入成功返回1,失败返回0
unsigned char sccb_write_reg(unsigned char reg, unsigned char data)
{unsigned char res = 0;sccb_start();if(1 == sccb_write_byte(sccb_dev_id)) {res = 1;}delay_us(50);if(1 == sccb_write_byte(reg)) {res = 1;}delay_us(50);if(1 == sccb_write_byte(data)) {res = 1;}delay_us(50);sccb_stop();return res;
}//从寄存器读取1字节
unsigned char sccb_read_reg(unsigned char reg)
{unsigned char res = 0;sccb_start();sccb_write_byte(sccb_dev_id);delay_us(50);sccb_write_byte(reg);delay_us(50);sccb_stop();sccb_start();sccb_write_byte(sccb_dev_id | 0x01);delay_us(50);res = sccb_read_byte();sccb_na();sccb_stop();return res;
}

这篇关于常用通信接口、协议:SCCB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/415613

相关文章

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr