第17章I2C接口本章介绍该设备上实现的两个I2C总线接口。注意,在大多数情况下,这两个I2C接口完全相同,因此作为一个一般的控制器来介绍。必要时标出这两个接口的不同之处。17.1绪论IC间(IIC或I2C)总线是一种两线制——串行数据(SDA)和串行时钟(SCL)——双向串行总线,在本设备与其他设备之间提供一种简单有效的数据交换方法,例如与微控制器、EEPROM、实时时钟设备、A/D转换器和LCD等。I2C接口的结构图如图17-1所示。图17-1I2C结构图17.1.1概述两线制I2C总线将设备之间的互联最小化。同步、多主控I2C总线允许将其他设备连接到总线上,以进行扩展和系统开发。总线包括冲突检测和仲裁功能,防止当两个或多个主控设备试图同时控制总线时发生数据错误。17.1.2特性每个I2C总线接口包括以下特性:�两线制接口�多主控操作�仲裁丢失中断,具有从主设备到从设备的自动模式切换。�调用地址标识中断�START与STOP信号的产生与检测�确认位的产生与检测�总线忙检测�软件可编程的时钟频率�软件可选择的确认位�总线上尖峰信号的片上滤波17.1.3操作模式该设备上的I2C单元有以下几种操作模式:�主设备模式。I2C总线驱动SDAn信号线。它不能使用它自己的从设备地址作为调用地址。I2C不能同时作为主设备和从设备。�从设备模式。I2C总线不驱动SDAn信号。这个模块必须在检测到I2C主设备发来的START状态前启用。�中断驱动的逐字节的数据传输。当成功获得从设备地址(并且SCLn回到零状态)时,数据传输以逐字节的方式进行,数据传输的方向由调用主机发出的R//W位决定。每个数据字节的后面必须跟一个确认位,该位由接收设备发出。在一个数据传输会话期间可以传送多个字节。�引导定序器模式。I2C1控制器支持引导定序器模式。在I2C模块初始化之后,可以使用该模式初始化设备中的配置寄存器。使用复位配置字高端中的BOOTSEQ选择引导定序器模式。注意,硬编码的复位配置字高端值是引导定序器模式禁止的。I2C2控制器不支持该模式。�复位配置装入(只限I2C1)。在这个模式下,当设备上的其余部分都处于复位状态时(/HRESET有效),I2C1接口用一个特定调用地址从EEPROM装入复位配置字。一旦将复位配置字锁定到设备中,就复位I2C1,直到/HRESET无效。在/HRESET无效后,就可以根据复位配置字中的BOOTSEQ,使用引导定序器模式初始化该设备。参见第4.4.3.2节“从I2CEEPROM装入”。另外,为I2C接口定义了下面三种状态:�START状态。该状态标志一个新的数据传输的开始(每次数据传输包含多个字节)并唤醒所有的从设备。�重复的START状态。所产生的无STOP状态的START状态,以终止前一个数据传输。�STOP状态。主设备通过产生一个STOP状态终止传输并释放总线。17.2外部信号说明下面几节概述信号,并给出了详细信号描述。17.2.1信号概述I2C接口通过SDAn和SCLn信号传输数据,说明见表17-1。注意,SDAn上驱动的信号模式在协议的不同时段分别代表地址、数据或读/写信息。表17.1I2C接口信号说明信号名称空闲状态I/O状态含义串行时钟(SCL1,高I当I2C模块空闲或作为一个从设备时,将SCLn默认为一个输入信号。该单元使用SCLn同步SDAn上的输入数据。当检测SCL2)到SCLn为低时,认为总线忙。O作为主设备时,I2C模块在发送时驱动SCLn和SDAn。作为从设备时,I2C模块驱动为调整数据的速度,将SCLn驱动为无效。串行数据(SDA1,SDA2)高I当I2C模块空闲或在接收模式下,将SDAn默认为一个输入信号。该单元在SDAn上接收来自其他I2C设备的数据。当检测到SDAn为低时,认为总线忙。O作为主设备或从设备时,I2C模块在SDAn上驱动数据,与SCLn同步。17.2.2详细信号说明SDAn和SCLn的说明见表17-2,用来实现与其他设备的通信互连。连接到这些信号上的所有设备都必须具有开漏极或开集极的输出。在这两个带外接上拉电阻的信号上执行逻辑AND功能。有关电气特性,请参考MPC8349E硬件说明书。表17-2I2C接口信号-详细信号说明信号I/O描述SCL1,SCL2I/O串行时钟。当把MPC8349E设定为从设备时,这个信号被作为一个输入。当把MPC8349E设定为主设备时,这个信号被作为一个输出。O作为双向串行时钟的输出,这些信号的操作如下所述。状态含义有效/无效——与SDAn一起驱动,作为数据的时钟。I作为双向串行时钟的输入,这些信号的操作如下。状态含义有效/无效——I2C单元使用该信号同步SDAn上的输入数据。当检测到这个信号为低时,认为总线忙。SDA1,SDA2I/O串行数据。当MPC8349E处在接收模式时,将这个信号作为一个输入。当MPC8349E发送数据时(作为I2C主设备或从设备),将这个信号作为一个输出。O作为双向串行数据的输出,这些信号的操作如下。状态含义有效/无效——驱动数据I作为双向串行数据的输入,这些信号的操作如下。状态含义有效/无效——用于接收来自其他设备的数据。当检测到SDAn为低时,认为总线忙。17.3内存映射/寄存器定义表17-3列出了I2C特定的寄存器及地址。表17-3I2C内存映射地址I2C寄存器访问方式复位节/页0x0_3000I2C1ADR——I2C1地址寄存器读/写0x0017.3.1.1/17-50x0_3004I2C1FDR——I2C1分频寄存器读/写0x0017.3.1.2/17-50x0_3008I2C1CR——I2C1控制寄存器读/写0x0017.3.1.3/17-60x0_300CI2C1SR——I2C1状态寄存器读/写0x8117.3.1.4/17-80x0_3010I2C1DR——I2C1数据寄存器读/写0x0017.3.1.5/17-90x0_3014I2C1DFSRR——I2C1数字过滤采样速率寄存器读/写0x1017.3.1.6/17-90x0_301C-0x0_30FF保留,应清除———0x0_3100I2C2ADR——I2C2地址寄存器读/写0x0017.3.1.1/17-50x0_3104I2C2FDR——I2C2分频寄存器读/写0x0017.3.1.2/17-50x0_3108I2C2CR——I2C2控制寄存器读/写0x0017.3.1.3/17-60x0_310CI2C2SR——I2C2状态寄存器读/写0x8117.3.1.4/17-80x0_3110I2C2DR——I2C2数据寄存器读/写0x0017.3.1.5/17-90x0_3114I2C2DFSRR——I2C2数字过滤器采样速率寄存器读/写0x1017.3.1.6/17-90x0_311C-0x0_31FF保留,应清除———17.3.1寄存器说明本节详细说明I2C寄存器。注意对保留位的写操作必须使用读到的原值,也就是说应这样设置寄存器:读取寄存器值,修改适合的字段,将值写回。不能假设保留字段的返回值,尽管保留字段返回零。I2Cn数据寄存器(I2CnDR)除外。17.3.1.1I2Cn地址寄存器(I2CnADRI2CnAddressRegister)图17-2显示了I2CnADR寄存器。当作为从设备时,该寄存器包含I2C接口响应的地址。注意,在I2C模块处于主设备模式时,它并不是地址调用周期在总线上的发送地址。图17-2I2Cn地址寄存器(I2CnADR)表17-4说明了I2CnADR的位设置。表17-4I2CnADR字段说明位名称说明0—6ADDR从设备地址。包含I2C接口使用的特定从设备地址。注意,I2C接口的默认模式是用于地址匹配的从设备模式。注意,地址匹配是使I2CnSR[MIF]置位的一种状态,通知中断挂起状态。7—保留,应清除17.3.1.2I2Cn分频寄存器(I2CnFDR)图17-3显示了I2Cn分频寄存器位。图17-3I2Cn分频寄存器(I2CnFDR)表17-5说明了I2CnFDR的位设置,并列出了I2CnFDR[FDR]对应的分频数。表17-5I2CnFDR字段说明位数名称说明0—1—保留,应清除2—7FDR分频比率。用于位速率选择时钟的预分频。SCLn上的串行位时钟频率等于I2Cn控制器频率除以分频数。串行位时钟频率分频数的选择如下:FDR分频数FDR分频数FDR分频数0x003840x16122880x2b10240x014160x17153600x2c12800x024800x18184320x2d15360x035760x19204800x2e17920x046400x1a245760x2f20480x057040x1b307200x3025600x068320x1c368640x3130720x0710240x1d409600x3235840x0811520x1e491520x3340960x0912800x1f611400x3451200x0a15360x202560x3561440x0b19200x212880x3671680x0c23040x223200x3781920x0d25600x233520x38102400x0e30720x243840x39122880x0f38400x254480x3a143360x1046080x265120x3b163840x1151200x275760x3c204800x1261440x286400x3d245760x1376800x297680x3e286720x1492160x2a8960x3f327680x1510240注意表17-5说明了I2C控制器内部时钟和SCL的比率。但是,I2C控制器时钟与CSB时钟频率的默认比率为1:3(I2C控制器时钟的频率比CBS时钟频率慢3倍)。该比率在SCCR[TSEC2CM]中设置。在选择FDR值时,用户应考虑这个因素。17.3.1.3I2Cn控制寄存器(I2CnCR)图17-4显示了I2Cn控制寄存器。图17-4I2Cn控制寄存器(I2CnCR)表17-6说明了I2CnCR的位设置。表17-6I2CnCR字段说明字位名称说明0MEN模块启用。控制I2C模块的软复位。0复位并禁用模块。接口保持在复位状态,但仍可以访问寄存器。1启用I2C模块。必须要在控制寄存器中其他字节产生作用之前置位MEN。用于从设备接收或作为主设备START的所有的I2C寄存器都可以在置位该位之前初始化。1MIEN模块中断允许0禁止来自I2C模块的中断。这不清除任何挂起的中断。1允许来自I2C模块的中断。如果I2CnSR[MIF]也置位,则产生中断。2MSTA主设备/从设备模式START0将MSTA从1变为0时,产生一个STOP状态,并将模式从主设备变为从设备。若主设备失去仲裁,则清除该位时不产生STOP状态。1当MSTA从0变为1时,在总线上产生一个START状态,并选择主设备模式。3MTX发送/接收模式选择。选择主设备和从设备的传送方向。当配置为从设备时,应由软件根据I2CnSR[SRW]设置该位。在主设备模式下,应根据所要求的传送类型设置该位。因此,在地址周期,这一位始终为高。当主设备失去仲裁时,清除MTX。0接收模式1发送模式4TXAK发送确认标志。为主设备和从设备接收方规定在确认周期期间在SDAn上传输的值。该位的值仅在将I2C模块配置位接收方而不是发送方时才适用。它也不适用于地址周期。当设备被指定为从设备时,始终发送确认位。0在接收完一个字节数据后的第9个周期位将确认信号(在SDAn上为低值)发送到总线上。1不发送确认信号响应(在SDAn上为高值)5RSTA重复的START。注意,这个字段不是可读的,意思是如果读了RSTA,则返回值为0。0不产生START状态。1置位该位始终在总线上产生重复的START状态,向设备提供当前总线主设备。在错误的时间产生重复的START状态(或者如果总线被别的主设备所控制),将导致失去仲裁。6—保留,应清除7B