文档库 最新最全的文档下载
当前位置:文档库 › I2C协议总结

I2C协议总结

I2C协议总结

串行总线I2C由数据线SDA和时钟线SCL构成,可实现完善的双工同步数据传输,能方便的构成多机系统和外围器件扩展系统,I2C采用器件地址的硬件设置方法,通过软件进行寻址。

I2C总线系统中,以共同挂接的I2C总线作为通信手段的每个器件均构成I2C总线的一个器件节点。根据节点是否带有智能,可将这些节点分为主器件节点和外围器件节点。主器件节点可作为主控器,用来对总线进行主动控制。在一次通信过程中,由主控器负责向总线上发送启动信号、同步时钟信号、被控器件地址码、重启动信号和停止信号等。而被控器(即受控器件)可分别由这两种节点充当

如果在系统中同时存在2个或2个以上的主器件节点企图控制总线,则形成总线冲突状态。由于I2C引入了同步时钟和总线仲裁机制,即使出现总线冲突也不会造成信息丢失。

发生总线冲突时,为了避免信息丢失,需要进行总线仲裁以决定谁是主控器。总线仲裁是通过裁定SDA线上的控制权来解决的。时钟同步是连接到SCL线上的所有器件进行“线与”实现的。只要有一个器件向SCL输出低电平,SCL就为低电平。因此SCL线的低电平时间由时钟低电平期最长的器件决定,而高电平时间由时钟高电平期最短的器件决定,由此形成了时钟的同步。

下图所示为一次完整的通信过程的时序。

图1 i2c总线数据传送时序

(注:图中,SCL线上1~7位为7位地址码,第8位为读写位R\~D,第9位为ACK应答位,紧接着的为第一个数据字节,然后是一位应答位,后面继续第2个数据字节。)

如图所示,主控器在检测到总线空闲(数据线SDA和时钟线SCL同时处于高电平状态)时,首先发送一个启动信号S(在时钟线SCL保持高电平期间,数据线SDA上电平被拉低),它标志着一次数据传输的开始。之后主控器发送一个地址字节包括7位地址码和一个读写位。被控器收到地址字节后反馈一个应答信号ACK=0,主控器接收到ACK后开始发送第一

个数据字节,被控器接收到第一个数据字节后,由反馈一个应答信号ACK=0。主控器收到应答信号后开始传送第二个数据字节。依次循环,主控器发送完数据后,就发送一个停止信号P(SCL保持高电平期间,SDA被释放,返回高电平),并释放总线,使得总线返回空闲状态。

在通信过程应注意以下6点:

1 进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL 为低时,才允许SDA线上电平改变状态。并且每个字节传送时都是高位在前。

2 对于应答信号,ACK=0时为有效应答位,说明接收器已经成功接收到该字节,若为1则说明接受不成功。

3 如果被控器需要延迟下一个下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主控器进入等待状态。

4 主控器完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号Sr。它既作为前一次数据传输的结束,又作为后一次传输的开始。

5 总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件。

6 在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为挂接在总线上的任一器件将SCL锁定在低电平即可。

什么是I2C协议?

什么是I2C协议?

I2C协议是单片机与其它芯片常用的通讯协议,由于只需要两根线,所以很好使用。

1. I2C总线的特点

(1)只要求两条总线线路一条串行数据线SDA 一条串行时钟线SCL

(2) 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主发送器或主机接收器

(3)它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏

(4)串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达.4Mbit/s

(5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整

(6) 连接到相同总线的IC数量只受到总线的最大电容400pF 限制

2. I2C总线术语的定义

3. I2C协议总线信号时序分析

3.1 数据的有效性:

SDA 线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。如图3.1 I2C总线的位传输所示。

图3.1 I2C总线的位传输

3.2 起始和停止条件

当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件。

当SCL线是高电平时,SDA线由低电平向高电平切换表示停止条件。如图3.2 I2C起始和停止条件所示。

图3.2 起始和停止条件

3.3 总线空闲状态

SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;

3.4 数据传输与应答信号ACK

发送到SDA线上的数据必须是8位的。每次传输可以发送的数据不受限制。每个字节后必须在时钟的第9个脉冲期间释放数据总线(SDA为高),由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。如图3.3 I2C总线响应。

图3.3 I2C总线响应

首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。如图3.4 I2C总线数据传输所示。

图3.4 I2C总线数据传输

4. 地址格式

数据的传输遵循如图4.1 完整的数据传送所示,在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/ — W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。如图3.5 I2C 总线完整的数据传输。

图3.5 I2C总线完整的数据传输

I2C协议

在消费者电子电讯和工业电子中看上去不相关的设计里经常有很多相似的地方例如几乎每个系统都包括

" 一些智能控制通常是一个单片的微控制器

" 通用电路例如LCD 驱动器远程I/O 口RAM EEPROM 或数据转换器

" 面向应用的电路譬如收音机和视频系统的数字调谐和信号处理电路或者是音频拨号电话的DTMF 发生器

为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips 开发了一个简单的双向两线总线实现有效的IC 之间控制这个总线就称为Inter IC 或I2C 总线现在Philips包括超过150 种CMOS 和双极性兼容I2C 总线的IC 可以执行前面提到的三种类型的功能所有符合I2C总线的器件组合了一个片上接口使器件之间直接通过I2C 总线通讯这个设计概念解决了很多在设计数字控制电路时遇到的接口问题。

下面是I2C 总线的一些特征

" 只要求两条总线线路一条串行数据线SDA 一条串行时钟线SCL

" 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器

" 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏

" 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s

" 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整

" 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制.

符合I2C 总线的IC 不只帮助了设计者它们也使设备厂商得到很多益处因为

" 简单的两线串行I2C 总线将互联减到最小因此IC 的管脚更少而且PCB 的线

路也减少结果使PCB 更小和更便宜

" 完全完整的I2C 总线协议不需要地址译码器和其他胶合逻辑

" I2C 总线的多主机功能允许通过外部连接到生产线快速测试和调整最终用户的设备

" 符合I2C总线的IC提供小型和超小型以及DIL封装,甚至减少了IC 的空间要求.这些只是一些益处.另外兼容I2C 总线的IC 通过允许简单地构造设备变量和保持设计是最新的简易升级功能增加了系统设计的灵活性.这样整个装置系列可以围绕一个基本的模型开发新设备的升级或者功能增强的模型,即扩展的存储器远程控制等等,可以简单地通过剪贴相应的IC 到总线上产生,如果需要更大的ROM 只需要从我们广泛的IC 中选择一个有更大ROM 的微控制器就可以了.由于新的IC 要取代旧的增加新功能到装置或者提升它的性能,只要简单地从总线上移去过时的IC 然后换上它的后续IC

就可以了.

I2C 总线规范

对于面向8 位的数字控制应用譬如那些要求用微控制器的,要建立一些设计标准:

" 一个完整的系统通常由至少一个微控制器和其他外围器件例如存储器和I/O 扩展器组成

" 系统中不同器件的连接成本必须最小

" 执行控制功能的系统不要求高速的数据传输

" 总的效益由选择的器件和互连总线结构的种类决定

产生一个满足这些标准的系统需要一个串行的总线结构,尽管串行总线没有并行总线的数据吞吐能力,但它们只要很少的配线和IC 连接管脚.

总线不仅仅是互连的线,还包含系统通讯的所有格式和过程,串行总线的器件间通讯必须有某种形式的协议,避免所有混乱数据丢失和妨碍信息的可能性.快速器件必须可以和慢速器件通讯,系统必须不能基于所连接的器件,否则不可能进行修改或改进,应当设计一个过程决定哪些器件何时可以控制总线,而且如果有不同时钟速度的器件连接到总线必须定义总线的时钟源.所有这些标准都在I2C 总线的规范中.

术语描述

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

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

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

从机被主机寻址的器件

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

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

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

SDA 和SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压,当总线空闲时这两条线路都是高电平.连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能.I2C 总线上数据的传输速率在标准模式

下可达100kbit/s 在快速模式下可达400kbit/s 在高速模式下可达3.4Mbit/s 连接到总线的接口数量只由总线电容是400pF 的限制决定。

SDA 线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变.

起始和停止条件

在I2C 总线中唯一出现的是被定义为起始S 和停止P 条件的情况

其中一种情况是在SCL 线是高电平时SDA 线从高电平向低电平切换这个情况表示起始条件;当SCL 是高电平时SDA 线由低电平向高电平切换表示停止条件.起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后总线被认为再次处于空闲状态.

如果产生重复起始条件,而不产生停止条件总线会一直处于忙的状态.此时的起始条件和重复起始条件在功能上是一样的,如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件十分简便.但是没有这种接口的微控制器,在每个时钟周期至少要采样SDA 线两次来判别有没有发生电平切换。

传输数据笔记

字节格式

发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制.每个字节后必须跟一个响应位,首先传输的是数据的最高位MSB.

如果从机要完成一些其他功能后,例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平迫使主机进入等待状态.当从机准备好接收下一个数据字节,并释放时钟线SCL 后数据传输继续.

在一些情况下可以用与I2C 总线格式不一样的格式.例如兼容CBUS 的器件,甚至在传输一个字节时,用这样的地址起始的报文可以通过产生停止条件来终止.此时不会产生响应.

响应

数据传输必须带响应,相关的响应时钟脉冲由主机产生.在响应的时钟脉冲期间发送器释放SDA线,在响应的时钟脉冲期间,接收器必须将SDA 线拉低.使它在这个时钟脉冲的高电平期间保持稳定的低电平.

当从机不能响应从机地址时,例如它正在执行一些实时函数不能接收或发送.从机必须使数据线保持高电平主机,然后产生一个停止条件终止传输或者产生重复起始条件,开始新的传输.如果从机接收器,响应了从机地址,但是在传输了一段时间后不能接收更多数据字节.主机必须再一次终止传输.这个情况用从机在第一个字节后没有产生响应,来表示从机使数据线保持高电平.

主机产生一个停止或重复起始条件,如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一个响应向从机发送器通知数据结束.从机发送器必须释放数据线。

同步

所有主机在SCL 线上产生它们自己的时钟来传输I2C 总线上的报文,数据只在时钟的高电平周期有效.因此需要一个确定的时钟进行逐位仲裁.

时钟同步通过线与连接I2C 接口到SCL 线来执行这就是说,SCL 线的高到低切换会使器件开始数它们的低电平周期.而且一旦器件的时钟变低,电平它会使SCL 线保持这种状态.直到到达时钟的高电. 但是如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL 线的状态.因此,SCL 线被有最长低电平周期的器件保持低电平,此时低电平周期短的器件会进入高电平的等待状态.

当所有有关的器件数完了它们的低电平周期后,时钟线被释放.并变成高电平之后器件时钟和SCL线的状态没有差别,而且所有器件会开始数它们的高电平周期,首先完成高电平周期的器件会再次将SCL线拉低,这样产生的同步SCL 时钟的低电平周期由低电平时钟周期最长的器件决定而高电平周期由高电平时钟周期最短的器件决定.

用时钟同步机制作为握手

时钟同步机制除了在仲裁过程中使用外,还可以用于使能接收器处理字节级或位级的快速数据传输。

在字节级的快速传输中,器件可以快速接收数据字节,但需要更多时间保存接收到的字节或准备另一个要发送的字节,然后从机以一种握手过程在接收和响应一个字节后使SCL 线保持低电平,迫使主机进入等待状态,直到从机准备好下一个要传输的字节。

在位级的快速传输中,器件例如对I2C 总线有或没有限制的微控制器可以通过延长每个时钟的低电平周期减慢总线时钟,从而任何主机的速度都可以适配这个器件的内部操作速率。

7 位的地址格式

数据的传输格式在起始条件后发送了一个从机地址,这个地址共有7 位,紧接着的第8 位是数据方向位R/W, 0 表示发送,1 表示请求数据。数据传输一般由主机产生的停止位终止,但是如果主机仍希望在总线上通讯,它可以产生重复起始条件和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中可能有不同的读写格式。

可能的数据传输格式有

" 主机发送器发送到从机接收器,传输的方向不会改变;

" 在第一个字节后主机立即读从机,在第一次响应时,主机发送器变成主机接收器,从机接收器变成从机发送器。第一次响应仍由从机产生之前,发送了一个不响应信号的主机产生停止条件

" 复合格式。传输改变方向的时侯起始条件和从机地址都会被重复,但R/W 位取反。如果主机接收器发送一个重复起始条件,它之前应该发送了一个不响应信号。

7 位寻址

I2C 总线的寻址过程是通常在起始条件后的第一个字节决定了主机选择哪一个从机,例外的情况是可以寻址所有器件的广播呼叫地址。使用这个地址时,理论上所有器件都会发出一个响应,但是也可以使器件忽略这个地址广播呼叫。

地址的第二个字节定义了要采取的行动。

(1)第一个字节的位定义

第一个字节的头7 位组成了从机地址,最低位LSB 是第8 位,它决定了报文的方向;第一个字节的最低位是0 表示主机会写信息到被选中的从机;1 表示主机会向从机读信息。

当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较;如果一样器件会认为它被主机寻址;至于是从机接收器还是从机发送器都由R/W 位决定

(2)从机地址

由一个固定和一个可编程的部分构成,由于很可能在一个系统中有几个同样的器件;从机地址的可编程部分使最大数量的这些器件可以连接到I2C 总线上器件。可编程地址位的数量由它可使用的管脚决定,例如如果器件有 4 个固定的和3 个可编程的地址位,那么相同的总线上共可以连接8 个相同的器件。

I2C 总线委员会协调I2C 地址的分配,进一步的信息可以从最后列出的Philips 代理商处获得。保留的两组8 位地址0000XXX 和1111XXX 的自有用途。

我最近刚刚用I2C协议完成了两个芯片的通信,觉得有一点东西可以说,就写写吧。

这次做的是单片机和外围芯片的通信,其中时钟芯片PCF8563和EEPROM 24C01A 都是以I2C

协议进行通信,因此单片机必须编写软件模拟I2C协议。编写调试时注意以下几点:

1、I2C 协议规定时钟和信号线的高电平、低电平以及启动、停止条件都必须维持一段时间,一般的单片机很容易就满足,但是对于PIC系列等频率较高的单片机就必须注意,必要时

加入软件延时。例如I2C的停止条件必须大于4μS(不同的芯片数据略有不同),如果工作在20几兆的频率上,就很容易不满足这个条件。

2、I2C 协议规定,任何一次通信都从它开始的启动信号到最后的停止信号,都必须在1s

完成。这就给调试带来麻烦了。调试的时候一般总是要中断,停下来观察相应的数据是否正确,如果单片机在对外围芯片进行写入操作,就有可能在一个字节发送完毕后得不到来自外围芯片的确认信号。建议在观察时钟信号管脚SCL和信号线管脚SDA电平的时候可以采

取中断方式调试,但是最终要看写入是否成功,就必须运行。

3、有的芯片可以容忍一点对上位机I2C协议模拟软件的错误,有的就不行。这次我对PCF8

563的通信模拟软件编写完成后,需要编写对24C01A的通信模拟软件,二者都是用I2C协议

,因此我就照搬了PCF8563的软件,然后把管脚改了一下,结果就是不行。

后来发现我原来编写PCF8563的软件里面的停止条件子函数有错误,两个信号的时序顺序错了,但是这不会影响对PCF8563的读写。因为在停止通信之前PCF8563的读写是即时的,每一个字节读好了就好了,写好了就是写好了,停止条件不会对其有影响。而EEPROM 24C01A 就不一样了:只有在接收到正确的I2C停止条件以后,它才会将接收到的数据烧入EEPROM。如果协议有误,那么根本就无法写入数据,读出来的数据自然也就不正确了。

4、总体感觉,编写I2C协议模拟软件,只要细心,把时序弄清楚,应该就没有什么问题了。

本人还只是单片机的初学者,以上只是我的一点心得,很多不足,请大家指出!

I2C协议

2011-03-31 16:37

一、总述:

I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。

I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。

在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱, I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。

二、数据传送:

1、规定:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

2、起始信号和终止信号:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。

起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。

接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。

3、数据传送格式:

(1)、字节传送与应答:

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。

如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。

当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。

(2)、数据帧的格式:

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

在总线的一次数据传送过程中,可以有以下几种组合方式:

a、主机向从机发送数据,数据传送方向在整个传送过程中不变:

注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。

A表示应答, A非表示非应答(高电平)。S表示起始信号,P表示终止信号。

b、主机在第一个字节后,立即从从机读数据:

c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。

4、总线的寻址:

I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。

(1)寻址字节的位定义:

D7~D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。

主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。

从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。

5、典型信号模拟:

(1)、为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求。I2C 总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序:

(2)、典型信号模拟子程序:

起始信号:

Void T2CStart(void)

{ SDA = 1; //置数据线高电平

SomeNop( ); //延时

SCL = 1; //置时钟线高电平

SomeNop( ); //延时

SDA = 0; //置下降沿

SomeNop( );

}

终止信号:

void I2cStop(void)

{

SDA = 0; //置数据线低电平

SomeNop( );

SCL = 1; //置时钟线高电平

SomeNop( );

SDA = 1; //置数据线高电平

SomeNop( );

}

注意:在I2C总线的应用中应注意的事项总结为以下几点:

1)严格按照时序图的要求进行操作,

2)若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。

3)程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。

4)为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或

者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断

起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

传地址信号:传7位地址信号,由高位到低位,再加1位读/写标志。

传数据信号:数据按高位到低位的顺序进行传送。

停止信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:从端在接收完8位数据后,在时钟信号SCL为高电平时,设置数据信号SDA 为低电平,即为应答信号,表示一个字节数据接收完毕。

实验八 IIC通信协议

实验八I2C通信协议 一、实验目的: 1、培养学生阅读资料的能力; 2、加深学生对I2C总线通信协议的理解; 3、加强学生对模块化编程的理解; 二、实验环境: 1、硬件环境:PC机一台、单片机实验板一块、母头串口交叉线、USB电源线; 2、软件环境:keil uVision2集成开发环境; STC-ISP下载上位机软件; 三、实验原理: 要学会I2C通信协议的编程,关键是要看懂并掌握其时序图,理解对I2C通信协议相关子程序的实验编写。I2C通信协议的总线时序图如下所示: I2C总线时序图 I2C相关子程序的详细介绍 1、起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 2、结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 起始信号和结束信号的时序图如下所示: 起始信号和结束信号的时序图 起始信号的流程如下:

1、SCL和SDA拉高,保持时间约为0.6us-4us; 2、拉低SDA,保持时间为约为0.6us-4us; 3、拉低时钟线 结束信号的流程如下: 1、SCL置高电平,SDA置低电平,保持时间约为0.6us-4us 2、SDA拉高,保持时间约为1.2-4us; 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。 若未收到应答信号,由判断为受控单元出现故障。应答信号的时序图如下所示: 应答时序图 发送时的应答信号 ;**********应答信号********** ACK: SETB SDA ;数据线置高 SETB SCL ;时钟线置高 ACALL DELAY JB SDA,$ ;等待数据线变低 ACALL DELAY CLR SCL ;时钟线置低 RET 注意:这里如果数据线一直为高将进入死循环,所以一般我们都会在这做一个容错的处理。具体的程序如下: ACK: MOV R4,#00H SETB SDA SETB SCL LOP0: JNB SDA,LOP DJNZ R4,LOP0 ;循环255次 LOP: ACALL DEL CLR SCL RET 接收时的应答信号

简单的I2C协议理解 i2c程序(调试通过)

简单的I2C协议理解 一. 技术性能: 工作速率有100K和400K两种; 支持多机通讯; 支持多主控模块,但同一时刻只允许有一个主控; 由数据线SDA和时钟SCL构成的串行总线; 每个电路和模块都有唯一的地址; 每个器件可以使用独立电源 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线; 每次通讯以START开始,以STOP结束; 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据; 当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号; 每个数据字节在传送时都是高位(MSB)在前; 写通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节; 5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 读通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信

号(ACK); 4. 主控收到ACK后释放数据总线,开始接收第一个数据字节; 5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 四. 总线信号时序分析 1. 总线空闲状态 SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高; 2. 启动信号START 时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态; 3. 停止信号STOP 时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。 4. 数据传送 SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。 5. 应答信号ACK I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。 6. 无应答信号NACK 在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途: a. 一般表示接收器未成功接收数据字节; b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。 五. 寻址约定

I2C 协议标准完全版,很详细

THE I 2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000

CONTENTS 1PREFACE. . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1Version 1.0 - 1992. . . . . . . . . . . . . . . . . . . . 3 1.2Version 2.0 - 198. . . . . . . . . . . . . . . . . . . . . 3 1.3Version 2.1 - 1999. . . . . . . . . . . . . . . . . . . . 3 1.4Purchase of Philips I2C-bus components . . 3 2THE I2C-BUS BENEFITS DESIGNERS AND MANUFACTURERS. . . . . . . . . . . . . . .4 2.1Designer benefits . . . . . . . . . . . . . . . . . . . . 4 2.2Manufacturer benefits. . . . . . . . . . . . . . . . . 6 3INTRODUCTION TO THE I2C-BUS SPECIFICATION . . . . . . . . . . . . . . . . . . . . .6 4THE I2C-BUS CONCEPT . . . . . . . . . . . . . . .6 5GENERAL CHARACTERISTICS . . . . . . . . .8 6BIT TRANSFER . . . . . . . . . . . . . . . . . . . . . .8 6.1Data validity . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2START and STOP conditions. . . . . . . . . . . 9 7TRANSFERRING DATA. . . . . . . . . . . . . . .10 7.1Byte format . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2Acknowledge. . . . . . . . . . . . . . . . . . . . . . . 10 8ARBITRATION AND CLOCK GENERATION . . . . . . . . . . . . . . . . . . . . . .11 8.1Synchronization . . . . . . . . . . . . . . . . . . . . 11 8.2Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3Use of the clock synchronizing mechanism as a handshake. . . . . . . . . . . 13 9FORMATS WITH 7-BIT ADDRESSES. . . .13 107-BIT ADDRESSING . . . . . . . . . . . . . . . . .15 10.1Definition of bits in the first byte . . . . . . . . 15 10.1.1General call address. . . . . . . . . . . . . . . . . 16 10.1.2START byte . . . . . . . . . . . . . . . . . . . . . . . 17 10.1.3CBUS compatibility. . . . . . . . . . . . . . . . . . 18 11EXTENSIONS TO THE STANDARD- MODE I2C-BUS SPECIFICATION . . . . . . .19 12FAST-MODE. . . . . . . . . . . . . . . . . . . . . . . .19 13Hs-MODE . . . . . . . . . . . . . . . . . . . . . . . . . .20 13.1High speed transfer. . . . . . . . . . . . . . . . . . 20 13.2Serial data transfer format in Hs-mode. . . 21 13.3Switching from F/S- to Hs-mode and back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2313.4Hs-mode devices at lower speed modes. . 24 13.5Mixed speed modes on one serial bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 13.5.1F/S-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.2Hs-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.3Timing requirements for the bridge in a mixed-speed bus system. . . . . . . . . . . . . . 27 1410-BIT ADDRESSING. . . . . . . . . . . . . . . . 27 14.1Definition of bits in the first two bytes. . . . . 27 14.2Formats with 10-bit addresses. . . . . . . . . . 27 14.3General call address and start byte with 10-bit addressing. . . . . . . . . . . . . . . . . . . . 30 15ELECTRICAL SPECIFICATIONS AND TIMING FOR I/O STAGES AND BUS LINES. . . . . . . . . . . . . . . . . . . . 30 15.1Standard- and Fast-mode devices. . . . . . . 30 15.2Hs-mode devices. . . . . . . . . . . . . . . . . . . . 34 16ELECTRICAL CONNECTIONS OF I2C-BUS DEVICES TO THE BUS LINES . 37 16.1Maximum and minimum values of resistors R p and R s for Standard-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 39 17APPLICATION INFORMATION. . . . . . . . . 41 17.1Slope-controlled output stages of Fast-mode I2C-bus devices. . . . . . . . . . . . 41 17.2Switched pull-up circuit for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 41 17.3Wiring pattern of the bus lines. . . . . . . . . . 42 17.4Maximum and minimum values of resistors R p and R s for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 17.5Maximum and minimum values of resistors R p and R s for Hs-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 18BI-DIRECTIONAL LEVEL SHIFTER FOR F/S-MODE I2C-BUS SYSTEMS . . . . 42 18.1Connecting devices with different logic levels. . . . . . . . . . . . . . . . . . . . . . . . . 43 18.1.1Operation of the level shifter . . . . . . . . . . . 44 19DEVELOPMENT TOOLS AVAILABLE FROM PHILIPS. . . . . . . . . . . . . . . . . . . . . 45 20SUPPORT LITERATURE . . . . . . . . . . . . . 46

I2C总线协议规范 v2.1

THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000

CONTENTS 1PREFACE. . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1Version 1.0 - 1992. . . . . . . . . . . . . . . . . . . . 3 1.2Version 2.0 - 198. . . . . . . . . . . . . . . . . . . . . 3 1.3Version 2.1 - 1999. . . . . . . . . . . . . . . . . . . . 3 1.4Purchase of Philips I2C-bus components . . 3 2THE I2C-BUS BENEFITS DESIGNERS AND MANUFACTURERS. . . . . . . . . . . . . . .4 2.1Designer benefits . . . . . . . . . . . . . . . . . . . . 4 2.2Manufacturer benefits. . . . . . . . . . . . . . . . . 6 3INTRODUCTION TO THE I2C-BUS SPECIFICATION . . . . . . . . . . . . . . . . . . . . .6 4THE I2C-BUS CONCEPT . . . . . . . . . . . . . . .6 5GENERAL CHARACTERISTICS . . . . . . . . .8 6BIT TRANSFER . . . . . . . . . . . . . . . . . . . . . .8 6.1Data validity . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2START and STOP conditions. . . . . . . . . . . 9 7TRANSFERRING DATA. . . . . . . . . . . . . . .10 7.1Byte format . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2Acknowledge. . . . . . . . . . . . . . . . . . . . . . . 10 8ARBITRATION AND CLOCK GENERATION . . . . . . . . . . . . . . . . . . . . . .11 8.1Synchronization . . . . . . . . . . . . . . . . . . . . 11 8.2Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3Use of the clock synchronizing mechanism as a handshake. . . . . . . . . . . 13 9FORMATS WITH 7-BIT ADDRESSES. . . .13 107-BIT ADDRESSING . . . . . . . . . . . . . . . . .15 10.1Definition of bits in the first byte . . . . . . . . 15 10.1.1General call address. . . . . . . . . . . . . . . . . 16 10.1.2START byte . . . . . . . . . . . . . . . . . . . . . . . 17 10.1.3CBUS compatibility. . . . . . . . . . . . . . . . . . 18 11EXTENSIONS TO THE STANDARD- MODE I2C-BUS SPECIFICATION . . . . . . .19 12FAST-MODE. . . . . . . . . . . . . . . . . . . . . . . .19 13Hs-MODE . . . . . . . . . . . . . . . . . . . . . . . . . .20 13.1High speed transfer. . . . . . . . . . . . . . . . . . 20 13.2Serial data transfer format in Hs-mode. . . 21 13.3Switching from F/S- to Hs-mode and back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2313.4Hs-mode devices at lower speed modes. . 24 13.5Mixed speed modes on one serial bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 13.5.1F/S-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.2Hs-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.3Timing requirements for the bridge in a mixed-speed bus system. . . . . . . . . . . . . . 27 1410-BIT ADDRESSING. . . . . . . . . . . . . . . . 27 14.1Definition of bits in the first two bytes. . . . . 27 14.2Formats with 10-bit addresses. . . . . . . . . . 27 14.3General call address and start byte with 10-bit addressing. . . . . . . . . . . . . . . . . . . . 30 15ELECTRICAL SPECIFICATIONS AND TIMING FOR I/O STAGES AND BUS LINES. . . . . . . . . . . . . . . . . . . . 30 15.1Standard- and Fast-mode devices. . . . . . . 30 15.2Hs-mode devices. . . . . . . . . . . . . . . . . . . . 34 16ELECTRICAL CONNECTIONS OF I2C-BUS DEVICES TO THE BUS LINES . 37 16.1Maximum and minimum values of resistors R p and R s for Standard-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 39 17APPLICATION INFORMATION. . . . . . . . . 41 17.1Slope-controlled output stages of Fast-mode I2C-bus devices. . . . . . . . . . . . 41 17.2Switched pull-up circuit for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 41 17.3Wiring pattern of the bus lines. . . . . . . . . . 42 17.4Maximum and minimum values of resistors R p and R s for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 17.5Maximum and minimum values of resistors R p and R s for Hs-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 18BI-DIRECTIONAL LEVEL SHIFTER FOR F/S-MODE I2C-BUS SYSTEMS . . . . 42 18.1Connecting devices with different logic levels. . . . . . . . . . . . . . . . . . . . . . . . . 43 18.1.1Operation of the level shifter . . . . . . . . . . . 44 19DEVELOPMENT TOOLS AVAILABLE FROM PHILIPS. . . . . . . . . . . . . . . . . . . . . 45 20SUPPORT LITERATURE . . . . . . . . . . . . . 46

关于IIC的通信协议程序

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define _BV(bit) (1 << (bit)) #ifndef cbi #define cbi(reg,bit) reg &= ~_BV(bit) #endif #ifndef sbi #define sbi(reg,bit) reg |= _BV(bit) #endif extern uchar dog; /* void delay_1ms(uchar xtal) { uchar i; for(i=0;i<(uint)(143*xtal-2);i++) {;} } //2 延时nms void delay_ms(uchar m, uchar fosc) { uchar i; i=0; while(i

AT24C02数据存储I2C协议-串口通讯

/****************************************** 绿盾电子 X-13 多传感器开发板 功能:实现读写AT24C02型号的EEPROM存储。该类型存储器具有掉电数据保护功能,是单片 机项目开发中常用的芯片。AT24C02使用 I2C总线与的单片机通信,只需两根线即 可完成读写功能。 串口输出数据,串口是单片机程序调试种 最常用最重要的工具。在使用前需要主要 开发板当前晶振频率是否为11.0592MHz,如 不是,请更换晶振,或者自行计算定时器 数值。 时间:2011-8-23 ******************************************/ //头文件 #include "reg51.h" #include //宏定义 #define uchar unsigned char #define uint unsigned int

//引脚定义 sbit Scl= P3^6; //AT24C0x串行时钟sbit Sda= P3^7; //AT24C0x串行数据 //全局变量 uchar EEPROM_WriteBuffer[] = {"https://www.wendangku.net/doc/db2344335.html,"}; uchar EEPROM_ReadBuffer[20]; //函数声明 /******************************************/ //延时子函时, //参数 d_time 控制延时的时间 //作用,灯亮和熄灭必须持续一定时间,人眼才能看到 void delay(unsigned int time); /******************************************/ //延时子函数 //参数范围 0-65536 void delay(unsigned int time) //参数 time 大小 { //决定延时时间长短 while(time--); }

i2c通讯协议及程序

I2C通信协议简介 (2013-01-17 10:48:03) 转载▼ 分类:通讯协议 标签: 杂谈 ACK是acknowledge的意思,确认. 摒弃复杂的情况,这里只对I2C做简单的介绍。 一、I2C 总线的一些特征: ? 只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL ? 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器? 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏 ? 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s ? 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整 ? 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制 二、I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据 起始和结束:

bool I2C_Start(void) { SDA_H; SCL_H; I2C_delay(); if(!SDA_read)return FALSE; // SDA线为低电平则总线忙,退出 SDA_L; // 拉低SDA线(当SCL为高电平时,SDA由高电平向低电平跳变表示开始信号) I2C_delay(); if(SDA_read) return FALSE; // SDA线为高电平则总线出错,退出 SDA_L; //数据为准备好时,拉低SCL线 I2C_delay(); return TRUE; } 发出开始信号之后,设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输 void I2C_Stop(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; // SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 I2C_delay(); SDA_H; I2C_delay(); }

I2C总线协议程序

C程序代码]I2C总线协议程序 程序代码 2009-10-11 14:05 阅读48 评论0 /**************************************************************** I2C总线协议程序 ****************************************************************/ #define NOP {_nop_();_nop_();_nop_();_nop_();} sbit SDA=P1^2; /*模拟I2C数据传送位*/ sbit SCL=P1^3; /*模拟I2C时钟控制位*/ bit ack; /*应答标志位*/ void Start_I2c() { SDA=1; NOP; SCL=1; NOP; SDA=0; NOP; SCL=0; NOP; } void Stop_I2c() { SDA=0; NOP;

SCL=1; NOP; SDA=1; NOP; } void Senduchar(uchar c) { uchar i; for(i=0;i<8;i++) { c<<=1; SDA=CY; NOP; SCL=1; NOP; SCL=0; NOP; } SDA=1; NOP; SCL=1; NOP; if(SDA==1) ack=0; else ack=1; SCL=0; NOP; } uchar Rcvuchar() {

uchar i,x=0; SDA=1; for(i=0;i<8;i++) { SCL=0; NOP; SCL=1; NOP; x=x<<1; if(SDA) x=x+1; NOP; } SCL=0; NOP; return(x); } void Ack_I2c(bit a) { SDA=a; NOP; SCL=1; NOP; SCL=0; NOP; } bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i;

I2c总线协议

1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。 1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲) 数据改变:SCL为低电平时,SDA线才能改变传输的bit 1.2 I2C开始和结束信号 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

1.3 I2C应答信号 Master每发送完8bit数据后等待Slave的ACK。 即在第9个clock,若从IC发ACK,SDA会被拉低。 若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示: 1.4 I2C写流程 写寄存器的标准流程为: 1. Master发起START 2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK 3. Slave发送ACK 4. Master发送regaddr(8bit),等待ACK 5. Slave发送ACK 6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK 7. Slave发送ACK 8. 第6步和第7步可以重复多次,即顺序写多个寄存器

I2C协议代码

此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能很 方便的与用户程序进行连接并扩展。 需要注意的是,函数是采用延时方法产生SCL 脉冲,对高晶振频率要做一定的修改!! 说明: 1us机器周期,晶振频率要小于12MHz 返回1 则操作成功,返回0 则操作失败。 sla 为器件从地址,suba 为器件子地址。 ************************************************************************* ************/ #include "AT89X52.h" #include #define _Nop() _nop_() //定义空指令 sbit SDA = P1^3; //模拟I2C数据传输位 sbit SCL = P1^2; //模拟I2C时钟控制位 bit bdata I2C_Ack; //应答标志位 /************************************ I2C_Start ************************************ 函数名:void I2C_Start() 入口: 出口: 功能描述:启动I2C总线,即发送I2C初始条件 调用函数: 全局变量: 创建者:陈曦日期:2005-6-15 修改者:日期: ************************************************************************* *********/

void I2C_Start() { SDA = 1; //发送起始条件的数据信号 _Nop(); SCL = 1; _Nop(); //起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA = 0; //发送起始信号 _Nop(); //起始条件建立时间大于4us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SCL = 0; //钳住I2C总线准备发送或接收数据 _Nop(); _Nop(); } /************************************ I2C_Stop ************************************ 函数名:void I2C_Stop() 入口: 出口: 功能描述:结束I2C总线,即发送I2C结束条件 调用函数: 全局变量: 创建者:陈曦日期:2005-6-15 修改者:日期: ************************************************************************* *********/

I2C协议

I2C总线串行接口应用设计 I2C是一种较为常用的串行接口标准,具有协议完善、支持芯片较多和占用I/O线少等优点。I2C总线是PHILIPS公司为有效实现电子器件之间的控制而开发的一种简单的双向两线总线。现在,I2C总线已经成为一个国际标准,在超过100种不同的IC集成电路上实现,得到超过50家公司的许可,应用涉及家电、通信、控制等众多领域,特别是在ARM嵌入式系统开发中得到广泛应用。 1 实例说明 本实例介绍I2C总线接口在ARM中的应用,以及它在ARM平台中的I/O交互拓展能力。 在ARM嵌入式系统开发中,系统和外围设备的信息交换能力非常重要。传统的方式多采用地址和数据总线来完成,但是由于嵌入式系统总线资源的限制,利用有限的I/O接口和足够的通信速度来扩展多功能的外围器件就显得十分必要。I2C总线正好可以满足这一嵌入式系统设计的需要。在嵌入式系统中应用I2C总线,可以在很大程度上简化系统结构,模块化系统电路,而I2C总线上各节点独立的电气特性也可以使整个系统具有最大的灵活性。 2 I2C设计原理 2.1 12G主从模式 I2C采用两根I/O线:一根时钟线(SCL串行时钟线),一根数据线(SDA串行数据线),实现全双工的同步数据通信。I2C总线通过SCL/SDA两根线使挂接到总线上的器件相互进行信息传递。 ARM通过寻址来识别总线上的存储器、LCD驱动器、I/O扩展芯片及其他I2 C总线器件,省去了每个器件的片选线,因而使整个系统的连接极其简洁。总线上的设备分为主设备(ARM处理器)和从设备两种,总线支持多主设备,是一个多主总线,即它可以由多个连接的器件控制。典型的系统构建如图15-1所示。 每一次I2C总线传输都由主设备产生一个起始信号,采用同步串行传送数据,数据接收方每接收一个字节数据后都回应一个应答信号。一次I2C总线传输传送的字节数不受限制,主设备通过产生停止信号来终结总线传输。数据从最高位开始传送,数据在时钟信号高电平时有效。通信双方都可以通过拉低时钟线来暂停该次通信。 2.2 I2C工作原理

I2C总线协议及工作原理

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由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。

51单片机i2c协议示例程序

#include #include #define uint unsigned int #define uchar unsigned char sbit sda=P3^5; sbit scl=P3^4; void start_bit(); void stop_bit(); void slave_ack(); void no_ack(); void write_byte(uchar dat); uchar read_byte(); void write_date(uchar addr,uchar date); uchar read_date(uchar addr); void delay(uint x); void main() { uchar num; write_date(0x01,0xaa); delay(2); num=read_date(0x01); P0=num; while(1); } void start_bit() //开始位 { scl=1; _nop_(); sda=1; _nop_(); sda=0; _nop_(); scl=0; } void stop_bit() //停止位

{ sda=0; _nop_(); scl=1; _nop_(); sda=1; } void slave_ack() //应答信号 { _nop_(); _nop_(); scl=0; _nop_();; sda=1; _nop_(); _nop_(); scl=1; _nop_(); _nop_(); while(sda); //P0=0xfe; scl=0; } void no_ack() //无应答 { sda=1; _nop_(); scl=1; _nop_(); scl=0; } void write_byte(uchar dat) //写一个字节{ uchar i; scl=0; for(i=0;i<8;i++) { if(dat&0x80) sda=1; else sda=0;

相关文档