LTC6803的SPI通信
采集系統(tǒng)的單體電池的電壓,是通過 LTC6803采集的。LTC6803與 MC9S12C32之間是 通 過 SPI進行通 信 的。為 了 實 現(xiàn) SPI通 信,首 先 要 弄 清 楚LTC6803的讀寫時序。LTC6803的讀、寫時序如圖3和圖4所示。

由讀寫時序可見,每個 字 節(jié)發(fā) 送 時 都是高 位 先發(fā)送。寫時 序 時,SDI引腳的邏輯狀態(tài)在 SCKI的上升沿被所 存。讀 數(shù) 據(jù) 時,在 SCKI的 上 升 沿 被 所存。讀時序中,在SCKl的上升沿 SDO 引腳的邏輯狀態(tài) 是 有 效 的,另外需要注意的是,LTC6803的 是時鐘相位和極性要求:LTC6803的 SPI的接口被配置為工作在 CPHA=I和 CPOL=I的模式下。
本文中兩片LTC6803串聯(lián)方式連接,故在由單片 機 往 LTC6803 發(fā) 送 命 令 時,是 先 發(fā) 送 高 位LTC6803的 命 令 數(shù) 據(jù),再 發(fā) 送 低 位 LTC6803的 命令數(shù) 據(jù);LTC6803往 單 片 機 時,單片機先接受的是低位 LTC6803的 數(shù) 據(jù),而 后 是 高 位 6803 的 數(shù) 據(jù)。根據(jù) LTC6803 的 SPI的 通 訊 方 式,本 文 以 兩 片LTC6803 菊花鏈式連接為例,可 以 寫 出MC9S12C32的SPl初始 化、收發(fā) 程 序;向 LTC6803寫配置或 者 命 令;從 LTC6803 中讀取寄存器值的程序。
(1)MC9S12C32的SPI初始化、收發(fā)程序
MC9S12C32的SPI模 塊 的 SS可 設 為 普 通IO口 功 能。 本文中采用其余通用 IO 口,實 現(xiàn)LTC6803的 CSBI引腳的拉高和拉低。
voidSPI_Init(void)
{CS_dir=1; ∥通用片選引腳為輸出引腳
SPICR1=0x5c; ∥主機模式;高位起始傳送
SPICR2=0x00; ∥主模式故障模式使能禁止
SPIBR=0x02; ∥總線8M,將SPI時鐘分頻
至1MHz
}
voidSPI_Send(unsignedcharsenddata)
{unsignedchartemp_spi;
while(?。樱校桑樱遥撸樱校裕牛疲?; ∥等 待 數(shù) 據(jù) 寄 存
器空
SPIDR=senddata;∥將數(shù)據(jù)寫入數(shù)據(jù)寄存器
while(?。樱校桑樱遥撸樱校桑疲弧蔚却龜?shù)據(jù)發(fā)送完成
temp_spi=SPIDR; ∥清空標志
}
unsignedcharSPI_Receive(void)
{unsignedcharreceive_data;
while(!SPISR_SPIF); ∥等待接收完成
receive_data=SPIDR; ∥讀取數(shù)據(jù)寄存器
return(receive_data);
}
(2)向 LTC6803寫命令
向LTC6803中寫數(shù)據(jù),需先發(fā)送相應的寄存器命令 和 PEC 碼,經(jīng) 校驗 無誤 后,再寫 入數(shù)據(jù)。6803采用菊花鏈式連接時,先寫入的數(shù)據(jù)為頂端6803的數(shù)據(jù),然后是中間的6803的數(shù)據(jù),最后是底端6803的數(shù)據(jù)。以6803初始化程序為例,編寫程序如下:
voidLTC6803_Init(void)
{unsignedchari;
unsignedchartop_cfg[7]={};
unsignedcharbottom_cfg[7]={};
CS=O; ∥拉低片選,啟動寫入數(shù)據(jù)
SPI_Send(0x01);SPI_Send(0x01); ∥ 發(fā) 送
寫入寄存器命令和 PEC碼
for(i=0;i<7;i++)SPI_Send(top_cfg[i]);
for(i=0;i<7;i+ +)SPl_Send(bottom_cfg
[i]);
CS=1; ∥拉高片選,鎖存所寫數(shù)據(jù)
}
(3)從 LTC6803讀取數(shù)據(jù)
從LTC6803中讀取數(shù)據(jù),也需先發(fā)送相應的讀取寄存器命令和 PEC 碼,經(jīng) 校驗 無 誤 后,再 讀 取 數(shù)據(jù)。6803采用菊花鏈式連接時,先 讀 取 的 是 底 端6803的數(shù)據(jù),然后是中間6803的數(shù)據(jù),最后是頂端6803的數(shù)據(jù)。LTC6803在 每 讀 ?。弊?節(jié) 的 數(shù) 據(jù) 之前,需由發(fā)送8位 空 字 節(jié) 啟 動 SPI傳 送 功 能。以 讀取6803的配置寄存器值為例,編寫程序如下:
voidLTC6803_Read(void)
{unsignedi;
CS=0;
SPI_Send(0x02);SPl_Send(0xce);∥發(fā)送讀取
寄存器命令和 PEC碼
for(i=0;i<7;i++)
{while(?。樱校桑撸樱校裕牛疲?;SPIDR=0x00; ∥寫
入空字節(jié),啟動SPI傳送
bottom_cfg[i]=SPI_Receive();}
……
CS=l;
}
MC9S12C32主要調(diào)用以上幾 個基本的函數(shù),實現(xiàn)對 LTC6803的一系列 的 讀寫控制。采 集 系 統(tǒng)的整體流程圖如圖5所示。首先,對系統(tǒng)時鐘、SPI、CAN、定時器等初始化;循環(huán)從讀取24只單體電池電壓開始,到 最 終 通 過 CAN 總線將單體電壓數(shù)據(jù)上傳至上級控制 器,時序 由 定 時 器控 制。單體 電 池電壓測量程序流程圖如圖5所示。

圖6是一組電池組通過下位機 LTC6803采 集的單體電壓值與用萬用表測量值的比較,可以 看 出下位機的單體電池電壓采集精度達到要求。
為了節(jié)約電源,本采集 系 統(tǒng)還 設 計 了采集 系 統(tǒng)休眠的功能。當整車 在長時 間靜置時,由上級控 制器通過 CAN 廣播方式,做出采集系統(tǒng)休眠的命令:通過SPI可先將LTC6803配置為低電流方式,然后禁止 MC9S12C32的SPI功能;甚至可禁止 CAN 發(fā)送功能,只使能 CAN 接收中斷功能。

本文 采 用 MC9S12C32 和 LTC6803 設 計 鋰 離子單體電池采集 系 統(tǒng)。該系 統(tǒng)能采集24只串 聯(lián)動力電池的電 壓,并 通 過 高 速 的 CAN 總 線 與 上 級 控制系統(tǒng)通信。經(jīng)過實 際測試,該 系統(tǒng)的 電壓采集精度在+3mV。該系統(tǒng)工作穩(wěn)定可靠,與其他的控制系統(tǒng)集成后,已經(jīng)試驗裝車,實現(xiàn)預計功能。
電子發(fā)燒友App




























評論