LTC6803的SPI通信
采集系統(tǒng)的單體電池的電壓,是通過 LTC6803采集的。LTC6803與 MC9S12C32之間是 通 過 SPI進(jìn)行通 信 的。為 了 實(shí) 現(xiàn) SPI通 信,首 先 要 弄 清 楚LTC6803的讀寫時(shí)序。LTC6803的讀、寫時(shí)序如圖3和圖4所示。
由讀寫時(shí)序可見,每個(gè) 字 節(jié)發(fā) 送 時(shí) 都是高 位 先發(fā)送。寫時(shí) 序 時(shí),SDI引腳的邏輯狀態(tài)在 SCKI的上升沿被所 存。讀 數(shù) 據(jù) 時(shí),在 SCKI的 上 升 沿 被 所存。讀時(shí)序中,在SCKl的上升沿 SDO 引腳的邏輯狀態(tài) 是 有 效 的,另外需要注意的是,LTC6803的 是時(shí)鐘相位和極性要求:LTC6803的 SPI的接口被配置為工作在 CPHA=I和 CPOL=I的模式下。
本文中兩片LTC6803串聯(lián)方式連接,故在由單片 機(jī) 往 LTC6803 發(fā) 送 命 令 時(shí),是 先 發(fā) 送 高 位LTC6803的 命 令 數(shù) 據(jù),再 發(fā) 送 低 位 LTC6803的 命令數(shù) 據(jù);LTC6803往 單 片 機(jī) 時(shí),單片機(jī)先接受的是低位 LTC6803的 數(shù) 據(jù),而 后 是 高 位 6803 的 數(shù) 據(jù)。根據(jù) LTC6803 的 SPI的 通 訊 方 式,本 文 以 兩 片LTC6803 菊花鏈?zhǔn)竭B接為例,可 以 寫 出MC9S12C32的SPl初始 化、收發(fā) 程 序;向 LTC6803寫配置或 者 命 令;從 LTC6803 中讀取寄存器值的程序。
(1)MC9S12C32的SPI初始化、收發(fā)程序
MC9S12C32的SPI模 塊 的 SS可 設(shè) 為 普 通IO口 功 能。 本文中采用其余通用 IO 口,實(shí) 現(xiàn)LTC6803的 CSBI引腳的拉高和拉低。
voidSPI_Init(void)
{CS_dir=1; ∥通用片選引腳為輸出引腳
SPICR1=0x5c; ∥主機(jī)模式;高位起始傳送
SPICR2=0x00; ∥主模式故障模式使能禁止
SPIBR=0x02; ∥總線8M,將SPI時(shí)鐘分頻
至1MHz
}
voidSPI_Send(unsignedcharsenddata)
{unsignedchartemp_spi;
while(?。樱校桑樱遥撸樱校裕牛疲?; ∥等 待 數(shù) 據(jù) 寄 存
器空
SPIDR=senddata;∥將數(shù)據(jù)寫入數(shù)據(jù)寄存器
while(?。樱校桑樱遥撸樱校桑疲?;∥等待數(shù)據(jù)發(fā)送完成
temp_spi=SPIDR; ∥清空標(biāo)志
}
unsignedcharSPI_Receive(void)
{unsignedcharreceive_data;
while(!SPISR_SPIF); ∥等待接收完成
receive_data=SPIDR; ∥讀取數(shù)據(jù)寄存器
return(receive_data);
}
(2)向 LTC6803寫命令
向LTC6803中寫數(shù)據(jù),需先發(fā)送相應(yīng)的寄存器命令 和 PEC 碼,經(jīng) 校驗(yàn) 無誤 后,再寫 入數(shù)據(jù)。6803采用菊花鏈?zhǔn)竭B接時(shí),先寫入的數(shù)據(jù)為頂端6803的數(shù)據(jù),然后是中間的6803的數(shù)據(jù),最后是底端6803的數(shù)據(jù)。以6803初始化程序?yàn)槔帉懗绦蛉缦拢?/p>
voidLTC6803_Init(void)
{unsignedchari;
unsignedchartop_cfg[7]={};
unsignedcharbottom_cfg[7]={};
CS=O; ∥拉低片選,啟動(dòng)寫入數(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ā)送相應(yīng)的讀取寄存器命令和 PEC 碼,經(jīng) 校驗(yàn) 無 誤 后,再 讀 取 數(shù)據(jù)。6803采用菊花鏈?zhǔn)竭B接時(shí),先 讀 取 的 是 底 端6803的數(shù)據(jù),然后是中間6803的數(shù)據(jù),最后是頂端6803的數(shù)據(jù)。LTC6803在 每 讀 ?。弊?節(jié) 的 數(shù) 據(jù) 之前,需由發(fā)送8位 空 字 節(jié) 啟 動(dòng) SPI傳 送 功 能。以 讀?。叮福埃车呐渲眉拇嫫髦禐槔帉懗绦蛉缦拢?/p>
voidLTC6803_Read(void)
{unsignedi;
CS=0;
SPI_Send(0x02);SPl_Send(0xce);∥發(fā)送讀取
寄存器命令和 PEC碼
for(i=0;i<7;i++)
{while(?。樱校桑撸樱校裕牛疲唬樱校桑模遥剑埃埃埃弧 螌?/p>
入空字節(jié),啟動(dòng)SPI傳送
bottom_cfg[i]=SPI_Receive();}
……
CS=l;
}
MC9S12C32主要調(diào)用以上幾 個(gè)基本的函數(shù),實(shí)現(xiàn)對 LTC6803的一系列 的 讀寫控制。采 集 系 統(tǒng)的整體流程圖如圖5所示。首先,對系統(tǒng)時(shí)鐘、SPI、CAN、定時(shí)器等初始化;循環(huán)從讀?。玻粗粏误w電池電壓開始,到 最 終 通 過 CAN 總線將單體電壓數(shù)據(jù)上傳至上級控制 器,時(shí)序 由 定 時(shí) 器控 制。單體 電 池電壓測量程序流程圖如圖5所示。
圖6是一組電池組通過下位機(jī) LTC6803采 集的單體電壓值與用萬用表測量值的比較,可以 看 出下位機(jī)的單體電池電壓采集精度達(dá)到要求。
為了節(jié)約電源,本采集 系 統(tǒng)還 設(shè) 計(jì) 了采集 系 統(tǒng)休眠的功能。當(dāng)整車 在長時(shí) 間靜置時(shí),由上級控 制器通過 CAN 廣播方式,做出采集系統(tǒng)休眠的命令:通過SPI可先將LTC6803配置為低電流方式,然后禁止 MC9S12C32的SPI功能;甚至可禁止 CAN 發(fā)送功能,只使能 CAN 接收中斷功能。
本文 采 用 MC9S12C32 和 LTC6803 設(shè) 計(jì) 鋰 離子單體電池采集 系 統(tǒng)。該系 統(tǒng)能采集24只串 聯(lián)動(dòng)力電池的電 壓,并 通 過 高 速 的 CAN 總 線 與 上 級 控制系統(tǒng)通信。經(jīng)過實(shí) 際測試,該 系統(tǒng)的 電壓采集精度在+3mV。該系統(tǒng)工作穩(wěn)定可靠,與其他的控制系統(tǒng)集成后,已經(jīng)試驗(yàn)裝車,實(shí)現(xiàn)預(yù)計(jì)功能。
評論