《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于SMBus協(xié)議的電池信息監(jiān)測系統(tǒng)
基于SMBus協(xié)議的電池信息監(jiān)測系統(tǒng)
2016年電子技術(shù)應(yīng)用第4期
何國鋒,劉宇紅
貴州大學(xué) 大數(shù)據(jù)與信息工程學(xué)院,貴州 貴陽550025
摘要: 目前大部分智能電池都對外提供了SMBus協(xié)議接口。為了對智能電池的信息進行監(jiān)測,首先對SMBus協(xié)議的時序進行分析,然后通過MSP430處理器的硬件接口模擬協(xié)議,對以BQ3060電池信息管理芯片為核心的電池組進行命令寫入與數(shù)據(jù)讀取,實現(xiàn)了智能電池信息監(jiān)測系統(tǒng),可以對電池的電量、溫度、電壓、電流等多種信息進行實時監(jiān)測。
關(guān)鍵詞: SMBus 電池信息監(jiān)測 BQ3060
中圖分類號: TP277
文獻標(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.
Battery information monitoring system based on SMBus protocol
He Guofeng,Liu Yuhong
College of Big Data and Information Engineering,Guizhou University,Guiyang 550025,China
Abstract: Now most of smart batteries provide SMBus protocol interface for user.In order to monitor the information of the battery,the paper analyzed the timing of SMBus protocol at first,and then simulated the protocol through MSP430 processor′s hardware interface,to read data from or write commands to the battery pack based on power management chip BQ3060. At last a smart battery information monitoring system was realized,which could monitor batteries′ capicity,temperature,voltage,current and other information in real time.
Key words : SMBus;battery information monitoring;BQ3060

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ù)可以在總線空閑時間進行傳輸。

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)楦唠娖?,SMBus傳輸停止[3],停止條件發(fā)生一段時間后,總線再次被視為空閑狀態(tài)。啟動條件和停止條件總是由主設(shè)備產(chǎn)生,圖1為模擬SMBus協(xié)議啟動和停止的時序圖,S表示啟動條件,P表示停止條件。

qrs2-t1.gif

1.2 數(shù)據(jù)的有效性

    SDA線上的數(shù)據(jù)必須在時鐘的高電平周期保持穩(wěn)定,數(shù)據(jù)線上的電平只有在SCL線為低電平時才可以改變[3]。圖2為SMBus協(xié)議數(shù)據(jù)有效性的圖示。

qrs2-t2.gif

1.3 SMBus數(shù)據(jù)傳輸

    圖3是SMBus數(shù)據(jù)傳輸協(xié)議時序圖,當(dāng)SMBus啟動信號產(chǎn)生后,數(shù)據(jù)以串行方式進行傳輸,每次傳輸以8 bit(1 B)為一組,每次可發(fā)送的字節(jié)數(shù)不受限制,但是每個字節(jié)后必須跟一個響應(yīng)位。數(shù)據(jù)以高字節(jié)在前、低字節(jié)在后的順序傳輸,第9位為應(yīng)答位[2]。

qrs2-t3.gif

    總線上的所有器件都有一個唯一地址,并且都可以工作在接收或發(fā)送狀態(tài),構(gòu)成了4種工作模式,即主發(fā)送、主接收、從發(fā)收、從接收[3]。SMBus總線還具有仲裁功能,保證同一時刻只有一個器件在控制總線。

2 硬件實驗環(huán)境

2.1 主機系統(tǒng)實現(xiàn)

    主機系統(tǒng)采用了以MSP430F149處理器為核心的開發(fā)板,MSP430是德州儀器公司推出的一款16位、具有超低功耗芯片及精簡指令集(RISC)的混合信號處理器(Mixed Signal Processor)[4],被廣泛用于智能便攜電子設(shè)備中。開發(fā)板上擁有較豐富的外設(shè)資源,同時集成了RS232模塊,可以將測得的數(shù)據(jù)信息等通過串口實時發(fā)送到上位機中,查看驗證結(jié)果。

2.2 智能電池

    目前大部分智能電池對外接口都遵循SMBus協(xié)議標(biāo)準(zhǔn),本設(shè)計采用的智能電池是一塊由4節(jié)鋰電池組成的智能電池組,采用德州儀器的BQ3060電源管理芯片進行電池管理。BQ3060芯片可以對最多4節(jié)電池構(gòu)成的電池組進行管理,將普通電池組變成智能電池,并通過SMBus總線接口與處理器通信。

    將MSP430處理器與智能電池以及其他外圍器件同時掛載到接有上拉電阻的SMBus總線上,如圖4所示。MSP430處理器為主機,總線上的其他設(shè)備充當(dāng)從機。當(dāng)啟動傳輸協(xié)議時,MSP430可以通過SMBus總線獲得4節(jié)鋰電池的相關(guān)信息。

qrs2-t4.gif

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ù)牡?個時鐘,主機需要檢測總線上SDA的電平是否被拉低,如果規(guī)定的時鐘周期內(nèi)未檢測到低電平,視為無應(yīng)答,說明傳輸失??;如果檢測到低電平,說明從機成功接收到數(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)主機接收完從機發(fā)來的8 bit數(shù)據(jù)后,需要在第9個時鐘周期內(nèi)做出應(yīng)答,并且告訴從機是否繼續(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è)備信息進行讀取時有統(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進行一次重啟。第三幀數(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è)備進行讀取操作,第四幀和第五幀則由主機從總線上兩次讀取數(shù)據(jù),得到Data1和Data2,這兩個字節(jié)分別為讀取值的高8位和低8位。最后是一位停止信號P。

qrs2-t5.gif

    將協(xié)議中包含的數(shù)據(jù)幀按照圖5格式進行打包,統(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芯片進行初始化配置,然后調(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ù)出錯,要對有效位進行選取,同時讀取數(shù)據(jù)后一定要進行延時操作,否則讀數(shù)結(jié)果會出現(xiàn)錯誤。

4 設(shè)計結(jié)果與分析

    IAR EW for MSP430是IAR公司為TI公司的MSP430系列處理器開發(fā)的一款集成開發(fā)環(huán)境,可對工程進行有效管理、編譯、鏈接后生成目標(biāo)文件,并結(jié)合MSP專門的USB燒錄器進行程序下載。

    通過MSP430F149開發(fā)板自帶的RS232模塊與筆記本USB口相連,MSP430將監(jiān)測到的電池信息通過Uart0口發(fā)送到串口助手,最開始測得的所有數(shù)值都存在錯誤,通過對程序進行分析,發(fā)現(xiàn)在使用SMBus進行讀取數(shù)據(jù)時沒有設(shè)置一定的延時等待,加上延時函數(shù)后結(jié)果正常,但依然錯誤率很高。在查閱了BQ3060數(shù)據(jù)手冊后才發(fā)現(xiàn)電壓的有效值是0~20 000 mV,電量的有效值是0~100%,每次需要對讀到的值進行有效位的提取,如SMBus_ReadAdd(0x09)&0x7FFF和SMBus_ReadAdd(0x0d)&0x7F語句處理后,輸出結(jié)果正確,如圖6。

qrs2-t6.gif

    用電壓表測電池兩端的電壓為15.9 V,與系統(tǒng)的15 943 mV一致,室內(nèi)空調(diào)顯示溫度為26 ℃,考慮到電池使用過程會發(fā)熱,因此溫度會比室溫高一些。通過檢測出來的數(shù)據(jù)可以看出,用SMBus協(xié)議可以很方便地對智能電池信息進行監(jiān)測,同時不需要處理器親自去檢測電池的各種信息,節(jié)省了處理器的時鐘,可以使處理器更多的時間用在算法、控制等處理上。

5 小結(jié)

    本文實現(xiàn)了一個使用SMBus協(xié)議對電池信息進行實時監(jiān)測的系統(tǒng),系統(tǒng)準(zhǔn)確監(jiān)測到電池電壓、電量、溫度等重要信息。在實際應(yīng)用中,可以根據(jù)需要對電池的其他信息進行監(jiān)測,相關(guān)寄存器地址可以參考TI公司數(shù)據(jù)手冊。雖然使用以BQ3060為管理芯片的智能電池作為實驗平臺,但是系統(tǒng)適合于對所有使用SMBus協(xié)議的智能電池進行監(jiān)測,TI公司BQ系列電源管理芯片基本都支持SMBus協(xié)議,只需對設(shè)備地址、寄存器地址做相應(yīng)改變就可達到通用的目的。

參考文獻

[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.

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