《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于C8051F的SMBus串行通信的原理和實(shí)現(xiàn)
基于C8051F的SMBus串行通信的原理和實(shí)現(xiàn)
來(lái)源:電子技術(shù)應(yīng)用2010年第5期
張媛媛 徐雪松 何怡剛
長(zhǎng)沙湖南大學(xué)電氣與信息工程學(xué)院(410082)
摘要: 在介紹C8051F串行通信總線SMBus的特點(diǎn)及功能的基礎(chǔ)上,,重點(diǎn)介紹了其協(xié)議、總線仲裁,、寄存器以及C8051F02x與多個(gè)EEPROM串行通信的實(shí)現(xiàn),,并給出了部分應(yīng)用程序,。
Abstract:
Key words :

摘 要: 在介紹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
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。