文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.04.014
中文引用格式: 何國鋒,劉宇紅. 基于SMBus協(xié)議的電池信息監(jiān)測系統(tǒng)[J].電子技術(shù)應(yīng)用,2016,42(4):49-52.
英文引用格式: He Guofeng,Liu Yuhong. Battery information monitoring system based on SMBus protocol[J].Application of Electronic Technique,2016,42(4):49-52.
0 引言
SMBus協(xié)議是Intel公司(聯(lián)合其他公司)在PC-I2C基礎(chǔ)上研發(fā)出來的系統(tǒng)管理總線協(xié)議。最初是為智能電池、充電電池和與其他系統(tǒng)通信的微控制器之間的通信鏈路而定義的[1],后來也被用來連接各種設(shè)備,包括電源相關(guān)設(shè)備、系統(tǒng)傳感器、EEPROM通信設(shè)備等。其被廣泛用于筆記本電腦上,檢測各元件狀態(tài)并更新硬件設(shè)置引腳。它為系統(tǒng)和電源管理這樣的任務(wù)提供了一條控制總線,使用SMBus總線的系統(tǒng),設(shè)備之間發(fā)送和接收消息都是通過SMBus總線,而不是使用單獨的控制線,這樣可以節(jié)省設(shè)備的管腳數(shù)。隨后,Intel公司聯(lián)合其他公司在此基礎(chǔ)上創(chuàng)建了智能電池管理標(biāo)準(zhǔn),SMBus成為在智能電池及低速率管理設(shè)備上被廣泛采用的協(xié)議標(biāo)準(zhǔn)。
1 SMBus協(xié)議分析
SMBus由兩根總線,即串行數(shù)據(jù)線(SDA)和串行時鐘線(SCL)構(gòu)成[2],主要用于主從系統(tǒng)。由于 SMBus是雙向通信,因此在設(shè)計電路時兩條線上都需要外接上拉電阻,數(shù)據(jù)可以在總線空閑時間進(jìn)行傳輸。
1.1 SMBus啟動和停止條件
在總線處于空閑狀態(tài)時,SMBus總線上的SCL和SDA都被上拉電阻拉至高電平。此時,當(dāng)SDA由高電平變?yōu)榈碗娖?,總線啟動SMBus協(xié)議傳輸。啟動條件產(chǎn)生后,總線就被視為忙的狀態(tài); 當(dāng)SCL為高電平時,SDA由低電平變?yōu)楦唠娖剑琒MBus傳輸停止[3],停止條件發(fā)生一段時間后,總線再次被視為空閑狀態(tài)。啟動條件和停止條件總是由主設(shè)備產(chǎn)生,圖1為模擬SMBus協(xié)議啟動和停止的時序圖,S表示啟動條件,P表示停止條件。
1.2 數(shù)據(jù)的有效性
SDA線上的數(shù)據(jù)必須在時鐘的高電平周期保持穩(wěn)定,數(shù)據(jù)線上的電平只有在SCL線為低電平時才可以改變[3]。圖2為SMBus協(xié)議數(shù)據(jù)有效性的圖示。
1.3 SMBus數(shù)據(jù)傳輸
圖3是SMBus數(shù)據(jù)傳輸協(xié)議時序圖,當(dāng)SMBus啟動信號產(chǎn)生后,數(shù)據(jù)以串行方式進(jìn)行傳輸,每次傳輸以8 bit(1 B)為一組,每次可發(fā)送的字節(jié)數(shù)不受限制,但是每個字節(jié)后必須跟一個響應(yīng)位。數(shù)據(jù)以高字節(jié)在前、低字節(jié)在后的順序傳輸,第9位為應(yīng)答位[2]。
總線上的所有器件都有一個唯一地址,并且都可以工作在接收或發(fā)送狀態(tài),構(gòu)成了4種工作模式,即主發(fā)送、主接收、從發(fā)收、從接收[3]。SMBus總線還具有仲裁功能,保證同一時刻只有一個器件在控制總線。
2 硬件實驗環(huán)境
2.1 主機(jī)系統(tǒng)實現(xiàn)
主機(jī)系統(tǒng)采用了以MSP430F149處理器為核心的開發(fā)板,MSP430是德州儀器公司推出的一款16位、具有超低功耗芯片及精簡指令集(RISC)的混合信號處理器(Mixed Signal Processor)[4],被廣泛用于智能便攜電子設(shè)備中。開發(fā)板上擁有較豐富的外設(shè)資源,同時集成了RS232模塊,可以將測得的數(shù)據(jù)信息等通過串口實時發(fā)送到上位機(jī)中,查看驗證結(jié)果。
2.2 智能電池
目前大部分智能電池對外接口都遵循SMBus協(xié)議標(biāo)準(zhǔn),本設(shè)計采用的智能電池是一塊由4節(jié)鋰電池組成的智能電池組,采用德州儀器的BQ3060電源管理芯片進(jìn)行電池管理。BQ3060芯片可以對最多4節(jié)電池構(gòu)成的電池組進(jìn)行管理,將普通電池組變成智能電池,并通過SMBus總線接口與處理器通信。
將MSP430處理器與智能電池以及其他外圍器件同時掛載到接有上拉電阻的SMBus總線上,如圖4所示。MSP430處理器為主機(jī),總線上的其他設(shè)備充當(dāng)從機(jī)。當(dāng)啟動傳輸協(xié)議時,MSP430可以通過SMBus總線獲得4節(jié)鋰電池的相關(guān)信息。
3 SMBus協(xié)議軟件實現(xiàn)
3.1 SMBus啟動
在初始時刻,總線處于空閑狀態(tài),數(shù)據(jù)線和時鐘線都被拉高,此時拉低數(shù)據(jù)線,SMBus啟動。下面是模擬SMBus協(xié)議的啟動代碼:
void SMBus_Start()
{
SDA=1; delay(); //數(shù)據(jù)位置1
SCL=1; delay(); //時鐘位置1
SDA=0; delay(); //數(shù)據(jù)位置0,啟動
SCL=0; delay(); //時鐘位置0
}
3.2 SMBus停止
在時鐘線為高時,當(dāng)數(shù)據(jù)線被拉高,SMBus停止。以下是模擬SMBus協(xié)議停止代碼:
void SMBus_Stop()
{
SDA=0;delay(); //數(shù)據(jù)位置
SCL=1;delay(); //時鐘位置1
SDA=1;delay(); //數(shù)據(jù)位置1,停止
}
3.3 SMBus檢測應(yīng)答
在數(shù)據(jù)傳輸?shù)牡?個時鐘,主機(jī)需要檢測總線上SDA的電平是否被拉低,如果規(guī)定的時鐘周期內(nèi)未檢測到低電平,視為無應(yīng)答,說明傳輸失??;如果檢測到低電平,說明從機(jī)成功接收到數(shù)據(jù),可以繼續(xù)下一步傳輸。代碼如下:
bit SMBus_CheckAck()
{
unsigned char i;
SCL = 1;delay();
while((SDA)&&(i<256)) //檢測有無應(yīng)答
i++; //數(shù)據(jù)位置1
SCL = 0;delay();
if(255 != i) //超時檢測
return 0;
else
return 1;
}
3.4 SMBus發(fā)送應(yīng)答
當(dāng)主機(jī)接收完從機(jī)發(fā)來的8 bit數(shù)據(jù)后,需要在第9個時鐘周期內(nèi)做出應(yīng)答,并且告訴從機(jī)是否繼續(xù)通信。如果繼續(xù)通信,則拉低SDA電平;如果希望終止通信,則拉高SDA上的電平。代碼如下:
void SMBus_SendAck(bit n)
{
unsigned char i;
if(n) SDA = 1;
else SDA = 0;
SCL = 1;delay();
SCL = 0;
}
3.5 SMBus讀取字節(jié)
從SMBus總線上讀取字節(jié)按照從高位到低位的順序逐位讀取,編程時在時鐘為高時讀取到的值保存到變量中并返回。
unsigned SMBus_ReadByte()
{
unsigned char i,k=0;
for( i = 0;i < 8;i++ ) //讀8 bit數(shù)據(jù)
{
SCL = 1;delay();
k = (k << 1) | SDA; //按位讀取
SCL = 0;delay();
}
return k; //返回字節(jié)
}
3.6 SMBus寫入字節(jié)
向SMBus總線上寫入字節(jié)時從高位到低位依次寫入,寫入完一個字節(jié)后將數(shù)據(jù)總線拉高。
void SMBus_WriteByte(unsigned char data)
{
unsigned char i;
temp = data;
for(i=0;i<8;i++) //按位寫入
{
SCL = 0;delay();
if((data<<i)&&0x80)
SDA = 1;
else
SDA = 0;delay();
SCL = 1;delay();
}
SCL=0;delay();
SDA=1;delay()://拉高數(shù)據(jù)線,為等待應(yīng)答做準(zhǔn)備
}
3.7 SMBus通信協(xié)議幀
使用SMBus協(xié)議對設(shè)備信息進(jìn)行讀取時有統(tǒng)一的標(biāo)準(zhǔn)要求,圖5是SMBus設(shè)備間通信協(xié)議幀結(jié)構(gòu)圖。最先傳輸?shù)氖菃訔l件S,隨后發(fā)送第一幀數(shù)據(jù),由7位設(shè)備地址DevAdd、1位寫標(biāo)志W(wǎng)和1位應(yīng)答Ack構(gòu)成。第二幀由8位設(shè)備內(nèi)的寄存器地址RegAdd和1位應(yīng)答Ack構(gòu)成,如要讀取電池的溫度,RegAdd則為溫度寄存器。其中前兩幀都是主設(shè)備向總線上寫信息,告訴了總線要寫入的設(shè)備地址,以及要獲得設(shè)備中哪個寄存器的內(nèi)容。接下來要再次發(fā)送啟動信號S進(jìn)行一次重啟。第三幀數(shù)據(jù)由7位設(shè)備地址DevAdd、1位讀標(biāo)志位R、1位應(yīng)答Ack構(gòu)成;第四幀由8位數(shù)據(jù)Data1和1位應(yīng)答Ack構(gòu)成;第五幀也由8位數(shù)據(jù)Data2和1位應(yīng)答Ack構(gòu)成。其中第三幀數(shù)據(jù)告訴了總線要對哪個設(shè)備進(jìn)行讀取操作,第四幀和第五幀則由主機(jī)從總線上兩次讀取數(shù)據(jù),得到Data1和Data2,這兩個字節(jié)分別為讀取值的高8位和低8位。最后是一位停止信號P。
將協(xié)議中包含的數(shù)據(jù)幀按照圖5格式進(jìn)行打包,統(tǒng)一寫成函數(shù)以方便應(yīng)用。代碼如下:
unsigned int SMBus_ReadAdd(unsigned char addr)
{
unsigned char data;
SMBus_Start();//啟動協(xié)議
SMBus_WriteByte(DEV_ADDW);//設(shè)備地址
SMBus_CheckAck();//等待應(yīng)答
SMBus_WriteByte(addr);//Reg地址
SMBus_CheckAck();//等待應(yīng)答
SMBus_Start();//再次啟動
SMBus_WriteByte(DEV_ADDR);//設(shè)備地址
SMBus_CheckAck();//等待應(yīng)答
data = SMBus_ReadByte();//讀取低字節(jié)
SMBus_SendAck(0);//發(fā)送應(yīng)答
data+=SMBus_ReadByte()<<8;//讀取高字節(jié)
SMBus_SendAck(1);//發(fā)送應(yīng)答
SMBus_Stop();//停止讀取
return data;//返回數(shù)據(jù)
}
3.8 主程序設(shè)計
主程序中最先要通過SMBus總線向智能電池發(fā)送命令,對BQ3060芯片進(jìn)行初始化配置,然后調(diào)用SMBus_ReadAdd函數(shù)即可獲得電池相關(guān)信息,如電池電壓和相對電量Reg地址分別為0x09、0x0d,其他寄存器請參考芯片手冊。調(diào)用方法如下:
void main()
{
Init_Config();//初始化
Voltage =SMBus_ReadAdd(0x09)&0x7FFF;
delay_ms();//讀取后要延遲一段時間
PowerState=SMBus_ReadAdd(0x0d)&0x7F;
delay_ms();
UartSend();//從串口輸出
}
讀取字節(jié)時,SMBus_ReadAdd(0x09)&0x7FFF和SMBus_ReadAdd(0x0d)&0x7F因為電壓返回值范圍是0~20 000 mV,電量狀態(tài)范圍為0~100%,為防止數(shù)據(jù)出錯,要對有效位進(jìn)行選取,同時讀取數(shù)據(jù)后一定要進(jìn)行延時操作,否則讀數(shù)結(jié)果會出現(xiàn)錯誤。
4 設(shè)計結(jié)果與分析
IAR EW for MSP430是IAR公司為TI公司的MSP430系列處理器開發(fā)的一款集成開發(fā)環(huán)境,可對工程進(jìn)行有效管理、編譯、鏈接后生成目標(biāo)文件,并結(jié)合MSP專門的USB燒錄器進(jìn)行程序下載。
通過MSP430F149開發(fā)板自帶的RS232模塊與筆記本USB口相連,MSP430將監(jiān)測到的電池信息通過Uart0口發(fā)送到串口助手,最開始測得的所有數(shù)值都存在錯誤,通過對程序進(jìn)行分析,發(fā)現(xiàn)在使用SMBus進(jìn)行讀取數(shù)據(jù)時沒有設(shè)置一定的延時等待,加上延時函數(shù)后結(jié)果正常,但依然錯誤率很高。在查閱了BQ3060數(shù)據(jù)手冊后才發(fā)現(xiàn)電壓的有效值是0~20 000 mV,電量的有效值是0~100%,每次需要對讀到的值進(jìn)行有效位的提取,如SMBus_ReadAdd(0x09)&0x7FFF和SMBus_ReadAdd(0x0d)&0x7F語句處理后,輸出結(jié)果正確,如圖6。
用電壓表測電池兩端的電壓為15.9 V,與系統(tǒng)的15 943 mV一致,室內(nèi)空調(diào)顯示溫度為26 ℃,考慮到電池使用過程會發(fā)熱,因此溫度會比室溫高一些。通過檢測出來的數(shù)據(jù)可以看出,用SMBus協(xié)議可以很方便地對智能電池信息進(jìn)行監(jiān)測,同時不需要處理器親自去檢測電池的各種信息,節(jié)省了處理器的時鐘,可以使處理器更多的時間用在算法、控制等處理上。
5 小結(jié)
本文實現(xiàn)了一個使用SMBus協(xié)議對電池信息進(jìn)行實時監(jiān)測的系統(tǒng),系統(tǒng)準(zhǔn)確監(jiān)測到電池電壓、電量、溫度等重要信息。在實際應(yīng)用中,可以根據(jù)需要對電池的其他信息進(jìn)行監(jiān)測,相關(guān)寄存器地址可以參考TI公司數(shù)據(jù)手冊。雖然使用以BQ3060為管理芯片的智能電池作為實驗平臺,但是系統(tǒng)適合于對所有使用SMBus協(xié)議的智能電池進(jìn)行監(jiān)測,TI公司BQ系列電源管理芯片基本都支持SMBus協(xié)議,只需對設(shè)備地址、寄存器地址做相應(yīng)改變就可達(dá)到通用的目的。
參考文獻(xiàn)
[1] 路鐵生.系統(tǒng)管理總線(SMBus)與智能充電[J].電源世界,2011(8):36-39.
[2] 陳濤,萬亞坤.基于智能電池系統(tǒng)的SMBus總線研究及IP設(shè)計[J].中國集成電路.2008(11):48-51.
[3] 吳珍毅.基于SMBus的智能鋰動力電池總線系統(tǒng)的實現(xiàn)[J].北京聯(lián)合大學(xué)學(xué)報,2012,26(4):15.
[4] 郝建國.MSP430微控制器基礎(chǔ)和應(yīng)用[M].北京:電子工業(yè)出版社,2014.