资源描述
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协议
2023-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内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断
EEPROM是否被意外改写。
11.6 I2C Master控制器设计实例
I2C(Intel-Integrated Circuit bus)为内部IC控制的双向串行总线,用于连接微控制器及其外围设备的互连。本章以FPGA模拟I2C协议作为主端对AT24C02进行读/写操作,来介绍I2C Master 控制器的Verilog HDL 语言建模与硬件测试。
11.6.1 I2C总线协议介绍
I2C总线只需要两条线,其中一条为时钟线,另一条为数据信号线。总线上的终端挂在总线上,终端有主端与从端之分。在同一总线上同一时刻只能有一个主端,主端设备负责初始化总线,产生总线数据传输所需的时钟。在同一总线上可以有多个从端,每个从端都有一个唯一的地址来标记自己。
I2C总线上传送数据时序图如图11-48所示。
起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
传地址信号:传7位地址信号,由高位到低位,再加1位读/写标志。
传数据信号:数据按高位到低位的顺序进行传送。
停止信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:从端在接受完8位数据后,在时钟信号SCL为高电平时,设立数据信号SDA为低电平,即为应答信号,表达一个字节数据接受完毕。
展开阅读全文