不见春山
骑马倚斜桥,满楼红袖招。
Home
Categories
Archives
Tags
About
Home
I2C 内部集成电路总线接口
I2C 内部集成电路总线接口
取消
I2C 内部集成电路总线接口
由
ctaoist
发布于 2020-01-08
·
最后更新:2021-12-04
1
## 简介 为两线串行接口,一条数据线 SDA,一条时钟线 SCL,可用于 MCU 和外部 I2C 设备的通讯。有标速(100kHz)、快速(400kHz)、快速+(1MHz)模式和Ultra Fast-mode(5MHz), 支持SMBus(系统管理总线)、 PMBus(电源管理总线)和SAM_V(验证安全控制模式),7 位和 10 位的地址模式和广播寻址。 ## 信号定义 时钟信号的高电平期间 SDA 线上的数据必须稳定。只有在时钟信号 SCL 变低的时候数据线 SDA 的电平状态才能跳变 所有的数据传输起始于一个 START(S)结束于一个 STOP(P) START 起始位定义为,在 SCL 为高时, SDA 线上出现一个从高到低的电平转换(下降沿)。 STOP 结束位定义为,在 SCL 为高时, SDA 线上出现一个从低到高的电平转换(上升沿)。 START、STOP和数据位的区别: START、STOP在 SCL 为高时变化。 数据位在 SCL 为高时稳定,为低时变化。SCL线拉低功能是为了避免在接收时发生上溢错误以及在发送时发生下溢错误,SCL被从机拉低是表明从机在执行优先级更高的任务。 应答信号(ACK)的定义:发送器在应答时钟脉冲期间(第9个clk)释放SDA线,接收器将SDA线拉低,并在此时钟脉冲的高电平期间保持稳定的低电平;反之就是NACK。 ## 时钟同步 两个主机可以同时在空闲总线上开始传送数据,通过时钟同步和仲裁来决定哪个主机获得总线的控制权,单主机不需要时钟同步和仲裁。 SCL线被有最长低电平周期的器件保持在低电平(多个主设备时钟的clk的线与,所以要配成开漏,开漏需要外部上拉才可输出高电平,所以可以避免短路),时钟同步是硬件自动完成,时钟同步以后所有主设备的时钟周期都一样,低电平时间以最长低电平为准,高电平以最短高电平为准。 ## 仲裁 仲裁逐位进行,在每一位的仲裁期间,当SCL为高时,每个主机都检查SDA电平是否和自己发送的相同(多个设备SDA线也是线与在一起)。仲裁的过程需要持续很多位,当检测到SDA总线上的电平和自己不一样,则认为自己仲裁失败,关闭自己的 SDA 输出驱动。并不影响最终的数据传输(赢得仲裁的总线传输正确的数据)。 I2C 设备都是通过地址唯一的地址进行识别。有主机发送,主机接受,从机发送,从机接受共4种模式。 ## 地址格式 ### 7位地址 7位地址是一个字节中的高7位,最后一位是读写位:0表示主机发送,1表示主机接收。 ### 10位地址 10位地址由两个地址字节组成:第一个字节为`11110XX(R/W)`,`XX`是10位地址中最高的两位,最后一位仍然是读写位;第二个字节为10位地址的低8位。 主机发送时只需要发2个字节,特别地,主机接收时主机需要发3个地址字节,第一个字节的读写位是0,第三个字节的读写位是1:  ### 保留地址 |Slave address | R/W bit | Description | | -- | -- | -- | |0000 000 | 0 | general call address (广播地址)| |0000 000 | 1 | START byte| |0000 001 | X | CBUS address| |0000 010 | X | reserved for different bus format| |0000 011 | X | reserved for future purposes| |0000 1XX | X | Hs-mode master code| |1111 1XX | 1 | device ID| |1111 0XX | X | 10-bit slave addressing| ## 广播功能 广播功能是向0x00地址发送两个字节,第一个字节是0x00(广播地址),读写位是0时(主机向多个从机发送信息),第二个字节有3种情况: - 0b0000 0110:复位并写从机地址可编程部分 - 0b0000 0100:写从机地址可编程部分 - 0b0000 0000:不允许使用 如果读写位是1,则表明硬件主设备(键盘等)发送消息,硬件主设备事先不知道消息必须传输到哪个设备,所以第二个字节的高7位是硬件主设备的地址,以此来标记自己,如下图所示:  还有种方案就是在系统复位后硬件主设备工作在从机接收模式,由别的主机告诉它该往哪个从机发送数据,然后再切回主机发送模式,直接往确定地址的从机发送数据,就不用广播功能了。 ## 流程 I2C从机检测到I2C总线上的START起始位之后,就开始从总线上接收地址,之后会把从总线接收到的地址和自身的地址(通过软件编程)进行比较,一旦两个地址相同,I2C从机将发送一个确认应答(ACK),并响应总线的后续命令:发送或接收所要求的数据。如果开启了广播呼叫,则I2C从机始终对一个广播地址(0x00) 发送确认应答。 I2C主机负责产生START起始位和STOP结束位来开始和结束一次传输,并且负责产生SCL时钟。如果主机发送数据,则从机给应答;如果主机接受数据,则主机给应答。主机接收到的倒数第二个字节时产生NACK(不应答最后一个字节),然后才是停止位。 一次传输中,可以传输多个字节,最先传输最高位(MSB),每个字节结束后有个应答位;如果从机忙时可以拉低SCL线,使主机进入等待状态。 ## 读取从设备 Device ID 1. 起始位 2. 主机发送`1111 1000`,然后发送从机地址,此时不关心读写位 3. 主机发送`1111 1001`,从机开始往总线上发送 Device ID 4. 主机发送`NACK`和`STOP`结束此次通信。 ## SMBus 总线 是一种结构简单的单端双线制总线,是I2C的一种衍生总线形式,主要用于计算机主板上的低带宽设备间通信,尤其是与电源相关的芯片,采用I2C的硬件寻址方式,但在I2C的基础上增加了二级软件处理,实现了动态地址分配,支持设备热插拔。 SMBus 总线有两个版本: - 1.0: 低功耗 - 2.0:高功耗 SMBus 超时特性:假如某个通信耗时太久,便会自动复位设备(上限为35ms)。这就解释了为什么最小时钟周期为 10kHz——为了防止长时间锁死总线(从机长时间拉低SCL)。 SMBus 警报:SMBus 还有一个额外的共享的中断信号,称为SMBALERT#。从机上发生事件后,可通过这个信号通知主机来访问从机。还定义了主机提醒协议( Host Notify Protocol)。 为了支持 ARP 协议(地址解析协议),软件还需要实现ARP协议中的功能;支持SMBus警告模式,软件需要实现相应的功能。 ## SAM_V 支持 增加两个附加的引脚: txframe 和 rxframe。txframe是一个输出引脚,在主机模式时, 当该引脚置高时,表示 I2C 正在忙。 rxframe 是一个输入引脚,它应该和 SMBALERT 信号复用。 ## PMBus - Power Management Bus 电源管理总线基于 SMBus V1.1 版本。 [www.pmbus.org](www.pmbus.org) ## Ultra Fast-mode 这个协议的读写位只能是0(只能写),第9位的ACK被忽略(始终是高),保留第9位仅是为了兼容I2C标准协议,时钟不能被从机拉低,只能主机向从机发送数据,所以也不能读取从设备的 Device ID。 通过推挽方式驱动,不能进行线与,所以不支持多主机(比如仲裁、时钟同步功能,需要软件调度和硬件做好隔离,如果确实需要多主机),从机可以有多个。 ## CBUS compatibility 兼容 CBUS 总线。
嵌入式
I2C
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
ROS修改 MTU 和 MSS 解决上网慢和页面显示不全问题
WireGuard 搭建组网教程
EPUB 格式详解
Quartus ii 调用 Modelsim
vscode + verilog 环境配置
热门标签
Tensorflow
VPN
Linux
Router
虚拟组网
ROS
zerotier
C++
WIn10
Math
文章目录
应对PPPOE拨号用户24/48小时断线一次
浅谈 Pandoc 将 Markdown 转成 PDF