摘要:SPI接口是單片機應用系統中常用的串行擴展接口之一,通過汽車EPB輔助控制器設計的具體項目的應用,重點介紹了基于SPI的CAN控制器與單片機通信的連接方法,及模擬SPI總線時序的軟件實現。
關鍵詞:SPI;MCP2515-I/SO;CAN總線;通信
中圖分類號:TP368.2 文獻標識碼:A文章編號:1009-3044(2009)26-7508-03
Application of Simulated SPI Based on CAN Controller MCP2515-I/SO
CHEN Xiong-wei
(Shenzhen Municipal Administration Bureau of Organization Affairs, Shenzhen 518035, China)
Abstract: SPI is one of useful expandable serial interface in the application systems of single-chip, with the application in the design of EPB assistant controller, introduces the connection method of communication between CAN controller and single-chip,and realizes the SPI bus simulated by software.
Key words: SPI; MCP2515-I/SO; CAN Bus; Communication
SPI(Serial Peripheral Interface,串行外圍設備接口)是一種高速、全雙工、同步的串行通信接口,廣泛應用于微處理器、微控器和外圍擴展芯片之間的串行連接。SPI接口占用芯片的四根線,節約芯片的I/O引腳,節省PCB的布局空間,具有簡單易用的特性,越來越多的芯片集成了這種通信接口。在具體項目汽車EPB輔助控制器[1]的設計中,應用CAN控制器MCP2515-I/SO的SPI接口,實現了模擬SPI的串口通信。 MCU通過SPI接口對MCP2515-I/SO的時鐘輸入引腳SCK,數據輸出引腳SO,數據輸入引腳SI及片選控制引腳四根線進行數據的控制與傳輸。
1 MCP2515-I/SO芯片介紹
Microchip公司推出的MCP2515-I/SO是一款獨立控制器局域網絡(Controller Area Network, CAN)協議控制器芯片,支持CAN2.0B技術規范并帶有符合工業標準的SPI串行接口,MCP2515-I/SO具備最高40MHz時鐘輸入速度以及一個10MHz高速SPI接口,還可根據前兩個數據字節和11位標識符對報文進行濾波[2]。
MCP2515-I/SO能夠發送和接收標準數據幀以及擴展數據幀,并具有接收過濾和信息管理的功能。MCP2515-I/SO內含三個14 字節的發送緩沖器,2個14字節的接收緩沖器,并且具有靈活的中斷能力、幀屏蔽和過濾、幀優先級設定等特性。MCU可以通過SPI接口來讀取MCP2515-I/SO接收緩沖器里的數據。MCP2515-I/SO對CAN總線的數據發送則沒有限制,只要用MCU通過SPI接口將待發送的數據寫入MCP2515-I/SO的發送緩沖器,然后再調用RTS(發送請求)命令即可將數據發送到CAN總線上。MCU通過使用標準SPI讀寫命令對MCP2515-I/SO寄存器進行讀寫操作。MCP2515-I/SO器件主要由三個部分組成:
1) CAN模塊,包括負責與CAN總線物理接口的CAN協議引擎、發送和接收緩沖器以及它們的驗收濾波寄存器、驗收屏蔽寄存器;
2) 用于配置該器件及其運行的控制邏輯和寄存器,負責實現各種工作模式的設定和操作控制。
3) SPI協議模塊,使用標準的SPI讀/寫指令以及專門的SPI命令來讀/寫所有的寄存器。
2 模擬SPI串口通信的應用
鐘對汽車電子駐車制動的EPB輔助控制器設計可以驅動汽車的EPB系統實現松開、閉合剎車皮的制動操作,系統硬件電路主要包括:MCU、CAN控制器、CAN接收器、按鍵控制、LED指示、PC通信、復位以及電源電路等。由于文章篇幅,僅介紹涉及SPI接口的電路與設計。
2.1 MCP2515-I/SO與MCU連接的硬件電路
系統采用美國ATMEL公司生產的低電壓,高性能CMOS單片機AT89C2051,完全兼容MCS-51指令,具有2K字節FLASH閃速存儲器,128字節內部RAM,6個中斷源,可直接驅動LED[3]。,MCU與CAN控制器MCP2515-IS/O的連接電路如圖1所示。
圖1電路中OFF/ON二個按鈕分別是EPB輔助控制器觸發OFF/ON指令信號的控制開關,也是EPB系統唯一的人機互動界面,指令信號通過汽車內部CAN總線驅動汽車EPB系統執行松開/閉合剎車皮的操作。
LED指示電路選用的紅黃綠三個不同顏色的LED燈對應ON、OFF、SET顯示EPB系統的狀態。MCU輸出高電平驅動LED亮。低電平LED滅。按下ON鍵,發送閉合剎車皮命令,ON燈每秒閃5次,OFF燈滅。按下OFF鍵,發送松開剎車皮命令,OFF燈每秒閃5次,ON燈滅。SET燈具有多種狀態亮燈,分別表示EPB通信故障、沒有故障、發送命令等意義。
2.2 SPI總線模式及軟件模擬
SPI總線模式的數據是以字節為單位進行傳輸的,每字節為位,每個命令或者數據塊都是字節的整數倍。每次傳輸開始于信號的下降沿,結束于其上升沿。傳輸過程中命令和數據由SCK和片選信號控制。
由于AT89C2051單片機沒有SPI接口,與CAN控制器MCP2515-I/SO進行通信時,需要使用軟件來模擬SPI的操作,包括串行時鐘SCK、片選信號、數據輸入SI及數據輸出SO。MCU與SPI接口相連,MCU輸出低電平,使能MCP2515-I/SO。MCU送來的外部數據和命令通過SI引腳傳送到MCP2515-I/SO器件中,且數據在SCK時鐘信號的上升沿傳送進去,在SCK的下降沿通過SO引腳傳送出給MCU。下面是進行一個字節的操作時序與程序。時序圖如圖2所示。
MCU通過SPI向CAN控制器寫入一個字節的子程序如下:
void _MCP2515-I/SO_writebyte(unsigned char SData)
{ // SPI 發送數據, 循環發送8個bit位, 高位在前, 低位在后
unsigned char i, temp_sdata;
CY = 0;
MCP2515-I/SO_SCK = 0;
temp_sdata = SData;
for(i=0; i<8; i++)
{temp_sdata <<= 1;
MCP2515-I/SO_SI = CY;
MCP2515-I/SO_SCK = 1;
MCP2515-I/SO_SCK = 0;
}}
MCU通過SPI從CAN控制器賣取一個字節的子程序如下
unsigned char _MCP2515-I/SO_readbyte(void)
{// SPI 讀取指定地址的數據, 循環接收8個bit位, 高位在前, 低位在后
unsigned char i,temp_rdata=0;
for(i=0; i<8; i++)
{temp_rdata <<= 1;
MCP2515-I/SO_SCK = 1;
if(MCP2515-I/SO_SO)
temp_rdata++;
MCP2515-I/SO_SCK = 0;
}return(temp_rdata);//返回接收到一個字節的數據
}
2.3 通信模塊的軟件設計
SPI接口向CAN控制器發送、讀取數據的通信模塊[4]是系統軟件設計的核心。EPB輔助控制器使用CAN協議進行數據傳輸,當向汽車CAN總線發送OFF/ON指令時,MCU通過SPI接口把OFF/ON指令發送到CAN控制器發送緩沖器,然后能過MCP2515-I/SO的發送命令,由CAN控制器發送到汽車CAN總線上。
SPI接口發送數據到MCP2515-I/SO時,將引腳置為低電平,隨后向MCP2515-I/SO依次發送寫指令、地址碼和至少一個字節的數據。發送一個字節數據的時序如圖3所示,void MCP2515-I/SO_write(unsigned char Addr, unsigned char SData) 是實現該功能的程序代碼。
void MCP2515-I/SO_write(unsigned char Addr, unsigned char SData)// Addr: 寫入地址SData : 寫入數據
{// SPI 向指定地址寫入一個數據, 循環發送8個bit位, 高位在前, 低位在后
MCP2515-I/SO_CS = 0;
_MCP2515-I/SO_writebyte(0x02);//MCP2515-I/SO 命令字0x02 是寫指令字節
_MCP2515-I/SO_writebyte(Addr);//調用單字節寫程序,寫入地址
_MCP2515-I/SO_writebyte(SData);//調用單字節寫程序,寫入數據
MCP2515-I/SO_CS = 1;
}
由于EPB控制器接在汽車CAN總線上,會接收到大量的數據,在所有數據中都包含了自身CAN節點的信息。需要調用寫指令,對MCP2515-I/SO進行設置。幀過濾模塊程的作用是把這些數據中包含的節點信息解析出來,并進行判斷,以確定節點的ID以及所反饋的信息。當CAN控制器從CAN總線上接收到信息時,MCP2515-I/SO內將會對MCU產生一個收到數據的中斷。MCU響應中斷后,將引腳置為低電平,隨后向MCP2515-I/SO依次發送讀指令和8位地址碼。在接收到讀指令和地址碼之后,MCP2515-I/SO會將指定地址寄存器中的數據通過SO引腳移出。讀取一個字節數據的時序如圖4所示,unsigned char MCP2515-I/SO_read(unsigned char Addr) 是實現該功能的程序代碼。
unsigned char MCP2515-I/SO_read(unsigned char Addr)// Addr 指定地址
{ // SPI 讀取指定地址的數據, 循環接收8個bit位, 高位在前, 低位在后
unsigned char temp_rdata;
MCP2515-I/SO_CS = 0;
_MCP2515-I/SO_writebyte(0x03); // MCP2515-I/SO 命令字0x03是讀指令字節_MCP2515-I/SO_writebyte(Addr); //調用單字節寫程序,寫入地址
temp_rdata = _MCP2515-I/SO_readbyte(); //調用單字節讀程序,讀取數據
MCP2515-I/SO_CS = 1;
return(temp_rdata);//返回數據
}
MCP2515-I/SO每一數據字節處理后,器件內部的地址指鐘將自動加一以指向下一個地址。當進行多字節的發送與讀取數據時,通過MCU向MCP2515-I/SO提供持續的時鐘脈沖,可以對下一個連續地址寄存器進行讀、寫操作。通過拉高引腳電平結束連續的讀、寫操作。
3 結束語
文章介紹了帶有SPI接口的CAN控制器芯片MCP2515-I/SO的特性,通過軟件模擬SPI總線接口,實現與MCU之間的數據傳輸,給出C語言編寫的SPI接口的讀寫程序。在實際的汽車BENZ S221的電子駐車制動試驗中,實現了與汽車ECU的通信及松開剎車片、閉合剎車片的判斷與操作。該方法同樣適用于其它的可拓展的SPI芯片、單片機、ARM、微型計算機等。
參考文獻:
[1] 崔玥.基于CAN總線的電子駐車制動系統[D].吉林大學碩士學位論文,2007:12-13.
[2] Microchip Technology lnc.MCP2515-I/SO Datasheets[Z],2005.
[3] 深圳市中源單片機發展有限公司.AT89C2051 Datasheets[Z],2007.
[4] 王亮,杜洪亮,魏衡華.基于多主型SPI接口的CAN總線中繼器設計[J].自動化與儀表,2009(3):20-21.