第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