I2C总线又叫做2-wire模式总线,顾名思义就是只有两根线的总线——SDA和SCL。I2C总线最主要的优点就是简单性和有效性。一般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内复位。
总线空闲的规定:SCL和SDA保持为高的时间超过50us,则认为总线处于空闲状态。如果单片机将起始标志位置1,也只能当总线为空闲时硬件才产生一个主起始条件。
前几天自己做了个主发送器和主接收器的程序,用于控制SI4720的FM收发芯片。
如图,采用中断方式进行传输。在SDA上发送串行数据,在SCL上输出串行时钟。其实利用C8051F020来进行传输时都没有直接对这两条线进行控制,而是通过对寄存器的配置来完成的。共有5个特殊功能寄存器来实现:控制寄存器SMB0CN、时钟速率寄存器SMB0CR、地址寄存器SMB0ADR、数据寄存器SMB0DAT和状态寄存器SMB0STA。控制寄存器如下图:
当由单片机发送数据时(在此之前,单片机初始的时候,将交叉开关置于SMBus接口模式,开启SMBus中断,并对SMBus进行初始,即配置它的控制寄存器SMB0CN,和时钟速率寄存器SMB0CR),首先产生一个起始条件,在SDA和SCL都空闲50us后将STA置1,然后就会产生中断,在中断中查询状态寄存器SMB0STA的值来区别各个时间的中断,中断中应相应的对STA和STO进行配置,以方便下次传输。查询到是起始条件时,发送含有目标从器件地址和数据方向位的第一个字节,发送动作就是将数据写入数据寄存器SMB0DAT中。随后在收到ACK确认信号后,接着发送下一个字节。最后当传输结束时,产生一个停止条件,即将STO置1。这样一次通信就完成了。
文章评论(0条评论)
登录后参与讨论