SMBUS的介紹與訪問

            博文是爲了總結自己在bios學習上面的點點滴滴,並且加深印象,由於本人水平有限,難免存在不足之處,望指正,同時感謝CSDN提供的平臺。本文主要介紹的是SMBUS。

           1  SMBUS的簡介

                 特點:

 SMBUS,System Management BUS,即系統管理總線,1995年,由Intel公司提出,應用於移動PC和桌面PC系統的低速率通訊。通過一條廉價而又功能強大的總線

(由兩條線組成),來控制主板上的設備以及收集相應的信息。
   
                   SMBUS有兩條信號線,分別爲SMBCLK與SMBDAT,即一條時鐘線一條數據線,並且這兩條信號線都是雙向的,當總線空閒時,這兩條信號線都是高電平。

                       SMBUS總線規範是基於I2C的總線規範。但與I2C總線規範也有一定的區別。
                       SMBUS與I2C總線之間在時序特性上存在一些差別。首先,SMBUS需要一定數據保持時間,而 I2C總線則是從內部延長數據保持時間。SMBUS具有超時功能,

因此當SCL太低而超過35 ms時,從器件將復位正在進行的通信。相反,I2C採用硬件復位。SMBUS具有一種警報響應地址(ARA),因此當從器件產生一箇中斷時,它不會

馬上清除中斷,而是一直保持到其收到一個由主器件發送的含有其地址的ARA爲止。SMBUS工作頻率從10kHz到最高100kHz。最低工作頻率10kHz是由SMBUS超時功能

決定的。   

應用:

SMBUS最初的目的是爲智能電池,充電電池和其他與系統進行通信的微控制器之間的通信鏈路而定義的。SMBUS也被用來連接各種設備,包括電源相關設備,系統傳感器

,EEPROM通訊設備等等。
       SMBUS最適用於筆記本電腦上,檢測各元件狀態並更新硬件設置引腳 (pull-high 或 pull-low)。例如,將不存在的 DIMM 時鐘關閉,或檢測電池低電壓狀態。 SMBUS 的

數據傳輸率只有 100Kbit/s;這允許單一主機與 CPU 和多個主從硬盤通訊並收發數據。SMBUS 也可用於免跳線設計的主板上。

      下圖爲SMBUS的拓撲結構,其總線上所掛的設備都是通過線與邏輯連接到SMBUS上面。


       



時序分析:

SMBUS的起始和停止條件



如時序圖所示,當CLK爲高電平時,DAT從高電平轉換爲低電平,表示數據傳輸信號的開始;當CLK爲高電平,DAT從低電平轉換爲高電平則表示數據傳輸的結束。


SMBUS的數據傳輸條件

 


當數據傳輸時,CLK信號線表示高電平時,DAT必須保持穩定,不可以進行高低電平切換,只有當CLK信號處於低電平的時候,纔可以進行高低電平的轉換。




SMBUS的數據傳輸每一個字節爲8位,傳輸結束之後需要跟一個相應信號爲:ACK。即每次傳輸的數據爲九位,第一個發送的數據位爲最高位。SMBUS每次傳輸的字節數量不受限制。



2 :SMBUS的訪問過程

               在DATASHEET中,給出的SMBUS的byte的讀方式如下:




但一般,在BIOS當中,一般會配置部分參數,也就是說,並不是所有的在函數中都需要配置,根據不同的bios可能會有所不同,在我所試驗的bios版本中,已經配置了很多參數,所以只需要配置必須的參數即可,總結如下:

read byte:

1:寫入slave+1,寫入地址爲base address+0x04 ,bit 0 置一表示讀操作

2:選擇需要的寄存器,設置其偏移量,地址爲base address+0x03

3:寫入操作方式0x48,寫入地址爲base address+0x02

4:讀出數據,讀數據的地址爲base address +0x05

read Word:

1:寫入slave+1,寫入地址爲base address+0x04,bit 0 置一表示讀操作

2:選擇需要的寄存器,設置其偏移量,地址爲base address+0x03

3:寫入操作方式0x4C,寫入地址爲base address+0x02

4:讀出數據,讀數據的地址爲base address +0x05,base address +0x06

write byte: 

1:寫入slave,寫入地址爲base address+0x04,bit 0 置零表示寫操作

2:選擇需要的寄存器,設置其偏移量,地址爲base address+0x03

3:寫入需要的數據:一個byte,寫數據的地址爲base address +0x05

4:設置byte的工作方式0x48,寫入地址爲base address +0x02

write Word:

1:寫入slave,寫入地址爲base address+0x04,bit 0 置零表示寫操作

2:選擇需要的寄存器,設置其偏移量,地址爲base address+0x03

3:寫入需要的數據:一個word,寫數據的地址爲base address +0x05,base address +0x06

4:設置word的工作方式0x4C,寫入地址爲base address +0x02

下面show一下intel給出的Datasheet中關於block的讀寫方式的說明:



同樣的,對一些必須的步驟進行總結:

read  block:

1:寫入slave+1,寫入地址爲base address+0x04,bit 0 置一表示讀操作

2:選擇需要的寄存器,設置其偏移量,地址爲base address+0x03

3:寫入block的工作方式0x54,寫入地址爲base address + 0x02

4:讀出count地址爲 base address + 0x05,讀出數據,地址爲 base address + 0x07

5:清標誌位,寫0x80到base address + 0x00,執行前一步,如此反覆,直到讀出count個byte


Datasheet中也給出了寫block的內容:



總結如下:

write block:

1:寫入slave+1,寫入地址爲base address+0x04,bit 0 置一表示寫操作

2:選擇需要的寄存器,設置其偏移量,地址爲base address+0x03

3:寫入count地址爲 base address + 0x05,寫入數據,地址爲 base address + 0x07

4:設置block工作方式0x54,地址爲base address + 0x02

5:清標誌位,寫0x80到base address + 0x00,執行第三步,再跳到此步,直到寫入count個byte。


上面說了很多,其實主要的設置就是兩點,一個是command,一個數據寄存器,其他都是大同小異,通過這些配置,實現不同的讀寫方式:


而我們在這些東西里面修改的主要還是寄存器,寄存器是如何工作的?在Datasheet中也有說明,下面介紹部分常用的寄存器:

     1:基址寄存器


對SMBUS進行訪問需要知道他的基地址,其基地址可以通過PCI的訪問方式,訪問位置爲bus=0,device=31,function=3,offset:20-23H的[15:5]。





bit 0,表示smbus是否空閒,bit 1,表示操作是否終止,bit 6:當前smbus是否可用,往這個位寫1表示清除該位。bit 7:表示已經執行結束一個byte的讀寫.




bit 6:用來控制操作開始,[4:2]:表示對讀寫方式的選擇:此次會用到的三種方式分別爲:010=byte,011=word,101=block


對需要操作的寄存器進行操作,在這個寄存器內設置所操作寄存器的偏移量。

[7:1]選擇slave,bit 0去決定讀寫操作,0表示寫,1表示讀。



這個寄存器有兩種功能,一個是在byte/word的方式下,作爲需要寫/讀的數據寄存器,另一種則是在block的方式下,用來存放需要讀寫的數據個數,其範圍爲不能爲0,也不能超過32,否則會產生不可預知的動作。


這個寄存器是在word的方式下用來存放數據,(DATA 0存放高八位),用來存放低八位的數據。



這個寄存器是在block方式用來存放數據的



在RU下讀一個byte示例:



程序示例,讀一個byte:


這篇博文對smbus的訪問介紹的十分詳細,在這個博文裏,使用的是smbus對spd信息進行訪問的,需要注意的是,spd信息的寫需要注意,因爲信息很重要,數據寫錯易導致內存燒掉,需要謹慎。

Thanks for your reading.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章