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

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

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

  (2)狀態寄存器SMB0STA
  狀態寄存器SMB0STA保存一個8位的狀態碼,用于指示SMBus0接口的當前狀態,共有28個可能的SMBus0狀態,每個狀態有一個惟一的狀態碼與之對應。狀態碼的高5位是可變的,而一個有效狀態碼的低3位固定為0(當SI=1時),因此所有有效的狀態碼都是8的整數倍,這使得在軟件中用狀態碼作為轉移到正確的中斷服務程序的索引變得很容易。在本文的應用舉例中,SMBus主要工作在主發送器、主接收器和主發送器/主接收器方式,并且在中斷服務程序中用到了這些狀態碼。
2  SMBus通信實現
  C8051F具有與8051兼容的高速CIP-51內核,與MCS-51指令集完全兼容。除了具有標準8051數字外設部件之外,片內還集成了數據采集和控制系統中常用的模擬部件和其他數字外設及功能部件,是真正的混合信號片上系統。所以,該例中用C8051F020通過SMBus與三個16位地址空間的8KB字節E2PROM進行通信傳輸。它們之間由SCL和SDA連接起來。多個E2PROM的通信配置如圖2所示。將C8051F020設置為主發送器,chip_A、chip_B、chip_C設置為從接收設備。有A0~A2三個地址選擇管腳用來設置E2PROM的地址。高四位統一設置為‘0101’,低四位分別是000.001.010。所以從設備的地址是:chip_A=1010000,chip_B=1010001,chip_C=1010010。

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

  下面的程序為SMBus寫函數SM_Send,它一次將一字節寫入指定的E2PROM中;SMBus讀函數SM_Receive,它將從指定的E2PROM中讀出一字節信息;最后,給出了中斷服務程序。
//SMBus寫函數
//chip_select為被寫的設備E2PROM的地址
//byte_address為被讀的存儲單元的地址
//out_byte為要寫入存儲單元的數據
void SM_Send(char chip_select,unsigned int byte_address,
char out_byte)
{
while(SM_BUSY);  //等待SmBus空閑
SM_BUSY=1;    //占用SMBus總線
SMB0CN=0x44;     //使能SMBus,在應答周期內返回確認
BYTE_NUMBER=2;                              //地址為二字節
COMMAND=(chip_select | WRITE);  //Chip select+ WRITE
HIGH_ADD=((byte_address >> 8) & 0xFF); //高八位地址
LOW_ADD=(byte_address & 0xFF);  //低八位地址
WORD=out_byte;//寫數據
STO=0;     //發送一個停止條件
STA=1;     //開始傳輸數據
}
//SMBus讀函數
//chip_select為被讀設備E2PROM的地址
//byte_address為被讀存儲單元的地址
char SM_Receive(char chip_select,unsigned int byte_address)
{
while(SM_BUSY);  //等待總線空閑;
SM_BUSY=1;   //占用SMBus;
SMB0CN=0x44;  //使能enabled,在應答周期內返回確認
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中斷服務程序
void SMBUS_ISR (void) interrupt 7
{
  switch(SMB0STA){  //SMBus的狀態碼(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,僅高地址已發送
    SMB0DAT=LOW_ADD;
    BYTE_NUMBER--;
       break;
      case 1:       //如果BYTE_NUMBER=1,LOW_ADD已發送
      if(COMMAND & 0x01){  //如果R/W=READ,
               //重復發送START
           STO=0;
           STA=1;
      } else {
           SMB0DAT=WORD;  //如果R/W=WRITE,
           //準備發送數據字節
           BYTE_NUMBER--;
        }
        break;
     default:     //如果BYTE_NUMBER=0,傳輸結束
     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,等待接收數據
     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;                                       //清中斷標志
}
3  結束語
  SMBus具有可靠性高以及接線方便的特點,而且具有SMBus總線接口的外圍芯片也很多,所以應用起來非常方便。在本文應用舉例中,實現了二個以上的多設備通信。但需要注意的是:在主發送、接收方式下,一旦SMBus檢測到仲裁丟失,會立即釋放SDA和SCL線。以后如未檢測到停止條件,可能會引起死循環。為此,應使用軟件超時來控制這種情況,以保證系統能夠退出。
參考文獻
1   CygnalC8051Fxxx數據手冊.www.xhl.com.cn,2002,12
2   郝冬妮,孫立春,李晶皎.基于MCU的I2C總線傳輸設計. 單片機與嵌入式系統,2003;(6)
3   潘琢金.C8051F高速SOC單片機原理及應用.北京:北京航空航天大學出版社,2000
 

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 国产一区二区三区亚洲综合 | 美女三级毛片 | 久久国产精品1区2区3区网页 | 日韩专区亚洲综合久久 | 亚洲国产成人久久午夜 | 香蕉超级碰碰碰97视频在线观看 | 亚洲成人综合视频 | 欧美日韩 国产区 在线观看 | 欧美一级高清片欧美国产欧美 | 香焦视频在线观看黄 | 欧美成人全部费免网站 | 美国三级在线观看 | 亚洲欧美在线免费 | 欧美在线观看不卡 | 国产精品久久亚洲一区二区 | 亚洲国产精品一区二区久 | 欧美成a人免费观看久久 | 国内三级视频 | 亚洲精品国产一区二区三 | 自拍视频一区 | 69成人做爰视频在线观看 | 日本人成在线视频免费播放 | 97久久精品 | 国产成在线观看免费视频成本人 | 国产高清视频免费 | 九色愉拍自拍 | 综合 欧美 亚洲日本 | 亚洲手机在线观看 | 免费观看一区二区 | 久久久成人网 | 亚洲人成网站色7799在线观看 | 三级毛片在线播放 | 欧美日韩第三页 | 成人网中文字幕色 | 伊人色在线视频 | 91香蕉国产线在线观看免费 | 97视频免费在线 | 欧美性色生活片天天看99 | 一级在线视频 | 国产成人精品视频 | 北岛玲亚洲一区在线观看 |