wuyouwuyou

ARM中I2C总线设计之我见

0
阅读(2590)

I2C总线设计的很精巧,只有两条线串行数据线SDA和串行时钟线SCL。每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主机发送器或主机接收器。它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏。串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s。

SDA和SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时这两条线路都是高电平。连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。

由于只有两条总线,所以I2C总线的起始和停止条件就比较复杂。当SCL 线是高电平时SDA 线从高电平向低电平切换这个情况表示起始条件;当SCL 是高电平时SDA 线由低电平向高电平切换表示停止条件。起始和停止条件一般由主机产生。总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后,总线被认为再次处于空闲状态。

发送到SDA 线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位MSB。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。

数据传输必须带响应。相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间,发送器释放SDA线,此时是SDA线为高。在响应的时钟脉冲期间,接收器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。

通常被寻址的接收器在接收到的每个字节后必须产生一个响应。

当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平。然后主机产生一个停止条件终止传输或者产生重复起始条件开始新的传输。

如果从机接收器响应了从机地址,但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个情况用从机在第一个字节后没有产生响应来表示。从机使数据线保持高电平,主机产生一个停止或重复起始条件。

如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一个响应,向从机发送器通知数据结束。从机发送器必须释放数据线,允许主机产生一个停止或重复起始条件。

由此可见I2C总线协议非常麻烦,幸运的是,LPC2292也实现了I2C模块的硬件,对外只提供了I2C的寄存器,使程序员从复杂的I2C协议中解脱出来。只要了解I2C协议,向相应的寄存器中写值即可,具体的实现由硬件来解决。

根据方向位状态的不同,I2C总线上存在两种类型的数据传输:

一、从主发送器向从接收器发送数据。主机发送的第一个字节是从机地址。接下来是数据字节流。从机每接收一个字节返回一个应答位。

二、从发送器向主接收器发送数据。第一个字节(从地址)由主机发送。从机返回一个应答位。接下来从机向主机发送数据字节。主机每接收一个字节返回一个应答位。接收完最后一个字节,主机返回一个“非应答位”。主器件产生所有串行时钟脉冲和起始以及停止条件。出现停止条件或重复的起始条件时传输结束。由于重复的起始条件同时是下一个串行发送的开始,因此I2C总线不会被释放。

该器件提供字节方式的I2C接口。它有4种操作模式:主发送器模式、主接收器模式、从发送器模式和从接收器模式。