原创 C8051F020中的I2C总线应用

2010-7-9 17:48 4000 11 11 分类: MCU/ 嵌入式

I2C总线又叫做2-wire模式总线,顾名思义就是只有两根线的总线——SDASCLI2C总线最主要的优点就是简单性和有效性。一般I2C接口都直接在组件上,总线的空间占用很小。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。另外,I2C支持多主控,任何一个能自身进行发送和接收的设备都能成为主总线。但是同一时间只能有一个主控。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


I2C总线是由数据线SDA和时钟线SCL构成的串行总线。总线上的每个设备都有个7bit的地址码,主控通过发送7bit地址码+1bit读写指示来访问从设备。一次I2C上的通讯如下图:


点击看大图


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


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


ACK/NACK信号:应答信号。


C8051F020单片机中的SMBus接口应用。


C8051F020中的SMBus0 I/O接口是一个双线的双向串行总线,完全符合系统管理总线规范1.1版,与I2C串行总线兼容。


SMBus提供一种与I2C类似的同步机制,允许不同速度的器件共存于一个总线上。高速向下兼容,采用低电平扩展的方式来进行同步。


低电平超时,如果SCL线被总线上的从器件一直保持为低,则代表不能再进行通信了,并且这个时候主器件也不能强制SCL为高电平来纠错。所以协议规定:参加一次数据传输的器件必须检查时钟低电平时间,若超过25ms则认为是“超时”。超时后必须在10ms内复位。


总线空闲的规定:SCLSDA保持为高的时间超过50us,则认为总线处于空闲状态。如果单片机将起始标志位置1,也只能当总线为空闲时硬件才产生一个主起始条件。


前几天自己做了个主发送器和主接收器的程序,用于控制SI4720FM收发芯片。


点击看大图


如图,采用中断方式进行传输。在SDA上发送串行数据,在SCL上输出串行时钟。其实利用C8051F020来进行传输时都没有直接对这两条线进行控制,而是通过对寄存器的配置来完成的。共有5个特殊功能寄存器来实现:控制寄存器SMB0CN、时钟速率寄存器SMB0CR、地址寄存器SMB0ADR、数据寄存器SMB0DAT和状态寄存器SMB0STA。控制寄存器如下图:


点击看大图


当由单片机发送数据时(在此之前,单片机初始的时候,将交叉开关置于SMBus接口模式,开启SMBus中断,并对SMBus进行初始,即配置它的控制寄存器SMB0CN,和时钟速率寄存器SMB0CR),首先产生一个起始条件,在SDASCL都空闲50us后将STA1,然后就会产生中断,在中断中查询状态寄存器SMB0STA的值来区别各个时间的中断,中断中应相应的对STASTO进行配置,以方便下次传输。查询到是起始条件时,发送含有目标从器件地址和数据方向位的第一个字节,发送动作就是将数据写入数据寄存器SMB0DAT中。随后在收到ACK确认信号后,接着发送下一个字节。最后当传输结束时,产生一个停止条件,即将STO1。这样一次通信就完成了。


d68d359e-566b-4442-be0b-3773e5ab882c.jpg


点击看大图

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条