详谈IIC

news2024/11/15 15:49:25

前言

在嵌入式底层系统中,常见的通讯方式,串口,IIC,SPI,IIS等,一般IIC,SPI,IIS更多的采取IO模拟,其余CAN,UART均是硬件设计直接支持,而IIC主要用于多数传感器数据的读写,IIS更多用于语音驱动,SPI则用于传输要求较快的场景,如图像传输等,本文则着重阐述作者认知中的IIC,以及相关的实例和实际过程中的细微处理等,有机会和时间再慢慢写其他。

硬件设计注意

一般来说IIC主要有两根主要的线,SDA和SCL(去除电源相关的VCC和GND),硬件设计过程中SDA和SCL注意做上拉处理,电阻的选值在一定基础上也会影响到整体的通讯速率。

IIC的基础规则

1.基本约定
(1)总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。
(2)通常来说IIC设备一般会存在一个设备编号,用于区分相关的设备,占7个bit,最后一个bit作为此次操作的读写处理位,最后一个bit为0表示写,为1表示读取(此处顺序是从高数据到低数据算的),例如51H—>0101 0001,当我们要写入数据的时候需要传输1010 0010 也就是A2H数据。
(3)发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。
(4)规定,只允许SCL为高的时候,SDA的数据有效传输,也就是说我们在SCL为低的时候修改SDA的电平去表示你要传输的bit电平,修改稳定后我们将SCL拉高,另一个设备读取到SCL高的时候会去采样SDA的电平,注意这里的措辞是稳定,根据选型的芯片和通讯要求等,一般会做一定的延时,具体可以看相关的设备的手册。
(5)IIC是一个半双工,这是由其数据性决定的,SDA作为数据的主要传输线路,不可能同时传输两端数据。

2.IIC的基本传输流程
IIC根据SCL和SDA的线路情况将通讯的状态分为以下几种,空闲状态(IDLE状态),起始信号(START信号),确认信号(ACK/NACK),停止信号(STOP信号),相对实际通讯过程中,我们会多加几个通讯流程,数据传输阶段,等待确认信号。

3.相关传输流程的SCL和SDA的处理
以下会做一个简单的通讯过程的说明,以程序设计流程为示例,注意以下过程修改引脚的时候注意电平转换一般需要延时时间
空闲态:一开始没有数据传输的过程中会处于空闲态,SDA=SCL=1,两者均保持高电平,从一种角度上来说为什么建议加上拉,从抗干扰层次说也是,如果做键盘扫描没有加上拉的话,可能会体会更深,从软件上来说浮空就是1,但是实际上要从EDA设计角度来说,一般会认为是X,未知态。

起始信号:SCL=1,SDA-=1>SDA=0,当SCL为高的时候SDA由高为低,下降沿,从设计的角度来说,数据的传输必然是起始开始的,之所以设定在SCL高的时候,让SDA为0表示起始信号,个人理解是这样是设计让数据变化更快,只需要更改一根线的电平,可以参考格雷码的存在意义,起始信号一般是空闲态转后的状态。

数据传输:第一个传输的是地址+读写标志位组成的8bit数据,当起始信号的存在被检测后,将SCL=0,然后修改对应的SDA,认为SDA引脚稳定表达你想要的逻辑电平后,SCL=1,另一个设备检测到SCL为1后会开启采样,给予另一个设备足够的采样时间采用SDA,这样就完成1bit的传输。

ACK/NACK:当完成如上的8个bit数据传输后,设备会等待接收到数据的响应信号,当接收到数据的设备已经发完或者异常情况(常见的异常,请见下面补充),或者没有传输完成则会表示ACK让你进行下一步操作,告诉你已经做完一个数据步骤,ACK:SCL高电平时,SDA为低电平,NACK:SCL高电平时,SDA为高电平,按照个人理解的话,常见的程序存在两种,一种是不管直接进行下一个步骤就进行ACK判断,一种是会将释放SDA的控制,SCL=0,SDA=1,SCL=1,让另一个设备去拉低SDA来排除最后一个字节发送为0的时候的区分,作为等待ACK或者NACK的程序设计,NACK和空闲的状态表示一样。

停止信号:SCL=1,SDA=0–>SDA=1在SCL为高电平时,SDA上升沿。以停止信号作为整个程序的指令的结束。

具体事例流程说明
接近传感器VCNL4200
上图是VCNL4200传感器的协议流程图,采取的官方数据手册,白色是主设备做的,深色是VCNL做的。
1.先初始化IO口,对于我们来说SCL必然是我们一直控制的,做为主设备,设置输出,也可以将SDA=1做为输出,进入空闲态。
2.如图的第一个表示的是写数据,开始信号,由空闲进入开始,开始信号的要求是SCL的时候SDA一个下降沿,我们可以直接将SDA拉低即可。
3.传输数据地址,VCNL4200的地址是51H,通过上面的示例得到,我们写的时候变成了A2H,将SCL拉低,然后SDA拉高,后再将SCL拉高,如此处理8个bit。
4.进入等待阶段ACK阶段,按照上面的两种方式中的一种即可
5.后面同2-4,知道P阶段,先在SCL为低的情况下,拉低SDA,然后将SCL=1,SDA=1,产生一个上升沿作为结束。
6.对于读取来说,不一样的就是从设备读取的过程,在这个过程中仍然是主设备控制SCL,我们会释放SDA,将SCL拉低,给予从设备一段时间,然后其去修改SDA的电平,然后我们读取SDA的逻辑电平,用于表示读取到的bit数据,在读取到8bit数据后给予ACK或者NACK反应。

补充:
通讯过程中出现以下情况,总线上会出现NACK信号:

1)接收方忙于其他事情,不能接收数据

2)接收方不能理解收到的数据或者没有空间存储数据

3)主机读取数据完成,返回NACK告知从机读取完成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【c++基础】

C基础入门统一初始化输入输出输入输出符输入字符串const与指针c和c中const的区别const与指针的关系常变量与指针同类型指针赋值的兼容规则引用引用的特点const引用作为形参替换指针其他引用形式引用和指针的区别inline函数缺省参数函数重载判断函数重载的规则名字粉碎C编译时函…

Goby 征文大擂台,超值盲盒等你来!

001 Goby 技术征文正式启动 Goby 致力于做最好的网络安全工具。为了促进师傅们知识共享和技术交流,现发起关于 Goby 的技术文章征集活动! 欢迎所有师傅们参加,分享您的使用经验或挖洞窍门等,帮助其他人更好地了解和利用 Goby。 …

Winform界面实现控件中英文语言切换

一、业务需求 在Winform项目的开发过程中,涉及到一个基础的功能就是需要对界面中的显示语言内容可以进行选择切换,方便不同地区的使用者快速上手使用;效果如下: 二、需求分析 需要实现对Winform项目界面显示语言可选择切换步骤如下: ①修改控件的显示内容; ②获取到界面显…

【计算机网络】数据链路层

概述 封装成帧 差错检验 可靠传输 实现机制 可靠传输的实现机制 停止等待协议 回退N帧协议 选择重传协议 【计算机网络】MAC帧和PPP帧(定义使用范围区别共同点)_GPNU_Log的博客-CSDN博客_ppp帧 PPP帧和以太网帧 | Mixoo 数据链路层的协议有PPP协…

Rman单实例迁移到单实例

关于同平台同版本数据库之间的迁移操作的实验 ---Source DB[rootoracle-db-19cs ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19cs ~]# --- Target DB[rootoracle-db-19ct ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19ct…

如何使用dlinject将一个代码库实时注入到Linux进程中

关于dlinject dlinject是一款针对Linux进程安全的注入测试工具,在该工具的帮助下,广大研究人员可以在不使用ptrace的情况下,轻松向正在运行的Linux进程中注入一个共享代码库(比如说任意代码)。之所以开发该工具&#…

扬帆优配|新概念火了!时空大数据龙头再冲击涨停

时空大数据近期受资金追捧。 今天早盘,中通邦本开盘后再度冲击涨停,一度封死涨停板,之后涨停打开,截至上午收盘仍上涨超5%。此前,中通邦本已接连两日涨停,公司在互动渠道上表示,参股公司北京邦本…

Spring中Bean生命周期及循环依赖

spring中所说的bean对象 与 我们自己new的对象(原始对象)是不同的;bean对象是指spring框架创建管理的我们的对象生命周期即:何时生,何时死1.实例化 Instantiation:spring通过反射机制以及工厂创建出来的原始对象;2.属性…

【Spring】八种常见Bean加载方式

🚩本文已收录至专栏:Spring家族学习 一.引入 (1) 概述 ​ 关于bean的加载方式,spring提供了各种各样的形式。因为spring管理bean整体上来说就是由spring维护对象的生命周期,所以bean的加载可以从大的方面划分成2种形式&#xff…

2023年融资融券研究报告

第一章 行业概况 融资融券是证券交易市场上的两种金融衍生品交易方式,主要用于股票、债券等证券的融资和投资。 融资是指投资者向证券公司借入资金购买证券,以期望股票价格上涨后卖出获得利润。融资需支付一定的利息和费用,利息根据借入的资…

CSS实现checkbox选中动画

前言 👏CSS实现checkbox选中动画,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义css变量,–checked,表示激活选中色值 :root {--checked: orange; }创建父容器&#xf…

python+pytest接口自动化(6)-请求参数格式的确定

我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在…

Go 实现 AOI 区域视野管理

在游戏中,场景里存在大量的物体.如果我们把所有物体的变化都广播给玩家.那客户端很难承受这么大的压力.因此我们肯定会做优化.把不必要的信息过滤掉.如只关心玩家视野所看到的.减轻客户端的压力,给玩家更流畅的体验. 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量…

【Java】P1 基础知识与碎碎念

Java 基础知识 碎碎念安装 Intellij IDEAJDK 与 JREJava 运行过程Java 系统配置Java 运行过程Java的三大分类前言 本节内容主要围绕Java基础内容,从Java的安装到helloworld,什么是JDK与什么是JRE,系统环境配置,不深入Java代码知识…

传导EMI抑制-Π型滤波器设计

1 传导电磁干扰简介 在开关电源中,开关管周期性的通断会产生周期性的电流突变(di/dt)和电压突变(dv/dt),周期性的电流变化和电压变化则会导致电磁干扰的产生。 图1所示为Buck电路的电流变化,在Buck电路中上管电流和下…

ubuntu 22.04 mangodb

文章写在2023年3月1日 目前最新的mangodb稳定版本是6.04 1.安装server server安装包为mangodb的程序主体。 服务器deb安装包下载地址 https://www.mongodb.com/try/download/community ubuntu22.04的server deb 文件url https://repo.mongodb.org/apt/ubuntu/dists/jammy/mo…

计算机组成原理 浮点数运算清晰明了

注释:阶码和尾数都需要符号位区分正负 例题1:x 2^-11*0.100101, y 2^-10*(-0.011110),求xy 第零步 补码表示 对于x来说-11 补码表示为 11011; 0.100101补码表示为00.100101对于y来说-10补码表示为 10110&#xff…

【el】表单

elementUI中的表单相关问题一、用法1、动态表单调用接口返回表单&#xff0c;后端的接口返回值如下&#xff1a;这些是渲染后的效果页面使用&#xff08;父组件&#xff09;<el-button size"small" class"Cancelbtn" click"sub(true)">发起…

python程序员狂飙上头——京海市大嫂单推人做个日历不过分吧?

嗨害大家好鸭&#xff01;我是小熊猫~ 这个反黑剧其实火了很久了&#xff0c; 但是我现在才有空开始看 该说不说&#xff0c;真的很上头&#xff01;&#xff01;&#xff01; 大嫂简直就像是干枯沙漠里的玫瑰 让人眼前一亮哇~~ 我小熊猫此时此刻就成为大嫂的单推人&…

Auto-encoder 系列

Auto-Encoder (AE)Auto-encoder概念自编码器要做的事&#xff1a;将高维的信息通过encoder压缩到一个低维的code内&#xff0c;然后再使用decoder对其进行重建。“自”不是自动&#xff0c;而是自己训练[1]。PCA要做的事其实与AE一样&#xff0c;只是没有神经网络。对于一个输入…