CAN總線系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
李勝明* 初光宇 呂實(shí)誠(chéng)
摘 要 本文簡(jiǎn)要介紹了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)場(chǎng)總線概念的出現(xiàn)到現(xiàn)在的近20年時(shí)間里,已經(jīng)出現(xiàn)了好幾種現(xiàn)場(chǎng)總線技術(shù)并走向成熟。其中CAN總線已被公認(rèn)為幾種最有前途的現(xiàn)場(chǎng)總線之一。CAN是一種由帶有CAN控制器組成的高性能串行數(shù)據(jù)局域通信網(wǎng)絡(luò),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。最初,CAN被設(shè)計(jì)作為汽車環(huán)境中的微控制器通信,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網(wǎng)絡(luò)。由于其具有通信速度快、可靠性高和性能價(jià)格比好等突出優(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的工作模式通過(guò)其內(nèi)部的時(shí)鐘分頻寄存器中的CAN模式為來(lái)選擇。SJA1000可以支持多種為處理器的時(shí)序特性,如Intel模式或Motorla模式,SJA1000與微處理器的接口非常簡(jiǎn)單,微處理器以訪問(wèn)外部存儲(chǔ)器的方式來(lái)訪問(wèn)SJA1000。
TJA1050是控制器局域網(wǎng)CAN協(xié)議控制器和物理總線之間的接口,TJA1050可以為總線提供不同的發(fā)送性能,為CAN控制器提供不同的接收性能。TJA1050主要有以下特征:完全符合ISO 11898標(biāo)準(zhǔn),最高速到達(dá)1Mb/S,輸入級(jí)3.3V以及5V器件兼容,至少可以連接110個(gè)節(jié)點(diǎn)。本設(shè)計(jì)的微處理器為89C51負(fù)責(zé)初始化SJA1000及通過(guò)控制SJA1000實(shí)現(xiàn)數(shù)據(jù)的接收和發(fā)送等通信任務(wù),系統(tǒng)電路原理圖如圖2所示
圖2 CAN電路原理圖
CAN控制器SJA1000的數(shù)據(jù)線AD0~AD7連接到51單片機(jī)的P0口, 連接到基址為0XFA00的外部存儲(chǔ)器片選信號(hào),當(dāng)訪問(wèn)地址0XFA00~0XFA31時(shí),CPU可對(duì)SJA1000執(zhí)行相應(yīng)的讀寫操作。SJA1000的 、 、 分別與51對(duì)應(yīng)的引腳相連, 接51的 使51可以通過(guò)中斷方式訪問(wèn)SJA1000。
{{分頁(yè)}}
2、系統(tǒng)軟件設(shè)計(jì)
本設(shè)計(jì)的系統(tǒng)由4個(gè)節(jié)點(diǎn)組成,一個(gè)節(jié)點(diǎn)由上位機(jī)通過(guò)并口轉(zhuǎn)CAN總線的數(shù)據(jù)收發(fā)器構(gòu)成,另外3個(gè)節(jié)點(diǎn)有上圖所示的單片機(jī)CAN總線收發(fā)系統(tǒng)構(gòu)成。單片機(jī)系統(tǒng)每秒發(fā)送一幀(8個(gè)字節(jié))數(shù)據(jù)。連接上位機(jī)的CAN總線收發(fā)器有相應(yīng)的上位機(jī)測(cè)試軟件支持,本文主要介紹單片機(jī)CAN總線收發(fā)器的程序設(shè)計(jì)。圖3是下位機(jī)軟件的流程圖。
圖3下位機(jī)主程序流程圖
系統(tǒng)設(shè)計(jì)的部分代碼如下:
main()
{
Sja_1000_Init(); //初始化SJA1000
Init_Cpu(); //初始化CPU
Init_T0(); //初始化定時(shí)器
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) //定時(shí)中斷標(biāo)志為,定時(shí)時(shí)間到則發(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的初始化過(guò)程包括申請(qǐng)進(jìn)入復(fù)位狀態(tài),設(shè)置總線波特率,設(shè)置輸出方式,開(kāi)放錯(cuò)誤中斷、接受和發(fā)送中斷。在進(jìn)行數(shù)據(jù)發(fā)送時(shí)數(shù)據(jù)包前兩個(gè)字節(jié)0Xaa、0X08為描述符,包括11位長(zhǎng)的ID(標(biāo)志符)1位RTR4位描述數(shù)據(jù)長(zhǎng)度的DLC共16 位。BCAN_DATA_RECEIVE(rcv_data),為89C51對(duì)SJA1000的讀數(shù)據(jù)函數(shù)其具體函數(shù)定義:
bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問(wèn)地址指向狀態(tài)寄存器
if((*SJA_BCANAdr&0x01)==0) //判斷報(bào)文是否有效
{
return 1;
}
SJA_BCANAdr = REG_RxBuffer2; //訪問(wèn)地址指向接收緩沖區(qū)2
if((*SJA_BCANAdr&0x10)==0) //如果是數(shù)據(jù)幀
{
TempCount=(*SJA_BCANAdr&0x0f)+2; //計(jì)算報(bào)文中數(shù)據(jù)的個(gè)數(shù)
}
else
{
TempCount=2;
}
SJA_BCANAdr = REG_RxBuffer1; //訪問(wèn)地址指向接收緩沖區(qū)1
memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//讀取接收緩沖區(qū)的報(bào)文
return 0;
}
此函數(shù)僅限于CAN控制器接受數(shù)據(jù),返回值如果為0表示接受成功,如果為1表示接受失敗。
BCAN_DATA_WRITE(send_data)函數(shù)是89C51對(duì)SJA1000的寫數(shù)據(jù)函數(shù)其具體定義如下:
bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問(wèn)地址指向狀態(tài)寄存器
if((*SJA_BCANAdr&0x08) == 0) //判斷上次發(fā)送是否完成
{
return 1;
}
if((*SJA_BCANAdr&0x04)==0) //判斷發(fā)送緩沖區(qū)是否鎖定
{
return 1;
}
SJA_BCANAdr = REG_TxBuffer1; //訪問(wèn)地址指向發(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;
}
{{分頁(yè)}}
此函數(shù)將待發(fā)送的特定幀各式的數(shù)據(jù),送入SJA1000發(fā)送緩存區(qū)中,然后啟動(dòng),函數(shù)返回0表示將數(shù)據(jù)成功的送至發(fā)送緩沖區(qū),返回1表示上一次的數(shù)據(jù)正在發(fā)送。
系統(tǒng)組網(wǎng)相對(duì)容易只需把各個(gè)節(jié)點(diǎn)掛在同一條雙絞線上即可,啟動(dòng)上位機(jī)的CAN收發(fā)器,用來(lái)監(jiān)視總線數(shù)據(jù)狀態(tài)。每當(dāng)啟動(dòng)一個(gè)下位機(jī)CAN收發(fā)器,上位機(jī)的測(cè)試軟件就可以每隔一秒鐘收到由同一CAN收發(fā)器發(fā)送的數(shù)據(jù)幀。實(shí)驗(yàn)結(jié)果顯示當(dāng)3臺(tái)下位機(jī)CAN總線同時(shí)發(fā)數(shù)時(shí)數(shù)據(jù)接收端沒(méi)有數(shù)據(jù)丟失和總線沖突現(xiàn)象。
3結(jié)束語(yǔ)
現(xiàn)場(chǎng)總線有著巨大的發(fā)展?jié)摿?,它將給自動(dòng)控制領(lǐng)域的變革帶來(lái)深遠(yuǎn)的影響。我們?cè)O(shè)計(jì)的CAN總線收發(fā)器具有通用性,在本系統(tǒng)設(shè)計(jì)的基礎(chǔ)上只需要相應(yīng)的修改數(shù)據(jù)傳輸協(xié)議即可應(yīng)用于各個(gè)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é)測(cè)控技術(shù)與通信工程學(xué)院 研究生 150040
51單片機(jī)相關(guān)文章:51單片機(jī)教程
評(píng)論