1 概述
I2C总线是一种双向两线制串行总线,由一条串行时钟线SCL和一条串行数据线SDA组成,在由CPU为核心的系统中,作为总线用于CPU与其他被控芯片间的信息传递。在同一组I2C总线上,可以挂接多个CPU及被控芯片,CPU既可以作为主器件,控制I2C总线的工作模式,也可以作为从器件,在其他CPU的控制下发送或接收数据。I2C总线控制技术能大大简化硬件设计,增加控制功能,因此在数字电视机、DVD机、手机等较复杂的电子设备中,得到广泛的应用。
2 S3C44B0x中的I2C总线接口
S3C44B0x是三星公司生产的采用ARM7TDMI内核的32位嵌入式处理器,内部集成了I2C总线接口模块,可以作为主器件或从器件直接挂接在I2C总线上。与I2C总线接口有关的专用寄存器有以下四个[1]:
2.1 I2C总线控制寄存器——IICCON
IICCON寄存器主要用来设置应答信号使能及发送时钟频率等,初始状态值为00000000B,他各位的功能如表1。
2.2 I2C状态寄存器——IICSTAT
IICSTAT寄存器主要用来设置I2C总线的工作模式及工作状态控制,初始状态下为00000000B,各位的功能定义如表2。
2.3 I2C总线地址寄存器——IICADD
当CPU工作在从器件工作模式下时,IICADD用来存放CPU的7位从器件地址。
2.4 I2C总线发送/接收数据移位寄存器——IICDS
CPU用来发送数据时,用于存放需要发送出去的一个字节数据。当CPU用来接收数据时,用于暂存从SDA线接收到的一个字节数据。


FM24C16是容量为2048×8bit的非易失性串行EEPROM,在高档彩电、录像机中应用较广泛,作为从器件通过I2C总线与CPU连接,从地址为1010xXXB,XXX是其页面地址,存储空间共分为8页,页面地址从000到111,每页容量258×8bit。图1是FM24C16与S3C44B0x的硬件连接。WP引脚为写保护输入端。WP=1时,只允许读数据;WP=0时,允许读/写数据。
3 EEPROM的器件寻址
主器件在需要传输数据时,首先产生起始条件,然后向FM24C16发送一个控制字节。控制字节包含一个4位的控制代码1010B和3个块选择位B2B1B0[2],主器件利用块选择位来指定对FM24C16中的8个页面的哪个页面进行操作。控制字节的最后一位定义了这次数据传输是写操作(为0)还是读操作(为1)。控制字节的构成见图2。

3.1I2C接口的配置
S3C44B0x的PF0和PF1口工作在第二功能模式下,分别作为I2C总线的SCL线和SDA线。因此,需将PF0和PF1设置在第二功能模式下,程序语句为:
rPCONF∣= 0xa; ∥PF0:IICSCL,PF1:IICSDA
rPUPF∣= 0x3; ∥禁止内部上拉
由于S3C44B0x是采用中断方式来检测每个字节的传送是否成功,因此需要定义中断处理程序,并且使能中断。设中断处理程序入口地址为IIC_Int,则程序语句为:
pISR_IIC=(unsigned)IIC_Int; ∥将I2C中断处理程序指针指向IIC_Int
rINTMSK=~(BIT_GLOBAL∣BIT_IIC); ∥使能中断
对IICCON寄存器进行设置,要求使能ACK信号的产生,输出时钟源IICCLK选择MCLK/16,使能发送/接收中断,清除中断标志位以便响应中断,发送时钟频率选择250KHZ(64MHZ/16/16),程序语句为:
rIICCON∣= 0xaf;
3.2 程序设计
3.3.1 S3C44B0x作为主器件向FM24C16发送数据的程序流程见图3。

3.3.2 S3C44B0x作为主器件从FM24C16中读取数据的程序流程见图4。

3.3.3 S3C44B0x的I2C中断处理子程序:
viod_irq IIC_Int(viod)
{
U32 iicSt,i;
rI_ISPC=BIT_IIC
iicSt=rIICSTAT
if(iicSt&0x8){}
if(iicSt&0x4){}
if(iicSt&0x2){}
if(iicSt&0x1){}
switch(_iicMode)
{
case POLLACK:
_iicStatus=iicSt;
break;
case RDDATA:
if((_iicDataCount --)==0)
{
_iicData[_iicPt++]=rIICDS;
rIICSTAT=0x90;
rIICCON=0xaf;
Delay(1);
break;
}
_iicData[_iicPt++]=rIICDS;
if((_iicDataCount)==0)
rIICCON=0x2f;
else
rIICCON=0xaf;
break;
case WRDATA:
if((_iicDataCount--)==0)
{
rIICSTAT=0xd0;
rIICCON=0xaf;
Delay(1);
break;
}
rIICDS=_iicData[_iicPt++];
for(i=0;i<10;i++);
rIICCON=0xaf;
break;
case SETRDADDR;
//Uart_Printf("[S%d]",_iicDataCount);
if((_iicDataCount--)==0)
{
break;
}
rIICDS=_iicData[_iicPt++];
for(i=0;i<10;i++);
rIICCON=0xaf;
break;
default;
break;
}
}
4 结论
通过多年来的电视机维修实践发现,当电视机内的EEPROM芯片发生故障时,往往无从下手。而采用本设计方案,可以便捷地观察其内部数据结构,从而发现故障的原因,还可以对被破坏了的数据进行修复。对于新更换的EEPROM芯片,也可以利用该设计方案从新固化数据。实践表明,在发送时钟频率为250KHZ时,通过约2米的普通线将彩电的EEPROM芯片在线与Create-ARM44B0x嵌入式教学开发平台相连,数据传送的正确率达100%,且抗干扰能力很强。




