以前我们使用AMD 的GX1搭配CS5530做主板,用的还比较顺手,后来AMD的GX1停产了,加上欧洲无铅化的要求,只好在AMD的LX CPU搭配CS5536开新主板,在这片新主板上,我们为了能有一个较好的AV输出,放上了一颗AIT2138的芯片,专门负责把VGA输出转换成AV输出,AIT2138这颗芯片也可以不用软件去控制,但是如果能用软件控制,当然更好,AIT2138上有一个I2C总线可以实现软件控制,我们看到CS5536上也有一个I2C总线的接口,于是我们把他们接到了一起,实践证明,非常有效,本文将重点介绍CS5536上的这个I2C总线接口的操作方法。1、I2C总线介绍 I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。 I2C总线最主要的优点是其简单性和有效性;另一个优点是它支持多主控, 其中任何能够进行发送和接收的设备都可以成为主控。一个主控能够控制信号的传输和时钟频率,当然,在任何时间点上只能有一个主控。 I2C总线只有两条线,数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。
上图截自I2C总线的规范,它清楚地告诉我们,I2C总线,只有两条线,所有的设备(IC)都并联接在这两条线上,图中有两个MICRO CONTROLLER,A和B,告诉我们在I2C总线上可以连接多个主控。下面我们尽可能简单地说明它的通信原理。
上图同样截自I2C总线的规范,它清楚地告诉我们,I2C总线在空闲状态由两个上拉电阻把总线拉到高电平,器件对I2C总线的控制只有释放和拉低这两种方式,这一点对后面理解信号很有帮助。
I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
∙ 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
∙ 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
∙ 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,可以判断为受控单元出现故障。
先看开始和结束信号,空闲状态,SDA、SCL高,当某个主控器件要传输或接收数据时,它要将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
个人建议尽量阅读原文文献,但中文版可以做参考,对概念的理解会有帮助。
2、CS5536上的I2C总线 在CS5536这颗芯片上集成了一个I2C总线,在芯片的DATASHEET中被称作为System Management Bus Controller,简称SMB,有7个内部寄存器控制总线,使操作变得十分方便。
SMBCTL2和SMBCTL3用来指定在SCL上发送的时钟频率,其中SMBCTL2的bit0是一个使能位,1--SMB使能,0--SMB禁止,bit1--bit7是时钟频率的低7位,SMBCTL3的bit0--bit7是时钟频率的高8位,一共15位(抱歉,这些与上图中标注不符,上图尽管截自规范,但很遗憾,其中的SMBCTL2和SMBCTL3是错的),始终频率的结果符合下面公式:
tSCL= 2 x SCLFRQ x tclk
下面我们仅介绍工作在主控状态时,信号的产生方法,但CS5536也可以工作在从机模式。
START信号的产生
∙ 把SMBCTL1的INTEN置为0,采用轮询方式,如果使用中断方式,可以设为1
∙ 把SMBCTL1的START置为1,表示要产生START信号
这将使CS5536发出START信号,如果总线发生冲突,SMBST的BER将置为1;如果没有冲突,SMBST的MASTER和SDAST将被置为1,其中MASTER=1表明CS5536工作在主控方式,SDAST=1表明准备好发送数据位。
发送地址字节
发送的地址字节不能是自己的地址,另外,在SMB的寄存器中,有一个SMBADDR寄存器,这个寄存器是CS5536做从机时用的,里面放本机地址,用于比较总线上发出的地址信息,要特别说明的是,这个寄存器不是用于放地址字节的。实际发送地址字节与发送数据基本无异。
∙ 把7位地址位和一位数据传送方向位按照前面介绍I2C总线时介绍的顺序放到SMBSDA中
∙ SMBSDA中的数据发送到总线上,地址字节发送完毕。
∙ 在发送地址字节时,如果发生冲突,SMBST的BER将置位,同时SMBST的MASTER将被清0
∙ 发送完毕,将把收到的确认位放到SMBST的NEGACK中
发送数据
先说明一下SMBCTL1的STASTRE的作用,如果这位置1,当发送完一个字节并收到确认信号后,CS5536会把SDA拉低,使总线进入等待状态(前面有介绍),此时SMBST的STASTR会置位,表明总线处于等待状态,要清除此状态需要读取SMBST寄存器,如果下一字节不需进入等待,请记得把SMBCTL1的STASTRE清0。
∙ 检查SMBST的BER和NEGACK,均应该是0,BER为1说明出错(一般是总线冲突),NEGACK为1说明没有收到相应的确认信号,所以在这种情况下再发数据没有意义。
∙ 在SMBST的BER和NEGACK均为0的情况下,检查SMBST的SDAST,如果为1,表示可以发送数据
∙ 把要发送的数据字节放到SMBSDA中
∙ 数据发送到总线上
STOP信号的产生
在发送最后一个字节后不要去读SMBST
将SMBCTL1的STOP置1
如何操作CS5536的SMB? 说了半天,我们一直说SMB的寄存器,而且一直用的是偏移地址,那么到底SMB的基地址是多少?应该用I/O方式还是访问存储器的方式访问SMB呢? CS5536的所有器件均以虚拟PCI的形式挂在PCI总线上,SMB挂接在其中的ISA上,ISA的基地址就是SMB的基地址,CS5536的Vendor ID是0x1022,这个在以前的文章中说过,ISA的Device ID是0x2090,通过这两个条件就可以在PCI总线上找到这个设备,然后读取它的基地址即可。SMB的寄存器是用I/O端口映射的,所以要用in和out指令操作SMB的寄存器。
本文来源:https://www.2haoxitong.net/k/doc/15bbd81ffad6195f312ba654.html
文档为doc格式