I2C规范

发布时间:2011-09-25 19:57:27   来源:文档文库   
字号:

以前我们使用AMD GX1搭配CS5530做主板,用的还比较顺手,后来AMDGX1停产了,加上欧洲无铅化的要求,只好在AMDLX CPU搭配CS5536开新主板,在这片新主板上,我们为了能有一个较好的AV输出,放上了一颗AIT2138的芯片,专门负责把VGA输出转换成AV输出,AIT2138这颗芯片也可以不用软件去控制,但是如果能用软件控制,当然更好,AIT2138上有一个I2C总线可以实现软件控制,我们看到CS5536上也有一个I2C总线的接口,于是我们把他们接到了一起,实践证明,非常有效,本文将重点介绍CS5536上的这个I2C总线接口的操作方法。
1I2C总线介绍
I2C(InterIntegrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
I2C总线最主要的优点是其简单性和有效性;另一个优点是它支持多主控, 其中任何能够进行发送和接收的设备都可以成为主控。一个主控能够控制信号的传输和时钟频率,当然,在任何时间点上只能有一个主控。
I2C总线只有两条线,数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、ICIC之间进行双向传送,最高传送速率100kbps

上图截自I2C总线的规范,它清楚地告诉我们,I2C总线,只有两条线,所有的设备(IC)都并联接在这两条线上,图中有两个MICRO CONTROLLERAB,告诉我们在I2C总线上可以连接多个主控。下面我们尽可能简单地说明它的通信原理。

上图同样截自I2C总线的规范,它清楚地告诉我们,I2C总线在空闲状态由两个上拉电阻把总线拉到高电平,器件对I2C总线的控制只有释放和拉低这两种方式,这一点对后面理解信号很有帮助。

I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

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

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

应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,可以判断为受控单元出现故障。

先看开始和结束信号,空闲状态,SDASCL高,当某个主控器件要传输或接收数据时,它要将SDA拉低,这便产生一个开始信号,之后,主控机要控制SCL,开始在SCL上发送时钟信号,当传输完毕后,主控机首先释放SCL,然后再释放SDA,经过一定时延后,认为传输结束。

在开始信号后,主控期间开始发送时钟信号,根据规范,SDA上的数据要在SCL为低时改变,在SCL为高时保持稳定,这样数据位就可以在总线上传输,数据必须以8位为一组传输,高位在前,低位再后,8位之后要有一个确认位,在确认位的时钟周期,主控机释放SDA,此时SDA为高,从机要把SDA拉低,同时保证在SCL为高电平时保持信号稳定,如果从机由于某些原因不能马上响应下一位的数据传输,可以一直保持SDA为低,直到可以响应为止,此时,主控机将处于等待状态。

根据规范,主控机在I2C上传输的第一个字节(8位)中,bit0--bit6为地址,bit7位读/写位,0表示要向从机写信息,即由主控机向从机发送数据,1表示读数据,即表示准备从从机接收数据。很显然,接在总线上的所有器件均可以收到这个信息,但应该只有与地址码相符的从机响应,否则将引起混乱。

基本上I2C总线的传输原理就是这样,并不复杂,可以很容易地使用单片机实现,下面是I2C总线规范的下载地址:

英文原版I2C总线规范:http://blog.hengch.com/specification/i2c-en.pdf

中文翻译版I2C总线规范:http://blog.hengch.com/specification/i2c-cn.pdf

个人建议尽量阅读原文文献,但中文版可以做参考,对概念的理解会有帮助。

2CS5536上的I2C总线
CS5536这颗芯片上集成了一个I2C总线,在芯片的DATASHEET中被称作为System Management Bus Controller,简称SMB,有7个内部寄存器控制总线,使操作变得十分方便。

SMBCTL2SMBCTL3用来指定在SCL上发送的时钟频率,其中SMBCTL2bit0是一个使能位,1--SMB使能,0--SMB禁止,bit1--bit7是时钟频率的低7位,SMBCTL3bit0--bit7是时钟频率的高8位,一共15位(抱歉,这些与上图中标注不符,上图尽管截自规范,但很遗憾,其中的SMBCTL2SMBCTL3是错的),始终频率的结果符合下面公式:

tSCL= 2 x SCLFRQ x tclk

下面我们仅介绍工作在主控状态时,信号的产生方法,但CS5536也可以工作在从机模式。

START信号的产生

SMBCTL1INTEN置为0,采用轮询方式,如果使用中断方式,可以设为1

SMBCTL1START置为1,表示要产生START信号

这将使CS5536发出START信号,如果总线发生冲突,SMBSTBER将置为1;如果没有冲突,SMBSTMASTERSDAST将被置为1,其中MASTER=1表明CS5536工作在主控方式,SDAST=1表明准备好发送数据位。

发送地址字节

发送的地址字节不能是自己的地址,另外,在SMB的寄存器中,有一个SMBADDR寄存器,这个寄存器是CS5536做从机时用的,里面放本机地址,用于比较总线上发出的地址信息,要特别说明的是,这个寄存器不是用于放地址字节的。实际发送地址字节与发送数据基本无异。

7位地址位和一位数据传送方向位按照前面介绍I2C总线时介绍的顺序放到SMBSDA

SMBSDA中的数据发送到总线上,地址字节发送完毕。

在发送地址字节时,如果发生冲突,SMBSTBER将置位,同时SMBSTMASTER将被清0

发送完毕,将把收到的确认位放到SMBSTNEGACK

发送数据

先说明一下SMBCTL1STASTRE的作用,如果这位置1,当发送完一个字节并收到确认信号后,CS5536会把SDA拉低,使总线进入等待状态(前面有介绍),此时SMBSTSTASTR会置位,表明总线处于等待状态,要清除此状态需要读取SMBST寄存器,如果下一字节不需进入等待,请记得把SMBCTL1STASTRE0

检查SMBSTBERNEGACK,均应该是0BER1说明出错(一般是总线冲突),NEGACK1说明没有收到相应的确认信号,所以在这种情况下再发数据没有意义。

SMBSTBERNEGACK均为0的情况下,检查SMBSTSDAST,如果为1,表示可以发送数据

把要发送的数据字节放到SMBSDA

数据发送到总线上

STOP信号的产生

在发送最后一个字节后不要去读SMBST

SMBCTL1STOP1

如何操作CS5536SMB
说了半天,我们一直说SMB的寄存器,而且一直用的是偏移地址,那么到底SMB的基地址是多少?应该用I/O方式还是访问存储器的方式访问SMB呢?
CS5536的所有器件均以虚拟PCI的形式挂在PCI总线上,SMB挂接在其中的ISA上,ISA的基地址就是SMB的基地址,CS5536Vendor ID0x1022,这个在以前的文章中说过,ISADevice ID0x2090,通过这两个条件就可以在PCI总线上找到这个设备,然后读取它的基地址即可。SMB的寄存器是用I/O端口映射的,所以要用inout指令操作SMB的寄存器。

本文来源:https://www.2haoxitong.net/k/doc/15bbd81ffad6195f312ba654.html

《I2C规范.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式