摘 要: 在介紹C8051F串行通信總線SMBus的特點(diǎn)及功能的基礎(chǔ)上,重點(diǎn)介紹了其協(xié)議,、總線仲裁,、寄存器以及C8051F02x與多個(gè)EEPROM串行通信的實(shí)現(xiàn),并給出了部分應(yīng)用程序,。
關(guān)鍵詞: C8051F單片機(jī) 片上系統(tǒng) SMBus總線 總線仲裁
由于MCU具有小巧靈活,、價(jià)格低廉的特點(diǎn),所以在控制系統(tǒng),、嵌入式系統(tǒng)等領(lǐng)域中得到廣泛應(yīng)用,。這些應(yīng)用中,數(shù)據(jù)傳輸總線的選擇是重要的環(huán)節(jié),。并口傳輸速度雖快,,但是實(shí)現(xiàn)時(shí)需要較多的I/O口,而許多應(yīng)用系統(tǒng)的設(shè)計(jì)又必須兼顧低成本,、高可靠性,、高效率三方面,所以經(jīng)常要求在一個(gè)或幾個(gè)單片機(jī)和若干外圍器件之間傳送短的數(shù)據(jù),。目前,,大部分C8051F單片機(jī)中都集成了SMBus(System Management Bus)總線,主要是希望通過(guò)一條廉價(jià)并且功能強(qiáng)大的總線(由二條線組成)控制主板上的設(shè)備并收集相應(yīng)的信息,。使用 SMBus 的系統(tǒng)中,,設(shè)備之間發(fā)送和接收消息都是通過(guò) SMBus,而不是使用單獨(dú)的控制線,,這樣可以節(jié)省設(shè)備的管腳數(shù),。SMBus的數(shù)據(jù)傳輸率比較低,可允許單一主機(jī)與多個(gè)從設(shè)備同時(shí)收發(fā)數(shù)據(jù),。
1 系統(tǒng)管理總線SMBus
SMBus是1995年由Intel提出的一種雙線通信專利技術(shù),,它完全符合系統(tǒng)管理總線規(guī)范1.1版,,與I2C串行總線兼容。系統(tǒng)控制器對(duì)總線的讀寫(xiě)操作都是以字節(jié)為單位,,由SMBus接口自動(dòng)控制數(shù)據(jù)的串行傳輸,。SMBus可以工作在主方式和(或)從方式,一個(gè)總線上可以有多個(gè)主器件,。SMBus提供SDA(串行數(shù)據(jù))控制,、SCL(串行時(shí)鐘)產(chǎn)生和同步、仲裁邏輯以及起始/停止的控制和產(chǎn)生電路,。有三個(gè)與之相關(guān)的特殊功能寄存器:配置寄存器SMB0CF,、控制寄存器SMB0CN及用于發(fā)送和接收數(shù)據(jù)的數(shù)據(jù)寄存器SMB0DAT。
1.1 SMBus協(xié)議
SMBus有二種可能的數(shù)據(jù)傳輸類型:從主發(fā)送器到所尋址的從接收器(寫(xiě))和從被尋址的從發(fā)送器到主接收器(讀),。這二種數(shù)據(jù)傳輸都由主器件啟動(dòng),,主器件還提供串行時(shí)鐘。SMBus接口可以工作在主方式或從方式,??偩€上可以有多個(gè)主器件,如果二個(gè)或多個(gè)主器件同時(shí)啟動(dòng)數(shù)據(jù)傳輸,,則仲裁機(jī)制保證有一個(gè)主器件會(huì)贏得總線,。
一次典型的SMBus數(shù)據(jù)傳輸包括一個(gè)起始條件(Start)、一個(gè)地址字節(jié)(位7~1:7位從地址,;位0:R/W方向位),、一個(gè)或多個(gè)字節(jié)的數(shù)據(jù)和一個(gè)停止條件(Stop)。方向位占據(jù)地址字節(jié)的最低位,,當(dāng)被設(shè)置為邏輯1時(shí)表示這是一個(gè)“讀”(READ)操作,,為邏輯0時(shí)表示這是一個(gè)“寫(xiě)”(WRITE)操作。
所有的數(shù)據(jù)傳輸都由主器件啟動(dòng),,可以尋址一個(gè)或多個(gè)目標(biāo)從器件,。主器件產(chǎn)生一個(gè)起始條件,然后發(fā)送地址和方向位,。如果本次數(shù)據(jù)傳輸是一個(gè)從主器件到從器件的寫(xiě)操作,,則主器件每發(fā)送一個(gè)數(shù)據(jù)字節(jié)后等待來(lái)自從器件的確認(rèn)。如果是一個(gè)讀操作,,則由從器件發(fā)送數(shù)據(jù)并等待主器件的確認(rèn),。在數(shù)據(jù)傳輸結(jié)束時(shí),主器件產(chǎn)生一個(gè)停止條件,,結(jié)束數(shù)據(jù)交換并釋放總線,。
1.2 總線仲裁
一個(gè)主器件只能在總線空閑時(shí)啟動(dòng)一次傳輸。在一個(gè)停止條件之后或SCL和SDA保持高電平已經(jīng)超過(guò)了指定時(shí)間時(shí),,總線是空閑的,。二個(gè)或多個(gè)主器件可能在同一時(shí)刻產(chǎn)生起始條件,。由于產(chǎn)生起始條件的器件并不知道其他器件也正想占用總線,所以使用仲裁機(jī)制迫使一個(gè)主器件放棄總線,。這些主器件繼續(xù)發(fā)送起始條件,直到其中一個(gè)主器件發(fā)送高電平,,而其他主器件在SDA上發(fā)送低電平,。贏得總線的器件繼續(xù)其數(shù)據(jù)傳輸過(guò)程,而未贏得總線的器件成為從器件,。該仲裁機(jī)制是非破壞性的,因?yàn)榭倳?huì)有一個(gè)器件贏得總線,,不會(huì)發(fā)生數(shù)據(jù)丟失。
1.3 SMBus數(shù)據(jù)傳輸方式
SMBus接口可以被配置為工作在主方式和(或)從方式,。在某一時(shí)刻,,它將工作在下述四種方式之一:主發(fā)送器、主接收器,、從發(fā)送器或從接收器,。在本文的應(yīng)用舉例中,SMBus工作在主發(fā)送器和主接收器模式下,。下面以中斷驅(qū)動(dòng)的SMBus0應(yīng)用為例來(lái)重點(diǎn)說(shuō)明這二種工作方式,。當(dāng)然SMBus0也可以工作在查詢方式。
(1)主發(fā)送器方式
在SDA上發(fā)送串行數(shù)據(jù),,在SCL上輸出串行時(shí)鐘,。SMBus0接口首先產(chǎn)生一個(gè)起始條件,然后發(fā)送含有目標(biāo)從器件地址和數(shù)據(jù)方向位的第一個(gè)字節(jié),。在這種情況下數(shù)據(jù)方向位(R/W)為邏輯0,,表示這是一個(gè)“寫(xiě)”操作。SMBus0接口發(fā)送一個(gè)或多個(gè)字節(jié)的串行數(shù)據(jù),,并在每發(fā)送完一個(gè)字節(jié)后等待由從器件產(chǎn)生的確認(rèn)信號(hào)(ACK),。最后,為了指示串行傳輸?shù)慕Y(jié)束,,SMBus0產(chǎn)生一個(gè)停止條件,。
(2)主接收器方式
在SDA上接收串行數(shù)據(jù),在SCL上輸出串行時(shí)鐘,。SMBus0接口首先產(chǎn)生一個(gè)起始條件,,然后發(fā)送含有目標(biāo)從器件地址和數(shù)據(jù)方向位的第一個(gè)字節(jié)。在這種情況下數(shù)據(jù)方向位(R/W)應(yīng)為邏輯1,,表示這是一個(gè)“讀”操作,。SMBus0接口接收來(lái)自從器件的串行數(shù)據(jù)并在SCL輸出串行時(shí)鐘。每收到一個(gè)字節(jié)后,,SMBus0接口根據(jù)寄存器SMB0CN中AA位的狀態(tài)產(chǎn)一個(gè)ACK或NACK,。最后,,為了指示串行傳輸?shù)慕Y(jié)束,SMBus0產(chǎn)生一個(gè)停止條件,。
1.4 SMBus特殊功能寄存器
對(duì)SMBus串行接口的訪問(wèn)和控制是通過(guò)5個(gè)特殊功能寄存器來(lái)實(shí)現(xiàn)的:控制寄存器SMB0CN,、時(shí)鐘速率寄存器SMB0CR、地址寄存器SMB0ADR,、數(shù)據(jù)寄存器SMB0DAT和狀態(tài)寄存器SMB0STA,。SMB0DAT將保存要發(fā)送或剛接收的串行數(shù)據(jù)字節(jié);SMB0CR時(shí)鐘速率寄存器用于控制主方式下串行時(shí)鐘SCL的頻率,;SMB0ADR保存SMBus0接口的從地址,。下面將重點(diǎn)介紹控制寄存器和狀態(tài)寄存器。
(1)控制寄存器SMB0CN
SMBus控制寄存器SMB0CN用于配置和控制SMBus0接口,,操縱所有SMBus的狀態(tài)信息,。它包括起始標(biāo)志(STA)、停止標(biāo)志(STO),、確認(rèn)(AA),、中斷標(biāo)志(SI)和超時(shí)允許等。該寄存器中的所有位都可以用軟件讀或?qū)?,有二個(gè)控制位SI和STO受SMBus0硬件的影響,。圖1為SMBus控制寄存器圖。
(2)狀態(tài)寄存器SMB0STA
狀態(tài)寄存器SMB0STA保存一個(gè)8位的狀態(tài)碼,,用于指示SMBus0接口的當(dāng)前狀態(tài),,共有28個(gè)可能的SMBus0狀態(tài),每個(gè)狀態(tài)有一個(gè)惟一的狀態(tài)碼與之對(duì)應(yīng),。狀態(tài)碼的高5位是可變的,,而一個(gè)有效狀態(tài)碼的低3位固定為0(當(dāng)SI=1時(shí)),因此所有有效的狀態(tài)碼都是8的整數(shù)倍,,這使得在軟件中用狀態(tài)碼作為轉(zhuǎn)移到正確的中斷服務(wù)程序的索引變得很容易,。在本文的應(yīng)用舉例中,SMBus主要工作在主發(fā)送器,、主接收器和主發(fā)送器/主接收器方式,,并且在中斷服務(wù)程序中用到了這些狀態(tài)碼。
2 SMBus通信實(shí)現(xiàn)
C8051F具有與8051兼容的高速CIP-51內(nèi)核,,與MCS-51指令集完全兼容,。除了具有標(biāo)準(zhǔn)8051數(shù)字外設(shè)部件之外,片內(nèi)還集成了數(shù)據(jù)采集和控制系統(tǒng)中常用的模擬部件和其他數(shù)字外設(shè)及功能部件,,是真正的混合信號(hào)片上系統(tǒng),。所以,該例中用C8051F020通過(guò)SMBus與三個(gè)16位地址空間的8KB字節(jié)E2PROM進(jìn)行通信傳輸。它們之間由SCL和SDA連接起來(lái),。多個(gè)E2PROM的通信配置如圖2所示,。將C8051F020設(shè)置為主發(fā)送器,chip_A,、chip_B,、chip_C設(shè)置為從接收設(shè)備。有A0~A2三個(gè)地址選擇管腳用來(lái)設(shè)置E2PROM的地址,。高四位統(tǒng)一設(shè)置為‘0101’,,低四位分別是000.001.010。所以從設(shè)備的地址是:chip_A=1010000,,chip_B=1010001,chip_C=1010010,。
由于E2PROM有二個(gè)字節(jié)的地址空間,,這意味著在READ和WRITE操作過(guò)程中要多傳送一個(gè)字節(jié)的地址(如圖3所示)。當(dāng)中斷服務(wù)程序收到“數(shù)據(jù)已傳輸,,接收到ACK”的狀態(tài)信號(hào)時(shí),,它必須知道已傳送的是高地址字節(jié)、低地址字節(jié)還是數(shù)據(jù)字節(jié),。程序中,,BYTE_NUMBER變量將保存該信息。
下面的程序?yàn)镾MBus寫(xiě)函數(shù)SM_Send,,它一次將一字節(jié)寫(xiě)入指定的E2PROM中,;SMBus讀函數(shù)SM_Receive,它將從指定的E2PROM中讀出一字節(jié)信息,;最后,,給出了中斷服務(wù)程序。
//SMBus寫(xiě)函數(shù)
//chip_select為被寫(xiě)的設(shè)備E2PROM的地址
//byte_address為被讀的存儲(chǔ)單元的地址
//out_byte為要寫(xiě)入存儲(chǔ)單元的數(shù)據(jù)
void SM_Send(char chip_select,,unsigned int byte_address,,
char out_byte)
{
while(SM_BUSY); //等待SmBus空閑
SM_BUSY=1,; //占用SMBus總線
SMB0CN=0x44,; //使能SMBus,在應(yīng)答周期內(nèi)返回確認(rèn)
BYTE_NUMBER=2,; //地址為二字節(jié)
COMMAND=(chip_select | WRITE),; //Chip select+ WRITE
HIGH_ADD=((byte_address >> 8) & 0xFF); //高八位地址
LOW_ADD=(byte_address & 0xFF),; //低八位地址
WORD=out_byte,;//寫(xiě)數(shù)據(jù)
STO=0; //發(fā)送一個(gè)停止條件
STA=1; //開(kāi)始傳輸數(shù)據(jù)
}
//SMBus讀函數(shù)
//chip_select為被讀設(shè)備E2PROM的地址
//byte_address為被讀存儲(chǔ)單元的地址
char SM_Receive(char chip_select,,unsigned int byte_address)
{
while(SM_BUSY),; //等待總線空閑;
SM_BUSY=1,; //占用SMBus,;
SMB0CN=0x44; //使能enabled,,在應(yīng)答周期內(nèi)返回確認(rèn)
BYTE_NUMBER=2,;
COMMAND=(chip_select | READ);//Chip select+ READ
HIGH_ADD=((byte_address >> 8) & 0xFF),;
LOW_ADD=(byte_address & 0xFF),;
STO=0;
STA=1,;
while(SM_BUSY),; //等待傳輸完畢
return WORD;
}
//SMBus中斷服務(wù)程序
void SMBUS_ISR (void) interrupt 7
{
switch(SMB0STA){ //SMBus的狀態(tài)碼(SMB0STA寄存器)
case SMB_START: //SMB_START=0x08
SMB0DAT=(COMMAND & 0xFE),;//將從地址+R/W
//裝入到SMB0DAT
STA=0,; //STA清‘0’
break
case SMB_RP_START: //SMB_RP_START=0x10
SMB0DAT=COMMAND; //將從地址+R裝入
//到SMB0DAT
STA=0,;
break,;
case SMB_MTADDACK: //SMB_MTADDACK=0x18
SMB0DAT=HIGH_ADD; //將高地址裝入SMB0DAT
break,;
case SMB_MTADDNACK: //SMB_MTADDNACK=0x20
STO=1,; //確認(rèn)查詢重試
STA=1;
break,;
case SMB_MTDBACK: //SMB_MTDBACK=0x28
switch (BYTE_NUMBER){
case 2: //如果BYTE_NUMBER=2,,僅高地址已發(fā)送
SMB0DAT=LOW_ADD;
BYTE_NUMBER--,;
break,;
case 1: //如果BYTE_NUMBER=1,LOW_ADD已發(fā)送
if(COMMAND & 0x01){ //如果R/W=READ,,
//重復(fù)發(fā)送START
STO=0,;
STA=1;
} else {
SMB0DAT=WORD,; //如果R/W=WRITE,,
//準(zhǔn)備發(fā)送數(shù)據(jù)字節(jié)
BYTE_NUMBER--;
}
break,;
default: //如果BYTE_NUMBER=0,,傳輸結(jié)束
STO=1,;
SM_BUSY=0; //釋放SMBus
}
break,;
case SMB_MTDBNACK://SMB_MTDBNACK=0x30
STO=1,; //重試傳輸,置為STO
STA=1,;
break,;
case SMB_MTARBLOST://SMB_MTARBLOST=0x38
STO=1; //重試傳輸
STA=1,;
break,;
case SMB_MRADDACK://SMB_MRADDACK=0x40
AA=0; //清AA,,等待接收數(shù)據(jù)
break,;
case SMB_MRADDNACK://SMB_MRADDNACK=0x48
STO=0; //確認(rèn)查詢重試
STA=1,;
break,;
case SMB_MRDBACK: //SMB_MRDBACK=0x50
STO=1;
SM_BUSY=0,;
break;
case SMB_MRDBNACK://SMB_MRDBNACK=0x58
WORD=SMB0DAT,;
STO=1,;
SM_BUSY=0; //釋放SMBus
break,;
default:
STO=1,; //重新安排通訊
SM_BUSY=0;
break,;
}
SI=0,; //清中斷標(biāo)志
}
3 結(jié)束語(yǔ)
SMBus具有可靠性高以及接線方便的特點(diǎn),而且具有SMBus總線接口的外圍芯片也很多,,所以應(yīng)用起來(lái)非常方便,。在本文應(yīng)用舉例中,實(shí)現(xiàn)了二個(gè)以上的多設(shè)備通信,。但需要注意的是:在主發(fā)送,、接收方式下,一旦SMBus檢測(cè)到仲裁丟失,,會(huì)立即釋放SDA和SCL線,。以后如未檢測(cè)到停止條件,可能會(huì)引起死循環(huán),。為此,,應(yīng)使用軟件超時(shí)來(lái)控制這種情況,以保證系統(tǒng)能夠退出。
參考文獻(xiàn)
1 CygnalC8051Fxxx數(shù)據(jù)手冊(cè).www.xhl.com.cn,,2002,,12
2 郝冬妮,孫立春,,李晶皎.基于MCU的I2C總線傳輸設(shè)計(jì). 單片機(jī)與嵌入式系統(tǒng),,2003;(6)
3 潘琢金.C8051F高速SOC單片機(jī)原理及應(yīng)用.北京:北京航空航天大學(xué)出版社,,2000