第二十章I2C总线概述S3C2410处理器支持一个多主I2C串行总线接口。一根专用串行数据线SDA和一根串行时钟线SCL在总线主机和连到I2C总线上的外设之间传输数据,SDA和SCL都是双向的。在多主I2C总线模式下,处理器能与从设备接收或者发送串行数据。S3C2410主机可以初始化和停止一次基于I2C总线的传输,此芯片上的I2C总线使用标准的总线仲裁策略。为了控制多主I2C总线操作,如下寄存器必须被设置好:—多主I2C总线控制寄存器,IICCON—多主I2C总线控制/状态寄存器,IICSTAT—多主I2C总线Tx/Rx移位寄存器,IICDS—多主I2C总线地址寄存器,IICADD当I2C总线空闲时,SDA和SCL线都处于高电平状态,当SCL保持高电平时,一个SDA下降沿可以初始化一个起始条件;当SCL保持高电平时,SDA的一个上升沿可以初始化一个停止条件。起始和停止条件总是由主设备发起的,起始条件停止后第一个字节是一个7位地址值——决定总线主选择哪个从设备。第8位决定此次传输的方向(读还是写)。发送到SDA上的每个数据必须是8位的,在整个总线传输操作期间字节可以被无限地发送和接收。数据总是从MSB开始传输,所有字节后都必须跟1个ACK应答位。图20-1I2C总线方框图注意:IIC数据保持数据(tSDAH)最小为0ns。(IICdataholdtimeisminimum0nsforstandard/fastbusmodeinIICspecificationv2.1.)。请检查你的I2C总线设备是否是0ns。I2C控制器仅支持I2C总线设备(标准和快速总线模式),不支持C总线设备I2C总线接口S3C2410的I2C总线接口有如下4种操作模式:—主发生器模式—主接收器模式—从发送器模式—从接收器模式各种操作模式之间的联系如下起始和停止条件当I2C总线接口无动作时,它通常处于从模式。换句话说,在从SDA上检测到一个起始条件前接口将处于从模式(当SCL保持高电平时,一个SDA下降沿可以初始化一个起始条件)。当接口状态变成主模式时,可以初始化SDA上的一个数据传输,且SCL信号产生。一个起始条件可以在SDA上发送1个字节的数据,而1个停止条件可以停止数据传输。停止信号是当SCL保持高电平时SDA的一个上升沿。起始和停止条件总是由主机发起的。当一个起始条件产生和,设备获得I2C总线;一个停止条件将释放I2C总线。主机通过发送一个停止条件来结束某次传输,但是应该发送一个从地址以通知对应的从设备。地址字节包括7位的地址和1位的传输方向描述(读或写)。如果第8位为0,将执行写操作(发送);如果第8位为1,将执行读操作(接收)。主机通过发送1个停止条件来结束一次传输。如果主机希望继续向总线发送数据,应该发起另外一个起始条件和从地址,这种方式下,将以不同的格式执行读写操作。图20-2起始和停止条件数据传输格式放到SDA上的每个字节必须是8位长度的,每次传输可以发送无限多个字节。起始条件后紧跟着地址字节,地址字节必须当I2C总线工作在主模式下被主机发送。每个字节后面应该跟一个ACK应答位,数据和地址字节的MSB位总是被最先发送的。图20-3I2C总线数据格式ACK信号传输为了完成1个字节的传输操作,接收器应该向发送器发送一个ACK位,ACK脉冲应该在第9个SCL时钟处发生,一个字节的数据传输需要8个SCL时钟,主机应该产生发送ACK位所需的时钟脉冲。ACK位发送功能可以通过软件使能和禁止(IICSTAT)。但是第9个SCL时钟处的ACK脉冲是必须的,只有这样才能完成一次数据传输。读-写操作在发送器模式下,当1个数据发送完毕,I2C总线将等待I2C总线数据移位寄存器IICDS被写入一个新的数据,在此之前,SCL信号将保持低电平,andthenreleasedafteritiswritten。S3C2410将保持中断以识别当前的数据发送完成,当CPU接收到此中断请求后,将会重新向IICDS写入一个新的数据。在接收器模式下,当接收到一个数据后,IIC总线接口将等待IICDS中的数据被读出,在此之前,SCL将保持低电平。S3C2410将保持中断以识别当前的数据接收完成,当CPU接收到此中断请求后,将会从IICDS读入一个数据。总线仲裁策略总线仲裁发生在SDA上以防止两个主机连接到总线上,如果一个SDA为高的主机检测到另外1个SDA为低电平的主机,它将不会初始化一次数据传输,因为总线当前电平不允许它,仲裁过程将延续到SDA线变高。但是,当多个主机同时将SDA拉低时,每个主机都应该判断是否总线是否分配给了它,出于这个目的,每个主机应该检测总线上地址位。当主机发送地址时,同时检测SDA上的地址位因为SDA上的低电平比高电平更容易竞争到总线,假设一个主机发送的地址的第1位为低,而另一个主机的为高电平,这种情况下两个主机都会检测到总线为低电平因为SDA上的低电平比高电平更容易竞争到总线(意味着目的地址越小优先级越高),发送低电平的主机将获得总线使用权而发送高电平的主机将退出总线竞争,如果两个主机的地址第1位都是低电平,将会仲裁第2位,以此类推,总线仲裁一直会持续到地址的最后1位。异常中止条件如果1个从接收器不能确认从地址,SDA将会保持高电平状态,此时主机应该发起一个停止条件以中止此次传输。如果主接收器碰到这种情况,就应该在从从设备接收到数据后不要发送ACK应答,这样会结束从发送操作。从发送器将会释放SDA以允许主机发起一个停止条件。配置IIC总线为了控制SCL的频率,可以对IICCON寄存器编程设置4位预定标器的值。I2C总线控制器的地址存在IICADD寄存器中(默认情况下,此地址是一个不确定值)。各种模式下的操作流程图I2C收发操作之前必须执行下述步骤:1)如果需要的话,向IICADD寄存器写入从地址2)设置IICCON寄存器a)使能中断b)定义SCL频率3)设置IICSTAT寄存器使能串行输出。图20-6主发送器模式操作图20-7主接收器模式操作I2C总线特殊寄存器多主I2C总线控制寄存器IICCON注:1、与EEPROM接口时,为了在接收模式产生停止条件,ACK产生也许会在读最后一个数据前被禁止。2、I2C总线中断发生在:1)1个字节的数据发送或接收完毕;2)通用调用或者从地址匹配成功;3)总线仲裁失败。3、为了在SCL上升沿到来之前调整好SDA的建立时间,清除I2C中断请求位前IICDS必须被写入。4、IICCLK由IICCON[6]决定,发送时钟可以由SCL跳变时间改变。当IICCON[6]=0时,IICCON[3:0]=0或1是不可能的。5、如果IICCON[5]=0,IICON[4]不会正确操作,因此建议将IICCON[5]设置成1,即使不使用I2C中断。