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