文档类别

文档标识

IIC总线协议基础1

当前版本号

V0.2

作    者

Louis

完毕时间

2015-05-27

IIC总线协议基础1

IIC总线协议基础1.

1.           
IIC时序基础知识

1.1       
信号线

1.2       
開始和结束条件

1.3       
数据保持时间

1.4       
应答ACK和非应答NACK

1.4.1        
应答 ACK

1.4.2        
非应答 NO ACK

1.4.3        
注意事项

1.5       
反复開始【Repeat start】

1.6       
写入周期【write cycle】

1.7       
数据传送完整周期

2.           
IIC设备

2.1       
设备操作

2.1.1        
时钟和数据发送

2.1.2        
開始条件

2.1.3        
结束条件

2.1.4        
应答(ACK)

2.1.5        
待机模式

2.1.6        
软件复位IIC

2.2       
设备地址

2.3       
写操作

2.3.1        
写Byte字节

2.3.2        
写PAGE页

2.3.3        
轮询应答(ACK POLLING)

2.4       
读操作

2.4.1        
当前地址读

2.4.2        
随机地址读

2.4.3        
连续地址读

3.           
參考文献

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

[6]http://blog.sina.com.cn/s/blog_5f103c9c0100ly0r.html

IIC总线协议基础1的更多相关文章

  1. IIC总线协议---以存储芯片at24c64为例

    IIC总线协议 前言:年前给老师做个红外抄表系统,,现在对当中用到的一些模块总结一下. 1.只有在总线空闲时才允许启动数据传送. 2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允 ...

  2. 用I/O口模拟IIC总线协议遇到的一些问题

    最近做的一个项目,是基于IIC总线通信的传感器系统.由于另外一个传感器使用的是类IIC协议,而不是标准IIC,所以MCU不能与其通信,最后没有办法,只有通过I/O口模拟的方式实现IIC的总线通信.具体 ...

  3. IIC总线协议

    前言:年前给老师做个红外抄表系统,,现在对当中用到的一些模块总结一下. 1.只有在总线空闲时才允许启动数据传送. 2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变.时钟线 ...

  4. IIC总线协议和时序

    IIC标准速率为100Kbit/s,快速模式400Kbit/s,支持多机通信,支持多主控模块,但是同一时刻只允许有一个主控.由数据线SDA和时钟SCL构成串行总线:每个电路模块都有唯一地址.I2C设备 ...

  5. 【接口时序】6、IIC总线的原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE .ChipScope 硬件平台: 1. FPG ...

  6. 对 IIC 总线的理解、调用函数以及常见面试问题

    一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线.一根是数据线SDA, ...

  7. 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用

    1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...

  8. 十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)

    1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用 ...

  9. C51—模拟IIC总线实现EEPROM存取数据

    a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...

随机推荐

  1. 封装HttpClient进行http请求与https请求

    一.https忽略证书 /** * 用于进行Https请求的HttpClient * * @author joey * */ public class SSLClient { public stati ...

  2. Run Nutch In Eclipse on Linux and Windows nutch version 0.9

    Running Nutch in Eclipse Here are instructions for setting up a development environment for Nutch un ...

  3. jquery访问ashx文件示例

    转自原文jquery访问ashx文件示例 .ashx 文件用于写web handler的..ashx文件与.aspx文件类似,可以通过它来调用HttpHandler类,它免去了普通.aspx页面的控件 ...

  4. Qt之命令行参数

    简述 在Qt之进程间通信(QProcess)一节,我们讲解了如何通过QProcess来进行进程间的通信.主要通过启动外部程序,然后通过命令行的方式传递参数. 这里,我们可以通过Qt Creator来设 ...

  5. Xdoclet + Ant自己主动生成Hibernate配置文件

    在使用Hibernate的时候,过多的Hibernate配置文件是一个让人头疼的问题. 近期接触了Xdoclet这个工具. 它实际上就是一个自己主动代码生成的工具.Xdoclet不能单独执行,必须搭配 ...

  6. POJ 1107

    水题一道,注意取模时不能为0 #include <iostream> #include <algorithm> #include <cstring> #includ ...

  7. call to OpenGL ES API with no current context 和Fatal signal 11

    近日在用cocos2dx3.4的时候使用了JNI调用,发现一个现象 当不使用jni的时候全然正常.使用了jni后回去的全部文字都变成黑块,而且有概率程序崩溃.附带出了两个log call to Ope ...

  8. PHP静态延迟绑定简单演示样例

    没怎么用过这个新特性.事实上也不算新啦,试试吧,如今静态类的继承非常方便了 <?php class A { protected static $def = '123456'; public st ...

  9. Oracle 后台进程介绍

    一 进程分类: 1.服务器进程(server process): 依据客户请求完毕工作.如接收和处理应用发送的SQL语句 2.后台进程(background process): 随数据库而启动,用于完 ...

  10. ThinkPHP5.0框架开发--第7章 TP5.0数据库操作

    ThinkPHP5.0框架开发--第7章 TP5.0数据库操作 第7章 TP5.0数据库操作 ===================================================== ...