文档类别 |
|
文档标识 |
IIC总线协议基础1 |
当前版本号 |
V0.2 |
作 者 |
Louis |
完毕时间 |
2015-05-27 |
IIC总线协议基础1
1.IIC时序基础知识
1.1 信号线
SDA:双向数据线引脚,用来传输串行数据。引脚一般为开漏结构,能够和其它的开漏极或开集电极进行“线与”。【不同手冊上看到有“线或”的说法,应该不正确】
SCL:时钟输入引脚。【有些资料说是在SCL的上升沿才干将数据写入AT24C02中。在SCL的下降沿才干从 AT24C02 中读出数据,这是不对的。实际測试:在SCL的下降沿后再从SDA总线上去读取数据。数据有误。】
1.2 開始和结束条件
開始时序:在SCL高电平时SDA出现一个下降沿。
结束时序:在SCL高电平时SDA出现一个上升沿;
1.3 数据保持时间
数据SDL变化必须在SCL低电平的时候变化。而且在SCL高电平时保持不变,否则会被误觉得是命令(開始/结束)条件。
1.4 应答ACK和非应答NACK
SCL一直由Master控制,SDA按照数据传送的方向,读数据时由Slave控制SDA。写数据时由Master控制SDA。当8位数据传送完成之后,应答位ACK或者非应答位NACK的SDA控制权与数据位传送时相反。
写数据的时候,Master每发送完8个数据位,Slave设备假设还有空间接受下一个字节应该回答“ACK”,Slave设备假设没有空间接受很多其它的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到不论什么数据将视为超时,此时Master放弃数据传送。发送“Stop”。
读数据的时候,Slave设备每发送完8个数据位。假设Master希望继续读下一个字节,Master应该回答“ACK”以提示Slave准备下一个数据。假设Master不希望读取很多其它字节,Master应该回答“NACK”以提示Slave设备准备接收Stop信号。
MASTER 指主控制端,在一般系统中就是我们常说的单片机了。
SLAVE是指具备I2C协议的专用IC,比方24C16、14C32等。
1.4.1应答 ACK
在数据发送器发送完8个位数据后。就会把SDA释放(拉高,由于IIC外部上拉)。设备在接收完成8个位后,在第9个时钟SCL,设备将SDA拉低,产生应答ACK,来告诉数据发送器收到数据了。
当发送器检測到SDA被拉低。就知道设备接收器接收完成数据了。
1.4.2非应答 NO ACK
非应答(NACK)一般发生在主机读取数据时,当主机要结束读取数据时,就会发出非应答NACK。
假设slave方是硬件i2c要求一定要标准的NACK,master方是GPIO软件模拟i2c若没有正确的发送NACK,就会出现“slave收不到stop”导致i2c挂死。
1.4.3注意事项
MASTER向SLAVE发送数据
MASTER每次向SLAVE端发送8位数据后,就会将SDA置1,等待SLAVE端的确认。SLAVE端假设正确接受到数据,就会自己主动将SDA置0。程序能做的仅仅是检測确认信号,即每发送完8位数据后就检測一次SDA的状态,假设是0,则让程序继续往下运行。假设是1则强迫MASTER将刚才的8位数据再发送一遍;当然。假设SDA一直是1。也就是SLAVE一直未能正确接受到数据,也不能一直让MASTER重复发送,要做TIMEOUT处理,以防系统死机。
MASTER从SLAVE读取数据:
MASTER从SLAVE端读取数据,情况与发送数据有所差别,在读到最后8位数据时。要将SDA置1,也就是做NACK动作,让系统知道读取数据到此结束。这个置1动作由程序来做,由于数据读到哪里结束,仅仅有程序猿知道。
IIC传输数据方式
NOTE:IIC是MSB FIRST传送的
1.5 反复開始【Repeat start】
即在发送完一个字节后(開始+8数据+ACK),没有发送STOP的情况下。继续下一次START(就是指repeatstart)。这个须要注意的是在第9个时钟之后和REPEAT START之间SDA要有一定的延时Tbuf(一般有个最小值)。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
1.6 写入周期【write cycle】
内部写入周期器件,STOP和下一次的START之间须要有个延时Twr。保证设备写好数据。
一般手冊给出一个Twr最大值。
注意:英文资料里要求24c02内部写数据最大时间为10ms,也就是说在软件设计时。应该把2次写记忆时间间隔控制在大于Twr时间即间隔大于10ms,这样就不会有问题了,不同的芯片Twr时间相差非常大,一般以參考手冊为准。
1.7 数据传送完整周期
NOTE:IIC是MSB FIRST传送的
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.IIC设备
(以AT24C02器件为对象来介绍)
2.1 设备操作
2.1.1时钟和数据发送
SDA引脚通常由外部设备上拉。
SDA上的数据仅仅有在SCL是low的时候才干够变化。假设SDA上的数据在SCL的high期间内变化,那么将会被觉得是開始/结束条件。
2.1.2開始条件
在SCL的high期间。SDA从high-到-low变化。就会触发一个開始条件。
这个条件必须在其它不论什么指令開始之前发出的。
2.1.3结束条件
在SCL的high期间,SDA从low-到-high变化。就会触发一个结束条件。在读时序之后,收到一个停止条件,将会使EEPROM进入待机模式。
2.1.4应答(ACK)
全部的数据和地址信息都是通过8-bit的形式进行来回传输的。
EEPROM将发送一个0来应答。表示它已经接收到每一个字节了。
这个时刻发生在第9个SCL。
2.1.5待机模式
AT24C02有待机模式的特性,例如以下形式将进入待机模式:
(1) 上电后;
(2) 接收到STOP。或者完毕了内部全部操作后;
2.1.6 软件复位IIC
在协议中断,掉电或者系统复位后,能够通过例如以下步骤进行复位:
(1) 发送一个START条件;
(2) 发送9个时钟;
(3) 再发送一个START条件,并紧跟着一个STOP条件。
2.2 设备地址
2K EEPROM设备须要在一个START条件后面,跟上一个8-bit的设备地址使能芯片读、写功能。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
设备地址的高4位由固定的1和0组成。通常在EEPROM设备中的高四位地址都是一样的。【不知道为什么???】
紧接着3位是2K EEPROM的A2、A1、A0设备地址位。这三位是用来区分EEPROM设备的,须要和硬件地址相等。
最后,第8位是设备地址的READ/WRITE读/写位。此位置1表示读操作,此为置0为写操作。
当设备地址对照之后,EEPROM将会反馈输出一个0.假如比較结果不正确。那么芯片(EEPROM)将进入待机状态。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> |
|
1010 111 R/W |
1010 000 R/W |
2.3 写操作
AT24C02设备地址的高4位由固定的1和0组成。
接着3位是EEPROM的设备地址位A2、A1、A0。
第8位是设备地址的READ/WRITE读/写位。此位置1表示读操作,此为置0为写操作。
2.3.1写Byte字节
写操作须要发送设备地址,并尾随一个8-bit位数据地址和ACK。在接收到地址后。EEPROM将再次响应输出0。然后进入第一个8-bit数据的时钟。接收到8-bit数据后,EEPROM将输出一个0,寻址设备(主设备)必须发送一个STOP条件结束写操作。这样EEPROM就进入内部写入阶段(internally timed write cycle .[twr]),避免外部对memory进行操作。
在这个阶段,全部输入无效,而且EEPROM不会有不论什么响应,直到内部写完成。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.3.2写PAGE页
这个2K的EEPROM可以进行8-byte页写入。
Page写入和byte写入的初始化是一样的。仅仅是控制器在发送完第一个数据后。不发送STOP条件。
而是在第一个数据的ACK后,连续在发送后面的7个数据字节。EEPROM将在接收到每一个数据字节后,均会产生一个ACK来响应(控制器)。发送完8个字节后,控制器必须发送一个STOP条件来结束PAGE写入。
数据地址的低3位bit在接收到每一个数据后,都会自己主动添加。
数据地址的高5位bit数据不添加,保持在当前页【row location】。
假设写入数据的地址,自己主动添加达到了PAGE边缘,那么接下去的字节将会从本页从头開始覆盖存储(“roll over”)。就是所假设在写入页的数据大于8byte(8-byte容量的page)。那么多于的数据将会从本页从头写入,并覆盖掉先前的数据。所以在写入数据大于PAGE容量时。在写完一个PAGE。就须要STOP,然后又一次開始。并写入下一页的地址,在開始写入数据。
2.3.3轮询应答(ACKPOLLING)
一旦进入内部写周期。将开启轮询应答,外部对EEPROM的输入将失效。此时假设发送一个START条件,和设备地址给EEPROM,仅仅有当内部写周期完毕后,EEPROM设备才会产生应答ACK。
2.4 读操作
有三种读操作:读取当前地址数据,随机地址读取,连续地址读取。
2.4.1当前地址读
仅仅要芯片电源没有掉电,在进行上一次A地址的读写操作之后,(A+1)地址就会一直有效。在读取数据中出现的“roll over”。指的是从最后一页的最后一个字节,跳到第一页的第一个字节。【和写时候出现的“roll over”是不一样的】
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
一旦在发送设备地址时。write/read位被设为1。并得到EEPROM应答ACK。那么当前地址(就是前文中的【A+1】地址)的数据就会被输出。控制器接收到数据后。不产生应答ACK【即产生非应答(NACK)】,而是在后面产生一个STOP条件。
【非应答:当控制器想结束訪问数据后。就将SDA拉高。结束读取数据。但记得在NACK后要尾随一个STOP】。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.4.2随机地址读
随机读取数据,须要一个“dummy”操作,即:发送设备地址+写操作(得到EEPROM应答ACK),并尾随发送须要訪问数据的地址。当这个动得到EEPROM的应答ACK,控制器必须再次产生一个START条件,接着发送设备地址+读操作,在得到EEPROM应答ACK后,EEPROM接着就会发送出控制器要訪问数据的地址。控制器接收到数据后。不产生应答ACK【即产生非应答(NACK)】,而是在后面产生一个STOP条件。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1em9uZ21pbmcxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够看出“随机地址读”比“当前地址读”多了一个“伪写入”动作:
2.4.3 连续地址读
连续读取初始化,能够通过“当前地址读取”或者“随机地址读取”操作来启动。仅仅是在控制器接收到以第一字节后,控制器须要产生一个应答ACK给EEPROM。EEPROM一旦收到ACK。EEPROM就会继续将数据地址+1。发送数据。
当EEPROM的memory地址到达极限后。数据地址将会“roll over”,同一时候会继续读取数据。当控制器要终止连续读操作,控制器不产生应答ACK【即产生非应答(NACK)】,而是在后面产生一个STOP条件。
注意:
当控制器要终止连续读操作。直接给停止信号也是能够结束此次读操作,可是会对后面的操作带来影响。非应答信号在须要的时候必须给。
3.參考文献
[1] Atmel AT24C02B datasheet
[2] NXP Semiconductors UM10204 datasheet
[3] http://blog.csdn.net/bmbm546/article/details/8833956
[4] http://blog.csdn.net/skyflying2012/article/details/8237881
[5] http://www.52rd.com/bbs/Archive_Thread.asp?SID=196579&TID=3
IIC总线协议基础1的更多相关文章
-
IIC总线协议---以存储芯片at24c64为例
IIC总线协议 前言:年前给老师做个红外抄表系统,,现在对当中用到的一些模块总结一下. 1.只有在总线空闲时才允许启动数据传送. 2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允 ...
-
用I/O口模拟IIC总线协议遇到的一些问题
最近做的一个项目,是基于IIC总线通信的传感器系统.由于另外一个传感器使用的是类IIC协议,而不是标准IIC,所以MCU不能与其通信,最后没有办法,只有通过I/O口模拟的方式实现IIC的总线通信.具体 ...
-
IIC总线协议
前言:年前给老师做个红外抄表系统,,现在对当中用到的一些模块总结一下. 1.只有在总线空闲时才允许启动数据传送. 2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变.时钟线 ...
-
IIC总线协议和时序
IIC标准速率为100Kbit/s,快速模式400Kbit/s,支持多机通信,支持多主控模块,但是同一时刻只允许有一个主控.由数据线SDA和时钟SCL构成串行总线:每个电路模块都有唯一地址.I2C设备 ...
-
【接口时序】6、IIC总线的原理与Verilog实现
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE .ChipScope 硬件平台: 1. FPG ...
-
对 IIC 总线的理解、调用函数以及常见面试问题
一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线.一根是数据线SDA, ...
-
十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用
1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...
-
十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)
1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用 ...
-
C51—模拟IIC总线实现EEPROM存取数据
a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...
随机推荐
-
关于JSON
JSON:一种数据交换格式,不是一种编程语言.(JSON 语法是 JavaScript 对象表示法语法的子集.) 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaSc ...
-
uva 1572 self-assembly ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxQAAANxCAYAAAB9uv94AAAgAElEQVR4nOxdPW7tOpLWFrQGJb72vI ...
-
sqlserver log
DBCC LOGINFODBCC log('QSSys', TYPE=2)goselect * from sys.fn_dblog(null,null)select [Dirty Pages],[Mi ...
-
ExtJs自学教程(1):一切从API开始
题 记 该系列文章不侧重全方位的去介绍ExtJs的使用,只是侧重于解决ExtJs问题的思考方法.写的人不用长篇大论,学的人则能够自立更生.l 学习的人只要有一些CSS的javascript的基础知识 ...
-
利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
-
Oracle dump 分析secondary key
验证secondary key 含有主键列数据 SQL> select object_name,object_id,OBJECT_TYPE from user_objects; OBJECT_N ...
-
Spring源码学习(5)—— bean的加载 part 2
之前归纳了从spring容器的缓存中直接获取bean的情况,接下来就需要从头开始bean的加载过程了.这里着重看单例的bean的加载 if(ex1.isSingleton()) { sharedIns ...
-
c++界面库方案
最近的开发需要向java以及c++方向转向:看了些java和c++的东西 最近研究了下,最后觉得使用ogre+mygui来实现c++界面,这样用比较方便: 当前ogre,mygui都可以实现界面,可以 ...
-
Linux 网络流量实时监控工具之ntopng详解
大纲一.前言二.ntopng 简介三.ntopng 功能说明 四.ntopng 安装详解五.ntopng 配置详解 六.ntopng 使用详解注,操作系统 CentOS 5.5 X86_64,软件版本 ...
-
angularjs初识ng-app、ng-model、ng-repeat指令
ng-app属性是angular.js的标志语句,它标记了angular.js的作用域.ng-app可以添加在很多地方,像上面那样添加到html标签上,说明angular脚本对整个页面都起作用.也可以 ...