当前位置:网站首页>【科普贴】I2C接口详解——偏硬件解析
【科普贴】I2C接口详解——偏硬件解析
2022-08-02 03:29:00 【湉湉家的小虎子】
一、 I2C接口简介
I2C最早是Philips公司开发的一款简单的双向总线,实现有效的IC控制。把这个总线写成Inter IC 简称IIC或I2C(PS:说白了2就是两个“I”的意思。)
I2C总线一些特征:
1、 只有两根线分别是串行数据线(SDA),串行时钟线(SCL)。
2、 每个连接到总线的器件有唯一一个地址。
3、 总线中可以存在一个主机多个从机的模式,也存在多个主机的模式(实际应用非常少,本文不做累述)。
4、 使用串行8位双向数据传输方式。有标准模式(Standard mode)传输速度达100kbit/s;快速模式(Fast mode)传输速度达400kbit/s;超快速模式(Fast mode Plus)传输速度达1Mbit/s;高速模式(High speed mode)传输速度达3.4Mbit/s。通常多用到标准模式。
5、 总线上的设备数量只受到总线电容(Bus capacitance)小于400pf的限制。
6、 可以使用普通GPIO口模拟I2C,但要需要将GPIO配置成OD模式(开漏模式)
二、I2C位传输规则
1、起始信号&停止信号
起始条件:当SCL为高电平时,SDA从高电平向低电平切换。
停止信号:当SCL为高电平时,SDA从低电平向高电平切换
2、数据的有效性
I2C信号为电平采样信号(其他很多协议都是信号沿采样,如SPI)。规定SDA上的数据在SCL高电平周期内保持稳定,在SCL低电平周期内允许变化。
3、响应时钟信号(ACK)
数据传输必须带响应 相关的响应时钟脉冲由主机产生 在响应的时钟脉冲期间发送器释放SDA线(高)。
在响应的时钟脉冲期间接收器必须将SDA 线拉低使它在这个时钟脉冲的高电平期间保持稳定的低电平。
通常,被寻址的接收器在接收到的每个字节后,必须产生一个响应。
当从机不能响应从机地址时,例如它正在执行一些实时函数不能接收或发送。从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输或者产生重复起始条件开始的传输。
如果从机接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输,这个情况用从机在第一个字节后没有产生响应来表示,从机使数据线保持高电平,主机产生一个停止或重复起始条件。
4、地址格式
在发送起始信号后,主机会发送一个从机地址,这个地址共有7位。紧接着第8位(R/ W)“0”表示“写”,“1”表示请求数据“读”。
第一个字节的头7位组成了从机地址最低位(LSB)是第 8 位,它决定了报文的方向
第一个字节的最低位是“0”表示主机会写信息到被选中的从机“1”表示主机会向从机读信息
当发送了一个地址后,系统中的每个器件都在起始条件后将头7位与它自己的地址比较 如果一样,器件认为它被主机寻址,至于从机是接收数据还是发送数据都由 R/ W 位决定。
三、I2C电气特性标准
I2C通讯的时候需要注意时序是否满足条件,特别注意建立时间,保持时间等时序。如出现问题需要测试波形与表格中的电气特性进行详细对比。
四、I2C上拉电阻选择
1、SDA和SCL都是双向的线路,都是通过一个电流源或者上拉电阻接到电源电压,这个电流源的最大值为3mA。
2、开漏状态下有3mA的反向电流,SDA,SCL的低电平的最大值为VOL(max)=0.4V。(I2C协议中可以看到)
通过上述既可以得到:
3、最大上拉电阻的受到上升时间和负载电容的响应,具体的计算公式见下,具体的tr可在电气特性表中找到
所以说有些人说I2C的标准上拉电阻是2.2K是不正确的。
边栏推荐
猜你喜欢
随机推荐
【水位传感器与 Arduino 连接测量水位】
MPU6050 加速度计和陀螺仪传感器与 Arduino 连接
在 UUP dump 被墙的情况下如何用 UUP 下载 ISO 镜像
umi3 权限路由PrivateRoute未执行
Binder机制详解(三)
同时安装VirtualBox和VMware,虚拟机如何上网
完全背包问题(动态规划)
一分钟get:缓存穿透、缓存击穿、缓存雪崩
【Arduino使用旋转编码器模块】
Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset I3D论文精读
《scala 编程(第3版)》学习笔记3
分布式消息队列平滑迁移技术实战
《scala 编程(第3版)》学习笔记4
机器学习相关 概率论重点笔记
还原最真实、最全面的一线大厂面试题
一文理解分布式开发中的服务治理
[Spark]-协同过滤
PAT甲级:1020 Tree Traversals
【土壤湿度传感器与 Arduino 测量土壤湿度】
SyntaxError: unexpected character after line continuation character