资源描述
I2C总线协议及工作原理
一、 概述
1、 I2C总线只有两根双向信号线。一根是数据线SDA, 另一根是时钟线SCL。
SCL: 上升沿将数据输入到每个EEPROM器件中; 下降沿驱动EEPROM器件输出数据。(边缘触发)
SDA: 双向数据线, 为OD门, 与其它任意数量OD与OC门成"线与"关系。
I2C总线经过上拉电阻接正电源。当总线空闲时, 两根线均为高电平(SDL=1;SCL=1)。连到总线上任一器件输出低电平, 都将使总线信号变低, 即各器件SDA及SCL都是线“与”关系。
2、 主设备与从设备
系统中全部外围器件都含有一个7位"从器件专用地址码", 其中高4位为器件类型, 由生产厂家制订, 低3位为器件引脚定义地址, 由使用者定义。主控器件经过地址码建立多机通信机制, 所以I2C总线省去了外围器件片选线, 这么不管总线上挂接多少个器件, 其系统仍然为简约二线结构。终端挂载在总线上, 有主端和从端之分, 主端必需是带有CPU逻辑模块, 在同一总线上同一时刻使能有一个主端, 能够有多个从端, 从端数量受地址空间和总线最大电容 400pF限制。
主端关键用来驱动SCL line;
从设备对主设备产生响应;
二者都能够传输数据, 不过从设备不能提议传输, 且传输是受到主设备控制。
二、 协议
1.空闲状态
I2C总线总线SDA和SCL两条信号线同时处于高电平时, 要求为总线空闲状态。此时各个器件输出级场效应管均处于截止状态, 即释放总线, 由两条信号线各自上拉电阻把电平拉高。
2.起始位与停止位定义:
起始信号: 当SCL为高期间, SDA由高到低跳变; 开启信号是一个电平跳变时序信号, 而不是一个电平信号。
停止信号: 当SCL为高期间, SDA由低到高跳变; 停止信号也是一个电平跳变时序信号, 而不是一个电平信号。
起始和终止信号都是由主机发出, 在起始信号产生后, 总线就处于被占用状态; 在终止信号产生后, 总线就处于空闲状态。
接收器件收到一个完整数据字节后, 有可能需要完成部分其它工作, 如处理内部中止服务等, 可能无法立即接收下一个字节, 这时接收器件能够将SCL线拉成低电平, 从而使主机处于等候状态。直到接收器件准备好接收下一个字节时, 再释放SCL线使之为高电平, 从而使数据传送能够继续进行。
3.ACK
发送器每发送一个字节, 就在时钟脉冲9期间释放数据线, 由接收器反馈一个应答信号。 应答信号为低电平时, 要求为有效应答位(ACK简称应答位), 表示接收器已经成功地接收了该字节; 应答信号为高电平时, 要求为非应答位(NACK), 通常表示接收器接收该字节没有成功。 对于反馈有效应答位ACK要求是, 接收器在第9个时钟脉冲之前低电平期间将SDA线拉低, 而且确保在该时钟高电平期间为稳定低电平。 假如接收器是主控器, 则在它收到最终一个字节后, 发送一个NACK信号, 以通知被控发送器结束数据发送, 并释放SDA线, 方便主控接收器发送一个停止信号P。
以下图逻辑分析仪采样结果: 释放总线后, 假如没有应答信号, sda应该一直连续为高电平, 不过如图中蓝色虚线部分所表示, 它被拉低为低电平, 证实收到了应答信号。
这里面给我们两个信息是: 1)接收器在SCL上升沿到来之前低电平期间拉低SDA; 2)应答信号一直保持到SCL下降沿结束; 正如前文红色标识所指出那样。
4.数据有效性:
I2C总线进行数据传送时, 时钟信号为高电平期间, 数据线上数据必需保持稳定, 只有在时钟线上信号为低电平期间, 数据线上高电平或低电平状态才许可改变。
5.数据传送:
在I2C总线上传送每一位数据都有一个时钟脉冲相对应(或同时控制), 即在SCL串行时钟配合下, 在SDA上逐位地串行传送每一位数据。数据位传输是边缘触发。
工作过程
总线上全部通信都是由主控器引发。在一次通信中, 主控器与被控器总是在饰演着两种不一样角色。
1.主设备向从设备发送数据
主设备发送起始位, 这会通知总线上全部设备传输开始了, 接下来主机发送设备地址, 与这一地址匹配slave将继续这一传输过程, 而其它slave将会忽略接下来传输并等候下一次传输开始。主设备寻址到从设备后, 发送它所要读取或写入从设备内部寄存器地址; 以后, 发送数据。数据发送完成后, 发送停止位。(这段看不懂就别看了, 没什么用)
写入过程以下:
发送起始位
1)发送从设备地址和读/写选择位; 释放总线, 等到EEPROM拉低总线进行应答; 假如EEPROM接收成功, 则进行应答; 若没有握手成功或者发送数据错误时EEPROM不产生应答, 此时要求重发或者终止。
2)发送想要写入内部寄存器地址; EEPROM对其发出应答;
3)发送数据
4)发送停止位.
5)EEPROM收到停止信号后, 进入到一个内部写入周期, 大约需要10ms, 此间任何操作都不会被EEPROM响应
具体:
需要说明是: ①主控器经过发送地址码与对应被控器建立了通信关系, 而挂接在总线上其它被控器即使同时也收到了地址码, 但因为与其本身地址不相符合, 所以提前退出与主控器通信;
2.主控器读取数据过程:
读过程比较复杂, 在从slave读出数据前, 你必需先要告诉它哪个内部寄存器是你想要读取, 所以必需先对其进行写入(dummy write):
1)发送起始位;
2)发送slave地址+write bit set;
3)发送内部寄存器地址;
4)重新发送起始位, 即restart;
5)重新发送slave地址+read bit set;
6)读取数据
主机接收器在接收到最终一个字节后, 也不会发出ACK信号。于是, 从机发送器释放 SDA线, 以许可主机发出P信号结束传输。
7)发送停止位
具体:
2、 数据传送格式
(1)字节传送与应答
每一个字节必需确保是8位长度。数据传送时, 先传送最高位(MSB), 每一个被传送字节后面都必需跟随一位应答位(即一帧共有9位)。
因为某种原因从机不对主机寻址信号应答时(如从机正在进行实时性处理工作而无法接收总线上数据), 它必需将数据线置于高电平, 而由主机产生一个终止信号以结束总线数据传送。
假如从机对主机进行了应答, 但在数据传送一段时间后无法继续接收更多数据时, 从机能够经过对无法接收第一个数据字节“非应答”通知主机, 主机则应发出终止信号以结束数据继续传送。
当主机接收数据时, 它收到最终一个数据字节后, 必需向从机发出一个结束传送信号。这个信号是由对从机“非应答”来实现。然后, 从机释放SDA线, 以许可主机产生终止信号。
(2)数据帧格式
I2C总线上传送数据信号是广义, 既包含地址信号, 又包含真正数据信号。
在起始信号后必需传送一个从机地址(7位), 第8位是数据传送方向位(R/), 用“0”表示主机发送数据(T), “1”表示主机接收数据(R)。每次数据传送总是由主机产生终止信号结束。不过, 若主机期望继续占用总线进行新数据传送, 则能够不产生终止信号, 立即再次发出起始信号对另一从机进行寻址。
在总线一次数据传送过程中, 能够有以下多个组合方法:
a、 主机向从机发送数据, 数据传送方向在整个传送过程中不变:
注: 有阴影部分表示数据由主机向从机传送, 无阴影部分则表示数据由从机向主机传送。 A表示应答, 表示非应答(高电平)。S表示起始信号, P表示终止信号。
b、 主机在第一个字节后, 立刻由从机读数据
c、 在传送过程中, 当需要改变传送方向时, 起始信号和从机地址都被反复产生一次, 但两次读/写方向位恰好反相。
6、 总线寻址
I2C总线协议有明确要求: 采取7位寻址字节(寻址字节是起始信号后第一个字节)。
(1) 寻址字节位定义
D7~D1位组成从机地址。D0位是数据传送方向位, 为“0”时表示主机向从机写数据, 为“1”时表示主机由从机读数据。
主机发送地址时, 总线上每个从机都将这7位地址码与自己地址进行比较, 假如相同, 则认为自己正被主机寻址, 依据R/位将自己确定为发送器或接收器。
从机地址由固定部分和可编程部分组成。在一个系统中可能期望接入多个相同从机, 从机地址中可编程部分决定了可接入总线该类器件最大数目。如一个从机7位寻址位有4位是固定位, 3位是可编程位, 这时仅能寻址8个一样器件, 即能够有8个一样器件接入到该I2C总线系统中。
(2)寻址字节中特殊地址
固定地址编号0000和1111已被保留作为特殊用途。
起始信号后第一字节8位为“0000 0000”时, 称为通用呼叫地址。通用呼叫地址用意在第二字节中加以说明。格式为:
第二字节为 06H(0110)时, 全部能响应通用呼叫地址从机器件复位, 并由硬件装入从机地址可编程部分。能响应命令从机器件复位时不拉低SDA和SCL线, 以免堵塞总线。
第二字节为 04H(0100)时, 全部能响应通用呼叫地址并经过硬件来定义其可编程地址从机器件将锁定地址中可编程位, 但不进行复位。
假如第二字节方向位B为“1”, 则这两个字节命令称为硬件通用呼叫命令。
在这第二字节高7位说明自己地址。接在总线上智能器件, 如单片机或其她微处理器能识别这个地址, 并与之传送数据。硬件主器件作为从机使用时, 也用这个地址作为从机地址。格式为:
在系统中另一个选择可能是系统复位时硬件主机器件工作在从机接收器方法, 这时由系统中主机先告诉硬件主机器件数据应送往从机器件地址, 当硬件主机器件要发送数据时就能够直接向指定从机器件发送数据了。
(3) 起始字节
起始字节是提供给没有I2C总线接口单片机查询I2C总线时使用特殊字节。
不含有I2C总线接口单片机, 则必需经过软件不停地检测总线, 方便立刻地响应总线请求。单片机速度与硬件接口器件速度就出现了较大差异, 为此, I2C总线上数据传送要由一个较长起始过程加以引导。
引导过程由起始信号、 起始字节、 应答位、 反复起始信号(Sr)组成。
请求访问总线主机发出起始信号后, 发送起始字节(0000 0001), 另一个单片机能够用一个比较低速率采样SDA线, 直到检测到起始字节中7个“0”中一个为止。在检测到SDA线上高电平后, 单片机就能够用较高采样速率, 方便寻求作为同时信号使用第二个起始信号Sr。
在起始信号后应答时钟脉冲仅仅是为了和总线所使用格式一致, 并不要求器件在这个脉冲期间作应答。
总线数据传送模拟
展开阅读全文