- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
?
?
基于S3C2440A的IIC总线读写故障软件处理研究
?
?
曹雨
摘要:IIC总线读写故障是IIC器件使用过程中无法回避的现实问题,本文以实际研究为背景,以三星S3C2440ARISC微处理器为例介绍了IIC总线故障的分析及软件处理方法,为实际应用提供了参考。
关键词:S3C2440A;IIC总线;故障处理
一、前言
IIC总线是由Philips公司开发并成功推广的一种双向两线通信方式,所有符合IIC总线协议的器件可通过IIC总线进行独立通信,实现了IC之间的有效控制。由于IIC总线上可以挂载多个IIC器件,个别IIC器件如果出现故障可能引起总线锁死,进而引起整个总线通信故障。本文以三星公司的一款RISC微处理器S3C2440A的IIC接口为例对IIC总线读写故障的分析及处理进行了研究,给出了故障现象分析及软件处理方法。
二、S3C2440A的IIC总线接口
三星公司的S3C2440A为手持设备和普通应用提供了低功耗和高性能的小型芯片微处理器的解决方案,其处理器是基于AdvancedRISCMachines(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为主机发送器模式操作流程。
图1IIC总线方框图
图2主机发送器模式操作流程
三、S3C2440A的IIC故障現象分析及处理
3.1S3C2440A的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.2S3C2440A的IIC故障软件处理
为了防止S3C2440A的IIC故障引起读写状态持续等待,在实际应用中可添加等待超时处理。下面分别给出不含超时处理的Demo代码及实际应用中采用的超时处理代码:
/*不含超时处理的Demo代码*/
voidIICWrite(U8slvAddr,U32addr,U8data)
{
_iicMode=WRDATA;
_iicPt=0;
_iicData[0]=(U8)addr;
_iicData[1]=data;
_iicDataCount=2;
rIICDS=slvAddr|((addr0xff00)8)1;
rIICSTAT=0xf0;
while(_iicDataCount!=-1);
_iicMode=POLLACK;
while(1)
{
rIICDS=slvAddr|((addr0xff00)8)1;
_iicStatus=0x100;
文档评论(0)