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

摘 要: 在介紹C8051F串行通信總線SMBus的特點及功能的基礎(chǔ)上,重點介紹了其協(xié)議、總線仲裁、寄存器以及C8051F02x與多個EEPROM串行通信的實現(xiàn),并給出了部分應(yīng)用程序。
關(guān)鍵詞: C8051F單片機  片上系統(tǒng)  SMBus總線  總線仲裁

  由于MCU具有小巧靈活、價格低廉的特點,所以在控制系統(tǒng)、嵌入式系統(tǒng)等領(lǐng)域中得到廣泛應(yīng)用。這些應(yīng)用中,數(shù)據(jù)傳輸總線的選擇是重要的環(huán)節(jié)。并口傳輸速度雖快,但是實現(xiàn)時需要較多的I/O口,而許多應(yīng)用系統(tǒng)的設(shè)計又必須兼顧低成本、高可靠性、高效率三方面,所以經(jīng)常要求在一個或幾個單片機和若干外圍器件之間傳送短的數(shù)據(jù)。目前,大部分C8051F單片機中都集成了SMBus(System Management Bus)總線,主要是希望通過一條廉價并且功能強大的總線(由二條線組成)控制主板上的設(shè)備并收集相應(yīng)的信息。使用 SMBus 的系統(tǒng)中,設(shè)備之間發(fā)送和接收消息都是通過 SMBus,而不是使用單獨的控制線,這樣可以節(jié)省設(shè)備的管腳數(shù)。SMBus的數(shù)據(jù)傳輸率比較低,可允許單一主機與多個從設(shè)備同時收發(fā)數(shù)據(jù)。
1  系統(tǒng)管理總線SMBus
  SMBus是1995年由Intel提出的一種雙線通信專利技術(shù),它完全符合系統(tǒng)管理總線規(guī)范1.1版,與I2C串行總線兼容。系統(tǒng)控制器對總線的讀寫操作都是以字節(jié)為單位,由SMBus接口自動控制數(shù)據(jù)的串行傳輸。SMBus可以工作在主方式和(或)從方式,一個總線上可以有多個主器件。SMBus提供SDA(串行數(shù)據(jù))控制、SCL(串行時鐘)產(chǎn)生和同步、仲裁邏輯以及起始/停止的控制和產(chǎn)生電路。有三個與之相關(guān)的特殊功能寄存器:配置寄存器SMB0CF、控制寄存器SMB0CN及用于發(fā)送和接收數(shù)據(jù)的數(shù)據(jù)寄存器SMB0DAT。
1.1 SMBus協(xié)議
  SMBus有二種可能的數(shù)據(jù)傳輸類型:從主發(fā)送器到所尋址的從接收器(寫)和從被尋址的從發(fā)送器到主接收器(讀)。這二種數(shù)據(jù)傳輸都由主器件啟動,主器件還提供串行時鐘。SMBus接口可以工作在主方式或從方式??偩€上可以有多個主器件,如果二個或多個主器件同時啟動數(shù)據(jù)傳輸,則仲裁機制保證有一個主器件會贏得總線。
  一次典型的SMBus數(shù)據(jù)傳輸包括一個起始條件(Start)、一個地址字節(jié)(位7~1:7位從地址;位0:R/W方向位)、一個或多個字節(jié)的數(shù)據(jù)和一個停止條件(Stop)。方向位占據(jù)地址字節(jié)的最低位,當(dāng)被設(shè)置為邏輯1時表示這是一個“讀”(READ)操作,為邏輯0時表示這是一個“寫”(WRITE)操作。
  所有的數(shù)據(jù)傳輸都由主器件啟動,可以尋址一個或多個目標(biāo)從器件。主器件產(chǎn)生一個起始條件,然后發(fā)送地址和方向位。如果本次數(shù)據(jù)傳輸是一個從主器件到從器件的寫操作,則主器件每發(fā)送一個數(shù)據(jù)字節(jié)后等待來自從器件的確認。如果是一個讀操作,則由從器件發(fā)送數(shù)據(jù)并等待主器件的確認。在數(shù)據(jù)傳輸結(jié)束時,主器件產(chǎn)生一個停止條件,結(jié)束數(shù)據(jù)交換并釋放總線。
1.2 總線仲裁
  一個主器件只能在總線空閑時啟動一次傳輸。在一個停止條件之后或SCL和SDA保持高電平已經(jīng)超過了指定時間時,總線是空閑的。二個或多個主器件可能在同一時刻產(chǎn)生起始條件。由于產(chǎn)生起始條件的器件并不知道其他器件也正想占用總線,所以使用仲裁機制迫使一個主器件放棄總線。這些主器件繼續(xù)發(fā)送起始條件,直到其中一個主器件發(fā)送高電平,而其他主器件在SDA上發(fā)送低電平。贏得總線的器件繼續(xù)其數(shù)據(jù)傳輸過程,而未贏得總線的器件成為從器件。該仲裁機制是非破壞性的,因為總會有一個器件贏得總線,不會發(fā)生數(shù)據(jù)丟失。
1.3 SMBus數(shù)據(jù)傳輸方式
  SMBus接口可以被配置為工作在主方式和(或)從方式。在某一時刻,它將工作在下述四種方式之一:主發(fā)送器、主接收器、從發(fā)送器或從接收器。在本文的應(yīng)用舉例中,SMBus工作在主發(fā)送器和主接收器模式下。下面以中斷驅(qū)動的SMBus0應(yīng)用為例來重點說明這二種工作方式。當(dāng)然SMBus0也可以工作在查詢方式。
  (1)主發(fā)送器方式
  在SDA上發(fā)送串行數(shù)據(jù),在SCL上輸出串行時鐘。SMBus0接口首先產(chǎn)生一個起始條件,然后發(fā)送含有目標(biāo)從器件地址和數(shù)據(jù)方向位的第一個字節(jié)。在這種情況下數(shù)據(jù)方向位(R/W)為邏輯0,表示這是一個“寫”操作。SMBus0接口發(fā)送一個或多個字節(jié)的串行數(shù)據(jù),并在每發(fā)送完一個字節(jié)后等待由從器件產(chǎn)生的確認信號(ACK)。最后,為了指示串行傳輸?shù)慕Y(jié)束,SMBus0產(chǎn)生一個停止條件。
  (2)主接收器方式
  在SDA上接收串行數(shù)據(jù),在SCL上輸出串行時鐘。SMBus0接口首先產(chǎn)生一個起始條件,然后發(fā)送含有目標(biāo)從器件地址和數(shù)據(jù)方向位的第一個字節(jié)。在這種情況下數(shù)據(jù)方向位(R/W)應(yīng)為邏輯1,表示這是一個“讀”操作。SMBus0接口接收來自從器件的串行數(shù)據(jù)并在SCL輸出串行時鐘。每收到一個字節(jié)后,SMBus0接口根據(jù)寄存器SMB0CN中AA位的狀態(tài)產(chǎn)一個ACK或NACK。最后,為了指示串行傳輸?shù)慕Y(jié)束,SMBus0產(chǎn)生一個停止條件。
1.4 SMBus特殊功能寄存器
  對SMBus串行接口的訪問和控制是通過5個特殊功能寄存器來實現(xiàn)的:控制寄存器SMB0CN、時鐘速率寄存器SMB0CR、地址寄存器SMB0ADR、數(shù)據(jù)寄存器SMB0DAT和狀態(tài)寄存器SMB0STA。SMB0DAT將保存要發(fā)送或剛接收的串行數(shù)據(jù)字節(jié);SMB0CR時鐘速率寄存器用于控制主方式下串行時鐘SCL的頻率;SMB0ADR保存SMBus0接口的從地址。下面將重點介紹控制寄存器和狀態(tài)寄存器。
  (1)控制寄存器SMB0CN
SMBus控制寄存器SMB0CN用于配置和控制SMBus0接口,操縱所有SMBus的狀態(tài)信息。它包括起始標(biāo)志(STA)、停止標(biāo)志(STO)、確認(AA)、中斷標(biāo)志(SI)和超時允許等。該寄存器中的所有位都可以用軟件讀或?qū)懀卸€控制位SI和STO受SMBus0硬件的影響。圖1為SMBus控制寄存器圖。

  (2)狀態(tài)寄存器SMB0STA
  狀態(tài)寄存器SMB0STA保存一個8位的狀態(tài)碼,用于指示SMBus0接口的當(dāng)前狀態(tài),共有28個可能的SMBus0狀態(tài),每個狀態(tài)有一個惟一的狀態(tài)碼與之對應(yīng)。狀態(tài)碼的高5位是可變的,而一個有效狀態(tài)碼的低3位固定為0(當(dāng)SI=1時),因此所有有效的狀態(tài)碼都是8的整數(shù)倍,這使得在軟件中用狀態(tài)碼作為轉(zhuǎn)移到正確的中斷服務(wù)程序的索引變得很容易。在本文的應(yīng)用舉例中,SMBus主要工作在主發(fā)送器、主接收器和主發(fā)送器/主接收器方式,并且在中斷服務(wù)程序中用到了這些狀態(tài)碼。
2  SMBus通信實現(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è)及功能部件,是真正的混合信號片上系統(tǒng)。所以,該例中用C8051F020通過SMBus與三個16位地址空間的8KB字節(jié)E2PROM進行通信傳輸。它們之間由SCL和SDA連接起來。多個E2PROM的通信配置如圖2所示。將C8051F020設(shè)置為主發(fā)送器,chip_A、chip_B、chip_C設(shè)置為從接收設(shè)備。有A0~A2三個地址選擇管腳用來設(shè)置E2PROM的地址。高四位統(tǒng)一設(shè)置為‘0101’,低四位分別是000.001.010。所以從設(shè)備的地址是:chip_A=1010000,chip_B=1010001,chip_C=1010010。

  由于E2PROM有二個字節(jié)的地址空間,這意味著在READ和WRITE操作過程中要多傳送一個字節(jié)的地址(如圖3所示)。當(dāng)中斷服務(wù)程序收到“數(shù)據(jù)已傳輸,接收到ACK”的狀態(tài)信號時,它必須知道已傳送的是高地址字節(jié)、低地址字節(jié)還是數(shù)據(jù)字節(jié)。程序中,BYTE_NUMBER變量將保存該信息。

  下面的程序為SMBus寫函數(shù)SM_Send,它一次將一字節(jié)寫入指定的E2PROM中;SMBus讀函數(shù)SM_Receive,它將從指定的E2PROM中讀出一字節(jié)信息;最后,給出了中斷服務(wù)程序。
//SMBus寫函數(shù)
//chip_select為被寫的設(shè)備E2PROM的地址
//byte_address為被讀的存儲單元的地址
//out_byte為要寫入存儲單元的數(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)返回確認
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;//寫數(shù)據(jù)
STO=0;     //發(fā)送一個停止條件
STA=1;     //開始傳輸數(shù)據(jù)
}
//SMBus讀函數(shù)
//chip_select為被讀設(shè)備E2PROM的地址
//byte_address為被讀存儲單元的地址
char SM_Receive(char chip_select,unsigned int byte_address)
{
while(SM_BUSY);  //等待總線空閑;
SM_BUSY=1;   //占用SMBus;
SMB0CN=0x44;  //使能enabled,在應(yīng)答周期內(nèi)返回確認
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;    //確認查詢重試
     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;   //確認查詢重試
     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é)束語
  SMBus具有可靠性高以及接線方便的特點,而且具有SMBus總線接口的外圍芯片也很多,所以應(yīng)用起來非常方便。在本文應(yīng)用舉例中,實現(xiàn)了二個以上的多設(shè)備通信。但需要注意的是:在主發(fā)送、接收方式下,一旦SMBus檢測到仲裁丟失,會立即釋放SDA和SCL線。以后如未檢測到停止條件,可能會引起死循環(huán)。為此,應(yīng)使用軟件超時來控制這種情況,以保證系統(tǒng)能夠退出。
參考文獻
1   CygnalC8051Fxxx數(shù)據(jù)手冊.www.xhl.com.cn,2002,12
2   郝冬妮,孫立春,李晶皎.基于MCU的I2C總線傳輸設(shè)計. 單片機與嵌入式系統(tǒng),2003;(6)
3   潘琢金.C8051F高速SOC單片機原理及應(yīng)用.北京:北京航空航天大學(xué)出版社,2000
 

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