I2C总线接口
一. 12C总线协议(来源于百度知道)
I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
1 I2C总线特点
I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
2 I2C总线工作原理
2.1 总线的构成及信号类型
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程*有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口。
3 总线基本操作
I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。
3.1 控制字节
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。
3.2 写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。
3.3 读操作
读操作有三种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是“不关心”。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。
在I2C总线的应用中应注意的事项总结为以下几点 :
1) 严格按照时序图的要求进行操作,
2) 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。
3) 程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。
4) 为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。
添加:I2C 总线
在现代电子系统中,有为数众多的IC 需要进行相互之间以及与外界的通信。为了提供
硬件的效率和简化电路的设计,PHILIPS 开发了一种用于内部IC 控制的简单的双向两线串
行总线I2C(inter IC 总线)。I2C 总线支持任何一种IC 制造工艺,并且PHILIPS 和其他厂商
提供了种类非常丰富的I2C 兼容芯片。作为一个专利的控制总线,I2C 已经成为世界性的工
业标准。
每个I2C 器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD 驱动
器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式
或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。I2C 是一个
多主总线,即它可以由多个连接的器件控制。
早期的I2C 总线数据传输速率最高为100Kbits/s,采用7 位寻址。但是由于数据传
输速率和应用功能的迅速增加,I2C 总线也增强为快速模式(400Kbits/s)和10 位寻址
以满足更高速度和更大寻址空间的需求。
I2C 总线始终和先进技术保持同步,但仍然保持其向下兼容性。并且最近还增加了
高速模式,其速度可达3.4Mbits/s。它使得I2C 总线能够支持现有以及将来的高速串行
传输应用,例如EEPROM 和Flash 存储器。
二. I2C接口操作
1. I2C总线术语
发送器:发送数据到总线的器件
接收器:从总线接收数据的器件
主机:发起/停止数据传输,提供时钟信号的器件。
从机:被主机寻址的器件。
多主机:可以有多个主机试图去控制总线,但是不会破坏数据。
仲裁:当多个主机试图控制总线时,通过仲裁可以使得只有一个主机获得总线控制权,并且它传输的信息不被破坏。
同步:多个器件同步时钟信号的过程。
2. I2C总线信号类型
(1) 开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
(2) 结束信号 (p):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
(3) 响应信号(ACK) :接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平。
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平时期间可以变化。
3. I2C总线的数据传输格式与传输流程
发送到SDA上的每个字必须是8位的,每次传输可以发送的字节数量不受限制。每个字节后面必须跟一个响应位。首先传输的是数据的最高位(MSB)。如果从机要完成一些其它功能后才能继续接收或发送一个字节,从机则可以将SCL拉低,迫使主机进入等待状态,当完成操作后就可以释放SCL,数据传输继续,如果主机在传输数据期间,也需要完成一些其它操作,也可以拉低SCL以占住总线。
启动一个传输后,主机先发出S信号,然后发出8位数据,这8位数据中前7位为从机地址,第8位表示传输的方向(0表示写,1表示读),被选中的从机发出响应信号后,紧接着传输一系列字节及响应位,最后主机发出P信号,结束本次传输。
4. I2C传输过程中无ACK响应信号可能的情况
(1) 当从机不能响应从机地址时(例如从机正忙于其它事,或者这个地址没有对应的主机),在第9个SCL周期内SDA线没有被拉低,即没有ACK信号。这时主机发出P信号终止传输或者重新发出一个S信号开始新的传输。
(2) 如果从机在传输过程中不能接收更多数据时,它也不会发出ACK信号,这样,主机在没有收到ACK时,主机就可以发P或者S信号。
(3) 主机接收器在接收最后一个字节后,也不会发ACK信号,所以在这种情况下,从机发送器就需要释放SDA线,以允许主机发P信号。
三. S3C2440 I2C总线控制器
根据S3C2440的Datasheet可得到I2C控制器的结构图,S3C2440提供4个寄存器来完成所有I2C操作,SDA线上的数据从IICDS寄存器发出,或者传入IICDS寄存器中;IICADD寄存器中保存S3C2440当作从机时的地址;IICCON,IICSTAT两个寄存器用来控制或者标识各种状态,比如选择工作模式,发出S信号,P信号,决定是否发出ACK信号,检测是否收到ACK信号。
各个寄存器的详细使用方法请参考数据手册,这里就不累述了。
四. S3C2440 I2C总线操作方法与流程
1. 启动或者恢复I2C传输有以下两种方法:
(1) 当IICCON[4]即中断状态标志位为0时,通过写IICSTAT寄存器启动I2C操作,有两种情况:
A.在主机模式,令IICSTAT[5:4]等于0b11,将发出S信号和IICDS寄存器的数据(寻址),令IICSTAT[5:4]等于0b01将发出P信号。
B.在从机模式,令IICSTAT[4]等于1将等待其它主机发出S信号及地址信息。
(2) 当IICCON[4]即中断状态标志位为1时,表示I2C被暂停,在这期间,设置好其它寄存器后,向IICCON[4]写入0即可恢复I2C操作。所谓“设置其它寄存器”有以下几种情况:
A. 对于主机模式,可以按照上面的方法写IICSTAT寄存器,恢复I2C操作后即可发出S信号和IICDS寄存器的值,或者发出P信号。
B. 对于发送器,可以将下一个要发送的数据写入到IICDS寄存器中,恢复I2C操作后即可发出这个数据 。
C. 对于接收器,可以从IICDS寄存器中读取接收到的数据,最后响IICCON[4]写入0(清中断)的同时,设置IICCON[7]以决定在接收下一个数据后是否发出ACK信号。
2. 通过中断服务程序来驱动I2C传输
(1) 当仲裁失败时发生中断,即是本次传输没有抢到总线 ,则需要稍候继续。
(2) 对于主机模式,当发出S信号,地址信息并经过一个SCL周期(对应ACK信号)后,发生中断,主机可在此时判断是否成功寻址到从机。
(3) 对于从机模式,当接收到的址与IICADD寄存器相吻合时,发生出ACK信号,然后发生中断,从机可在此时准备后面的传输。
(4) 对于发送器,当发送完一个数据并经过珍上SCL周期(对应ACK信号)后,发生中断,这时可以准备下一个将要发送的数据,或者发出P信号以停止传输。
(5) 对于接收器,当接收到一个数据时,先根据IICCON[7]以决定是否发出ACK信号,然后发生中断。这里可以读取IICDS寄存器得到数据,并设置IICCON[7]以决定接收到下一个数据后是否发出ACK。
对于以上的几中工作模式,数据手册中都有操作流程图,现以主机发送器为例说明一下它的工作流程。
(1)配置主机发送器各类参数,设置GPE14,GPE15引脚用于SCL,SDA,设置IICCON寄存器选择I2C发送时钟,最后,设置IICSTAT[4]为1,这样,后面才能写IICDS寄存器。
Note:初始化时,IICCON[4]为0,不能将IICSTAT设置为主机模式,否则就会立刻发送S信号,发送IICDS寄存器的值 。
(2)将要寻址的从机地址写入到IICDS寄存器。
(3)将0XF0(11110000)写入到IICSTAT寄存器,即设为主机发送器,全能串行输出功能,发出S信号。
(4)发出S信号后,步骤2中设置的IICDS寄存器的值也将会被发出去,它用来寻址从机。
(5)在响应周期后,发生中断,此时IICCON[4]为1,I2C传输暂停。
(6)如果没有数据要发送,则跳到步骤10准备结束传输,否则就执行步骤7继续传输。
(7)将下一个要发送的数据写入到IICDS寄存器中。
(8)往IICCON[4]中写入0,恢复I2C传输。
(9)这时IICDS寄存器中的值将被一位一位的发送出去,当8位数据发送完毕,再经过另一个SCL周期(对应ACK信号)后,中断再次发生,跳到步骤5.
(10)将0xD0写入IISTAT寄存器,即:设为主机发送器,全能串行输出功能,发出P信号。
(11)清除IICCON[4],P信号得以发出。
(12)等待一段时间,使得P信号完全发出。
五. I2C总线操作实例
选择M41t11或者 LM75等常见I2C芯片作为I2C从机,这里选择M41T11,从机地址为0XD0,M41T11中有8个寄存器,分别对应秒,分,时,天(星期几),日,月,年,控制寄存器,其中数据都以BCD格式保存,读写M41t11的步骤:
1. 主机向M41t11发出要操作的寄存器地址(0~7)
2. 要设置M41t11时,主机连续发出数据,要读取M41t11时,主机连续读取数据。
实例将可以设置时间,也可以读取时间,用于验证I2C主机发送,接收等操作方法。
1. S3C2440 IC2控制器初始化
2. I2C主机发送函数
3. I2C主机接收函数
4. I2C中断服务程序
5. M41t11的特性相关操作----设置时间函数
6. M41t11的特性相关操作----读取时间函数
7. 实例的连接脚本