CAN總線系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
李勝明* 初光宇 呂實(shí)誠
摘 要 本文簡要介紹了CAN總線技術(shù)及其性能,在此基礎(chǔ)上介紹了基于89C51的CAN總線網(wǎng)絡(luò)的設(shè)計(jì)和實(shí)現(xiàn)方法。
關(guān)鍵詞 CAN總線 89C51 SJA1000 TJA1050
Design and realization of CAN Bus System
Li Shengming Chu Guangyu Lv Shicheng
Abstract The paper briefly introducs the technology of CAN bus system, and then the paper designed a CAN bus system based on 89C51.
KeyWord CAN Bus 89C51 SJA1000 TJA1050
隨著現(xiàn)場總線概念的出現(xiàn)到現(xiàn)在的近20年時間里,已經(jīng)出現(xiàn)了好幾種現(xiàn)場總線技術(shù)并走向成熟。其中CAN總線已被公認(rèn)為幾種最有前途的現(xiàn)場總線之一。CAN是一種由帶有CAN控制器組成的高性能串行數(shù)據(jù)局域通信網(wǎng)絡(luò),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。最初,CAN被設(shè)計(jì)作為汽車環(huán)境中的微控制器通信,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網(wǎng)絡(luò)。由于其具有通信速度快、可靠性高和性能價格比好等突出優(yōu)點(diǎn),它正越拉越廣泛地應(yīng)用于汽車、機(jī)械工業(yè)、紡織機(jī)械、農(nóng)業(yè)用機(jī)械、機(jī)器人、數(shù)控機(jī)床、醫(yī)療器械、家用電器及傳感器等領(lǐng)域。圖1所示是典型的CAN總線節(jié)點(diǎn)的系統(tǒng)框圖。
圖1 CAN總線節(jié)點(diǎn)圖
1、 系統(tǒng)硬件設(shè)計(jì)
SJA1000獨(dú)立CAN控制器是PHILIPS公司PCA82C200CAN控制器的替代產(chǎn)品,它是在完全兼容PCA82C200的基礎(chǔ)上,增加了一種新的工作模式PeliCAN,SJA1000完全支持具有很多新特性的CAN2.0B協(xié)議。SJA1000的工作模式通過其內(nèi)部的時鐘分頻寄存器中的CAN模式為來選擇。SJA1000可以支持多種為處理器的時序特性,如Intel模式或Motorla模式,SJA1000與微處理器的接口非常簡單,微處理器以訪問外部存儲器的方式來訪問SJA1000。
TJA1050是控制器局域網(wǎng)CAN協(xié)議控制器和物理總線之間的接口,TJA1050可以為總線提供不同的發(fā)送性能,為CAN控制器提供不同的接收性能。TJA1050主要有以下特征:完全符合ISO 11898標(biāo)準(zhǔn),最高速到達(dá)1Mb/S,輸入級3.3V以及5V器件兼容,至少可以連接110個節(jié)點(diǎn)。本設(shè)計(jì)的微處理器為89C51負(fù)責(zé)初始化SJA1000及通過控制SJA1000實(shí)現(xiàn)數(shù)據(jù)的接收和發(fā)送等通信任務(wù),系統(tǒng)電路原理圖如圖2所示
圖2 CAN電路原理圖
CAN控制器SJA1000的數(shù)據(jù)線AD0~AD7連接到51單片機(jī)的P0口, 連接到基址為0XFA00的外部存儲器片選信號,當(dāng)訪問地址0XFA00~0XFA31時,CPU可對SJA1000執(zhí)行相應(yīng)的讀寫操作。SJA1000的 、 、 分別與51對應(yīng)的引腳相連, 接51的 使51可以通過中斷方式訪問SJA1000。
{{分頁}}
2、系統(tǒng)軟件設(shè)計(jì)
本設(shè)計(jì)的系統(tǒng)由4個節(jié)點(diǎn)組成,一個節(jié)點(diǎn)由上位機(jī)通過并口轉(zhuǎn)CAN總線的數(shù)據(jù)收發(fā)器構(gòu)成,另外3個節(jié)點(diǎn)有上圖所示的單片機(jī)CAN總線收發(fā)系統(tǒng)構(gòu)成。單片機(jī)系統(tǒng)每秒發(fā)送一幀(8個字節(jié))數(shù)據(jù)。連接上位機(jī)的CAN總線收發(fā)器有相應(yīng)的上位機(jī)測試軟件支持,本文主要介紹單片機(jī)CAN總線收發(fā)器的程序設(shè)計(jì)。圖3是下位機(jī)軟件的流程圖。
圖3下位機(jī)主程序流程圖
系統(tǒng)設(shè)計(jì)的部分代碼如下:
main()
{
Sja_1000_Init(); //初始化SJA1000
Init_Cpu(); //初始化CPU
Init_T0(); //初始化定時器
flag_init=0x00;
while(1)
{
if(rcv_flag) //rcv_flag為接受標(biāo)志位,有接收則單片機(jī)進(jìn)行處理
{
rcv_flag=0;
BCAN_DATA_RECEIVE(rcv_data);
BCAN_CMD_PRG(0X04);
disp_rec();
}
if(flag_sec) //定時中斷標(biāo)志為,定時時間到則發(fā)送數(shù)據(jù)幀
{
flag_sec=0;
send_data[0]=0xaa;
send_data[1]=0x08;
send_data[2]=DA1;
send_data[3]=DA2;
send_data[4]=DA3;
send_data[5]=DA4;
send_data[6]=DA5;
send_data[7]=DA6;
send_data[8]=DA7;
send_data[9]=DA8;
BCAN_DATA_WRITE(send_data);
BCAN_CMD_PRG(0X01);
}
if(err_flag)
{
err_flag=0;
disp_err();
Sja_1000_Init();
}
display(a); //循環(huán)顯示接受數(shù)據(jù)
}
}
SJA1000的初始化過程包括申請進(jìn)入復(fù)位狀態(tài),設(shè)置總線波特率,設(shè)置輸出方式,開放錯誤中斷、接受和發(fā)送中斷。在進(jìn)行數(shù)據(jù)發(fā)送時數(shù)據(jù)包前兩個字節(jié)0Xaa、0X08為描述符,包括11位長的ID(標(biāo)志符)1位RTR4位描述數(shù)據(jù)長度的DLC共16 位。BCAN_DATA_RECEIVE(rcv_data),為89C51對SJA1000的讀數(shù)據(jù)函數(shù)其具體函數(shù)定義:
bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr&0x01)==0) //判斷報文是否有效
{
return 1;
}
SJA_BCANAdr = REG_RxBuffer2; //訪問地址指向接收緩沖區(qū)2
if((*SJA_BCANAdr&0x10)==0) //如果是數(shù)據(jù)幀
{
TempCount=(*SJA_BCANAdr&0x0f)+2; //計(jì)算報文中數(shù)據(jù)的個數(shù)
}
else
{
TempCount=2;
}
SJA_BCANAdr = REG_RxBuffer1; //訪問地址指向接收緩沖區(qū)1
memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//讀取接收緩沖區(qū)的報文
return 0;
}
此函數(shù)僅限于CAN控制器接受數(shù)據(jù),返回值如果為0表示接受成功,如果為1表示接受失敗。
BCAN_DATA_WRITE(send_data)函數(shù)是89C51對SJA1000的寫數(shù)據(jù)函數(shù)其具體定義如下:
bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr&0x08) == 0) //判斷上次發(fā)送是否完成
{
return 1;
}
if((*SJA_BCANAdr&0x04)==0) //判斷發(fā)送緩沖區(qū)是否鎖定
{
return 1;
}
SJA_BCANAdr = REG_TxBuffer1; //訪問地址指向發(fā)送緩沖區(qū)1
if((SendDataBuf[1]&0x10)==0) //判斷RTR,從而得出是數(shù)據(jù)幀還是遠(yuǎn)程幀
{
TempCount =(SendDataBuf[1]&0x0f)+2; //輸入數(shù)據(jù)幀
}
else
{
TempCount =2; //遠(yuǎn)程幀
}
memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
return 0;
}
{{分頁}}
此函數(shù)將待發(fā)送的特定幀各式的數(shù)據(jù),送入SJA1000發(fā)送緩存區(qū)中,然后啟動,函數(shù)返回0表示將數(shù)據(jù)成功的送至發(fā)送緩沖區(qū),返回1表示上一次的數(shù)據(jù)正在發(fā)送。
系統(tǒng)組網(wǎng)相對容易只需把各個節(jié)點(diǎn)掛在同一條雙絞線上即可,啟動上位機(jī)的CAN收發(fā)器,用來監(jiān)視總線數(shù)據(jù)狀態(tài)。每當(dāng)啟動一個下位機(jī)CAN收發(fā)器,上位機(jī)的測試軟件就可以每隔一秒鐘收到由同一CAN收發(fā)器發(fā)送的數(shù)據(jù)幀。實(shí)驗(yàn)結(jié)果顯示當(dāng)3臺下位機(jī)CAN總線同時發(fā)數(shù)時數(shù)據(jù)接收端沒有數(shù)據(jù)丟失和總線沖突現(xiàn)象。
3結(jié)束語
現(xiàn)場總線有著巨大的發(fā)展?jié)摿Γ鼘⒔o自動控制領(lǐng)域的變革帶來深遠(yuǎn)的影響。我們設(shè)計(jì)的CAN總線收發(fā)器具有通用性,在本系統(tǒng)設(shè)計(jì)的基礎(chǔ)上只需要相應(yīng)的修改數(shù)據(jù)傳輸協(xié)議即可應(yīng)用于各個CAN總線的數(shù)傳系統(tǒng)。
參考文獻(xiàn)
1. 陳立元主編. Visual Basic實(shí)現(xiàn)串并行通信技術(shù). 華大學(xué)出版社,2001
2. 張學(xué)忠,王福成主編. Visual Basic控件應(yīng)用編程實(shí)例教程. 北京希望電子出版社,2002
3. 馬希榮主編. Visual Basic 6.0 程序設(shè)計(jì). 機(jī)械工業(yè)出版社,2004
4. 彭禹皓. 基于單片機(jī)和CAN控制器的嵌入式系統(tǒng). 微計(jì)算機(jī)信息,2007,4-2:33-35
*李勝明 哈爾濱汽輪機(jī)廠有限責(zé)任公司 工程師 150040
**初光宇 哈爾濱理工大學(xué)測控技術(shù)與通信工程學(xué)院 研究生 150040
51單片機(jī)相關(guān)文章:51單片機(jī)教程
評論