曹雨
摘 要: IIC總線讀寫故障是IIC器件使用過程中無法回避的現(xiàn)實問題,本文以實際研究為背景,以三星S3C2440A RISC微處理器為例介紹了IIC總線故障的分析及軟件處理方法,為實際應(yīng)用提供了參考。
關(guān)鍵詞: S3C2440A;IIC總線;故障處理
一、前言
IIC總線是由Philips公司開發(fā)并成功推廣的一種雙向兩線通信方式,所有符合IIC總線協(xié)議的器件可通過IIC總線進行獨立通信,實現(xiàn)了IC之間的有效控制。由于IIC總線上可以掛載多個IIC器件,個別IIC器件如果出現(xiàn)故障可能引起總線鎖死,進而引起整個總線通信故障。本文以三星公司的一款RISC微處理器S3C2440A的IIC接口為例對IIC總線讀寫故障的分析及處理進行了研究,給出了故障現(xiàn)象分析及軟件處理方法。
二、S3C2440A的IIC總線接口
三星公司的S3C2440A為手持設(shè)備和普通應(yīng)用提供了低功耗和高性能的小型芯片微處理器的解決方案,其處理器是基于Advanced RISC Machines(ARM)公司設(shè)計的16/32位ARM920T核心。S3C2440A可以支持一個多主控IIC總線串行接口。一條專用串行數(shù)據(jù)線(SDA)和一條專用串行時鐘線(SCL)傳遞連接到IIC總線的主控和外設(shè)之間的信息。在多主控IIC總線模式中,多個S3C2440A可以發(fā)送或接收串行數(shù)據(jù)來自或到從設(shè)備。主機S3C2440A可以通過IIC總線啟動和結(jié)束數(shù)據(jù)傳輸,S3C2440A的IIC總線是使用標準總線仲裁步驟。為了控制多主控IIC總線操作,必須寫入值到以下寄存器中:IIC總線控制寄存器(IICCON)、IIC總線控制/狀態(tài)寄存器(IICSTAT)、IIC總線Tx/Rx數(shù)據(jù)移位寄存器(IICDS)、IIC總線地址寄存器(IICADD)。
當釋放了IIC總線時,SDA和SCL線應(yīng)該都保持為高電平。一個高到低SDA的變化可以啟動一個起始條件。SCL穩(wěn)定保持在高電平時的一個低到高SDA的變化可以啟動一個停止條件。起始和停止條件通常由主設(shè)備產(chǎn)生。第一個數(shù)據(jù)字節(jié)為7位地址值,其在啟動起始條件后放到總線上,可以確定出主設(shè)備要選擇的從設(shè)備。第8位是決定傳輸方向(讀或?qū)懀?。每個放到SDA線上的字節(jié)都應(yīng)該總共為8位。字節(jié)可以在總線傳輸操作期間無限制的發(fā)送或接收。數(shù)據(jù)通常從最高有效位(MSB)開始發(fā)送,并且每個字節(jié)應(yīng)該立即通過應(yīng)答(ACK)位跟上。S3C2440A的IIC總線框圖如下圖1所示,圖2為主機發(fā)送器模式操作流程。
圖1 IIC總線方框圖
圖2 主機發(fā)送器模式操作流程
三、S3C2440A的IIC故障現(xiàn)象分析及處理
3.1 S3C2440A的IIC故障現(xiàn)象分析
S3C2440A的U8和M9管腳分別為IICSCL和IICSDA引腳,也可復(fù)用為普通IO口GPE14和GPE15。系統(tǒng)IIC故障時,IIC讀寫無法正常進行,表現(xiàn)為讀寫數(shù)據(jù)錯誤或始終停留在讀寫狀態(tài)等待環(huán)節(jié)。通過軟件調(diào)試跟蹤或者將關(guān)鍵信息點打印輸出可判斷IIC讀寫是否處于故障狀態(tài)。
在S3C2440A的實際應(yīng)用中有兩種典型的IIC故障問題:一是S3C2440A的IIC引腳接觸不良或損壞;二是總線上有IIC器件損壞進而使IIC總線數(shù)據(jù)讀寫異常。對于上述兩類問題的定位,可以利用S3C2440A的IIC引腳可復(fù)用的屬性來判斷,例如將U8和M9配置成普通IO口屬性,在無IIC操作時,通過對GPE14和GPE15的置高或置低,在IIC總線可測量處對電平進行實際測量,與期望電平進行對比,如果測量電平與期望電平不一致,則說明S3C2440A的引腳接觸不良或損壞,反之則可排除S3C2440A的IIC引腳問題。
3.2 S3C2440A的IIC故障軟件處理
為了防止S3C2440A的IIC故障引起讀寫狀態(tài)持續(xù)等待,在實際應(yīng)用中可添加等待超時處理。下面分別給出不含超時處理的Demo代碼及實際應(yīng)用中采用的超時處理代碼:
/*不含超時處理的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);
}
除此之外,還應(yīng)在軟件設(shè)計中添加必要的出錯處理與異常告警,比如對依靠IIC總線獲取的非核心數(shù)據(jù)使用前增加數(shù)據(jù)異常判斷,如出現(xiàn)異常值則給出錯誤提示并提供一組可用的缺省值以避免系統(tǒng)功能進入完全故障狀態(tài)。
四、結(jié)束語
本文給出的IIC總線故障分析及軟件處理方法是對實際應(yīng)用過程中所遇到的IIC故障問題的研究與總結(jié),雖以S3C2440A RISC微處理器為例進行闡述,對其他IIC器件的故障分析與處理同樣具有參考價值。在實際應(yīng)用中增加IIC讀寫等待超時處理與數(shù)據(jù)異常處理能夠有效地減小IIC器件故障給系統(tǒng)帶來的不利影響。
參考文獻
[1]何立民.I2C總線應(yīng)用系統(tǒng)設(shè)計[M].北京:北京航空航天大學出版社,1995.
[2]侯喆,何凱.由于IIC總線鎖死引起保護裝置異常的問題分析[J].電力系統(tǒng)保護與控制,2010,38(7),106-108.