基于S3C2440A的IIC总线读写故障软件处理研究
2017-07-09曹雨
曹雨
摘 要: IIC总线读写故障是IIC器件使用过程中无法回避的现实问题,本文以实际研究为背景,以三星S3C2440A RISC微处理器为例介绍了IIC总线故障的分析及软件处理方法,为实际应用提供了参考。
关键词: S3C2440A;IIC总线;故障处理
一、前言
IIC总线是由Philips公司开发并成功推广的一种双向两线通信方式,所有符合IIC总线协议的器件可通过IIC总线进行独立通信,实现了IC之间的有效控制。由于IIC总线上可以挂载多个IIC器件,个别IIC器件如果出现故障可能引起总线锁死,进而引起整个总线通信故障。本文以三星公司的一款RISC微处理器S3C2440A的IIC接口为例对IIC总线读写故障的分析及处理进行了研究,给出了故障现象分析及软件处理方法。
二、S3C2440A的IIC总线接口
三星公司的S3C2440A为手持设备和普通应用提供了低功耗和高性能的小型芯片微处理器的解决方案,其处理器是基于Advanced RISC Machines(ARM)公司设计的16/32位ARM920T核心。S3C2440A可以支持一个多主控IIC总线串行接口。一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)传递连接到IIC总线的主控和外设之间的信息。在多主控IIC总线模式中,多个S3C2440A可以发送或接收串行数据来自或到从设备。主机S3C2440A可以通过IIC总线启动和结束数据传输,S3C2440A的IIC总线是使用标准总线仲裁步骤。为了控制多主控IIC总线操作,必须写入值到以下寄存器中:IIC总线控制寄存器(IICCON)、IIC总线控制/状态寄存器(IICSTAT)、IIC总线Tx/Rx数据移位寄存器(IICDS)、IIC总线地址寄存器(IICADD)。
当释放了IIC总线时,SDA和SCL线应该都保持为高电平。一个高到低SDA的变化可以启动一个起始条件。SCL稳定保持在高电平时的一个低到高SDA的变化可以启动一个停止条件。起始和停止条件通常由主设备产生。第一个数据字节为7位地址值,其在启动起始条件后放到总线上,可以确定出主设备要选择的从设备。第8位是决定传输方向(读或写)。每个放到SDA线上的字节都应该总共为8位。字节可以在总线传输操作期间无限制的发送或接收。数据通常从最高有效位(MSB)开始发送,并且每个字节应该立即通过应答(ACK)位跟上。S3C2440A的IIC总线框图如下图1所示,图2为主机发送器模式操作流程。
图1 IIC总线方框图
图2 主机发送器模式操作流程
三、S3C2440A的IIC故障現象分析及处理
3.1 S3C2440A的IIC故障现象分析
S3C2440A的U8和M9管脚分别为IICSCL和IICSDA引脚,也可复用为普通IO口GPE14和GPE15。系统IIC故障时,IIC读写无法正常进行,表现为读写数据错误或始终停留在读写状态等待环节。通过软件调试跟踪或者将关键信息点打印输出可判断IIC读写是否处于故障状态。
在S3C2440A的实际应用中有两种典型的IIC故障问题:一是S3C2440A的IIC引脚接触不良或损坏;二是总线上有IIC器件损坏进而使IIC总线数据读写异常。对于上述两类问题的定位,可以利用S3C2440A的IIC引脚可复用的属性来判断,例如将U8和M9配置成普通IO口属性,在无IIC操作时,通过对GPE14和GPE15的置高或置低,在IIC总线可测量处对电平进行实际测量,与期望电平进行对比,如果测量电平与期望电平不一致,则说明S3C2440A的引脚接触不良或损坏,反之则可排除S3C2440A的IIC引脚问题。
3.2 S3C2440A的IIC故障软件处理
为了防止S3C2440A的IIC故障引起读写状态持续等待,在实际应用中可添加等待超时处理。下面分别给出不含超时处理的Demo代码及实际应用中采用的超时处理代码:
/*不含超时处理的Demo代码*/
void IICWrite(U8 slvAddr, U32 addr, U8 data)
{
_iicMode = WRDATA;
_iicPt = 0;
_iicData[0] = (U8)addr;
_iicData[1] = data;
_iicDataCount = 2;
rIICDS = slvAddr | ((addr & 0xff00) >> 8) << 1;
rIICSTAT = 0xf0;
while(_iicDataCount != -1);
_iicMode = POLLACK;
while(1)
{
rIICDS = slvAddr | ((addr & 0xff00) >> 8) << 1;
_iicStatus = 0x100;
rIICSTAT = 0xf0;
rIICCON = 0xe0;
while(_iicStatus == 0x100);
if(!(_iicStatus & 0x1))
{
break;
}
}
rIICSTAT = 0xd0;
rIICCON = 0xe0;
Delay(1);
}
/*添加超时处理的代码*/
void IICWrite(U8 slvAddr, U32 addr, U8 data)
{
U16 cnt_1 = 0; //用于超时控制
U16 cnt_2 = 0; //用于超时控制
_iicMode = WRDATA;
_iicPt = 0;
_iicData[0] = (U8)addr;
_iicData[1] = data;
_iicDataCount = 2;
rIICDS = slvAddr | ((addr & 0xff00) >> 8) << 1;
rIICSTAT = 0xf0;
while((_iicDataCount != -1) && (cnt_1 < CNTMAX))
{
cnt_1++;
}
_iicMode = POLLACK;
while(1)
{
rIICDS = slvAddr | ((addr & 0xff00) >> 8) << 1;
_iicStatus = 0x100;
rIICSTAT = 0xf0;
rIICCON = 0xe0;
while((_iicStatus == 0x100) && (cnt_2 < CNTMAX))
{
cnt_2++;
}
if(!(_iicStatus & 0x1))
{
break;
}
}
rIICSTAT = 0xd0;
rIICCON = 0xe0;
Delay(1);
}
除此之外,還应在软件设计中添加必要的出错处理与异常告警,比如对依靠IIC总线获取的非核心数据使用前增加数据异常判断,如出现异常值则给出错误提示并提供一组可用的缺省值以避免系统功能进入完全故障状态。
四、结束语
本文给出的IIC总线故障分析及软件处理方法是对实际应用过程中所遇到的IIC故障问题的研究与总结,虽以S3C2440A RISC微处理器为例进行阐述,对其他IIC器件的故障分析与处理同样具有参考价值。在实际应用中增加IIC读写等待超时处理与数据异常处理能够有效地减小IIC器件故障给系统带来的不利影响。
参考文献
[1]何立民.I2C总线应用系统设计[M].北京:北京航空航天大学出版社,1995.
[2]侯喆,何凯.由于IIC总线锁死引起保护装置异常的问题分析[J].电力系统保护与控制,2010,38(7),106-108.