i2c 协议解析【转】

转自:http://blog.csdn.net/g_salamander/article/details/8016698

版权声明:本文为博主原创文章,未经博主允许不得转载。

1、基本概念

主机            初始化发送,产生时钟信号和终止发送的器件

从机            被主机寻址的器件

发送器        发送数据到总线的器件

接收器        从总线接收数据的器件

多主机        同时有多于一个主机尝试控制总线 但不破坏报文

仲裁           是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程

同步           两个或多个器件同步时钟信号的过程

2、硬件结构

每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。这种电路具有两个特点:

(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑; 
(2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。

3、时钟同步

如果从机希望主机降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主机,当主机在准备下一次传送发现SCL的电平被拉低时就进行等待,直至从机完成操作并释放SCL线的控制控制权。这样以来,主机实际上受到从机的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步问题。

4、主机发送数据流程

(1)主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始

(2)主机接着发送一个命令字节。该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0)

(3)相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0)

(4)主机收到从机的应答信号后开始发送第一个字节的数据

(5)从机收到数据后返回一个应答信号 ACK

(6)主机收到应答信号后再发送下一个数据字节

(7)当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信

注意:①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;②主机的一次发送通信,其发送的数据数量不受限制。主机是通过
P 信号通知发送的结束,从机收到 P 信号后退出本次通信;③主机的每一次发送后都是通过从机的 ACK
信号了解从机的接收状况,如果应答错误则重发。

5、主机接收数据流程

(1)主机发送启动信号后,接着发送命令字节(其中 R/W=1)

(2)对应的从机收到地址字节后,返回一个应答信号并向主机发送数据

(3)主机收到数据后向从机反馈一个应答信号

(4)从机收到应答信号后再向主机发送下一个数据

(5)当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”,从机收到ASK=1 的非应答信号后便停止发送

(6)主机发送非应答信号后,再发送一个停止信号,释放总线结束通信

注意:主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送)。

6、总线死锁原因分析

I2C总线写操作过程中,主机在产生启动信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从机输出应答信号,将SDA信号拉为低电平。如果这个时候主机异常复位,SCL就会被释放为高电平。此时,如果从机没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于主机来说,复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,主机等待从机释放SDA信号,而同时从机又在等待主机将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作时,从机应答后输出数据,如果在这个时刻主机异常复位而此时从机输出的数据位正好为0,也会导致I2C总线进入死锁状态。

解决方案通常有如下几种:

(1)将从机的电源设计为可控,当发生总线死锁的时将从机复位

(2)可以在从机的程序中加入监测功能,如果总线长时间被拉低则释放对总线的控制

(3)在主机中增加I2C总线恢复程序。每次主机复位后,如果检测到SDA被拉低,则控制SCL产生<=9个时钟脉冲(针对8位数据的情况),每发送一个时钟脉冲就检测SDA是否被释放,如果SDA已经被释放就再模拟产生一个停止信号,这样从机就可以完成被挂起的读写操作,从死锁状态中恢复过来。这种方法有一定的局限性,因为大部分主机的I2C模块由内置的硬件电路来实现,软件并不能够直接控制SCL信号模拟产生需要时钟脉冲

7、处理器的I2C模块会在如下所述的情况产生中断信号

RX_UNDER    当处理器通过IC_DATA_CMD寄存器读取接收缓冲器为空时置位

RX_OVER      当接收缓冲器被填满,而且还有数据从外设发送过来时被置位;缓冲器被填满后接收的数据将会丢失

RX_FULL       当接收缓冲器达到或者超过IC_RX_TL寄存器中规定的阈值时被置位;当数据低于阈值时标志位将被自动清除

TX_OVER      当发送缓冲器被填满,而且处理器试图发送另外的命令写IC_DATA_CMD寄存器时被置位

TX_EMPTY    当发送缓冲器等于或者低于IC_TX_TL寄存器中规定的阈值时被置位;当数据高于阈值时标志位将被自动清除

RD_REQ        当i2c模块作为从机时并且另外的主机试图从本模块读取数据时被置位

TX_ABRT       当i2c模块无法完成处理器下达的命令时被置位,有如下几种原因:

* 发送地址字节后没有从机应答

* 地址识别成功后主机发送的数据从机没有应答

* 当i2c模块只能作为从机时试图发送主机命令

* 当模块的RESTART功能被关闭,而处理试图完成的功能必须要RESTART功能开启才能完成

* 高速模块主机代码被应答

* START BYTE被应答

* 模块仲裁失败

无论标志位什么时候被置位,发送缓冲器和接收缓冲器的内容都会被刷新

RX_DONE      当i2c模块作为从机发送数据时,如果主机没有应答则置位;这种情况发生在i2c模块发送最后一个字节数据时,表明传输结束

ACTIVITY       表明i2c模块正在活动,这个标志位将会一直保持直到用以下4种方式清除:

* 关闭i2c

* 读取IC_CLR_ACTIVITY寄存器

* 读取IC_CLR_INTR寄存器

* 系统重启

即使i2c模块是空闲的,这个标志仍然需要被置位直到被清除,因为这表明i2c总线上有数据正在传输

STOP_DET     表明i2c总线上产生了STOP信号,无论模块作为主机还是从机

START_DET   表明i2c总线上产生了START信号,无论模块作为主机还是从机

时间: 2024-07-29 04:15:53

i2c 协议解析【转】的相关文章

i2c知识总结及协议解析

知识总结部分: 一. 技术性能: 工作速率有100K和400K两种: 支持多机通讯: 支持多主控模块,但同一时刻只允许有一个主控: 由数据线SDA和时钟SCL构成的串行总线: 每个电路和模块都有唯一的地址: 每个器件可以使用独立电源 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线: 每次通讯以START开始,以STOP结束: 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R. /W位为0表示由主控向被控器件写

I2C协议-&gt;裸机程序-&gt;adapter驱动程序分析

开发板:mini2440 内核  :linux2.6.32.2 参考  :韦东山毕业班I2C视频教程 1.i2c协议简要分析 i2c中线是一种由 PHILIPS 公司开发的串行总线,用于连接微控制器及其外围设备,它具有以下特点. 1.只有两条总线线路:一条串行数据线SDA,一条串行时钟线SCL. 2.每个连接到总线的器件都可以使用软件根据它的唯一的地址来确定. 3.传输数据的设备之间是简单的主从关系. 4.主机可以用作主机发送器或者主机接收器. 5.它是一个真正的多主机总线,两个或多个主机同时发

twemproxyRedis协议解析探索——剖析twemproxy代码正编

这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是没有问题的,有限状态机仅仅能帮助我们更好地理解twemproxyRedis协议解析代码部分. redis 协议 这边我们首先需要简单介绍一下redis协议.参考自https://redis.io/topics/protocol redis协议即RESP 的数据类型有5类,简单字符串.错误.整数.大字

SOCKS5 协议解析

意图 SOCKS5 是一个代理协议,旨在为位于 Intranet 防火墙后的用户提供访问 Internet 的代理服务(Intranet,你没听错,这是个有一定年头的协议,其 RFC 提案的时间比 HTTP 1.0 还要早两个月). 代理 根据 HTTP 1.1 的定义,proxy 是: An intermediary program which acts as both a server and a client for the purpose of making requests on be

通用轻量级二进制格式协议解析器

在通信协议中,经常碰到使用私有协议的场景,报文内容是肉眼无法直接看明白的二进制格式.由于协议的私有性质,即使大名鼎鼎的 Wireshark,要解析其内容,也无能为力. 面对这种情况,开发人员通常有两个办法:第一,对照报文内容和协议规范进行人工分析(假设内容没有经过加密.压缩):第二,编程实现协议报文的解析(源于程序员的懒惰 ^_^). 很明显,第二条道路是主流.目前比较常见的实现方式是开发对应的 Wireshark 插件,包括 C.Lua 等插件.当然,插件完成后需要运行 Wireshark 才

模拟I2C协议学习点滴之原理框架

I2C是一种串行总线协议. 目前几种常用的串行总线有UART.SPI和I2C协议.UART协议的总线只有两条,发送(Transmit:TX)和接收(Receive:RX),没有时钟信号,这就要求两位数据的间隔要相同,它传送数据有严格的规定,每个数据以相同的位串形式传送,每个位串由起始位.数据位.奇偶位校验和停止位组成.SPI有三线和四线模式,四条总线分别为SCLK(时钟).MISO(主器件数据输入,从器件数据输出).MOSI(主器件数据输出,从器件数据输入).SS(从器件使能信号),SPI总线由

协议解析Bug分析

协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描述 腾讯收购的Foxmail客户端可以作为outlook客户端的替代品与Exchange服务端进行交互完成邮件收发.而我们所要做的就是让邮件经过我们代理的优化处理. 这时候问题来了,Outlook客户端经由我们代理没有任何问题:但是换成Foxmail就会有错误弹窗,错误号:0x000006BE.但是如果不经过代理,Foxmail收发邮件一切正常. 很明显,是代理出了问题.  

视音频数据处理入门:UDP-RTP协议解析

===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理入门:PCM音频采样数据处理 视音频数据处理入门:H.264视频码流解析 视音频数据处理入门:AAC音频码流解析 视音频数据处理入门:FLV封装格式解析 视音频数据处理入门:UDP-RTP协议解析 ===================================================

(原创) 巩固理解I2C协议(MCU,经验)

    题外话:这几天天气突然转冷了.今天已是11月23日了,查查黄历,昨天(11月22日)刚好是小雪,一夜温度骤降,果然老祖先的经验有灵验!冬天来了,还是多加加衣服,注意保暖! 1.Abstract     前些天借用他人的一块MCS-51开发板来做实验,不想这块板子与我刚开始接触MCS-51的板子一样,实在是太亲切了!现在回过来看这块板子,功能算不上是太强大,麻雀虽小五脏俱全,该有的功能都有.于是又忍不住捣腾这块板子,倒不是写小程序一块,看着电路图,到处连线测试一下功能,从中体会下最初的学习