RS485-CAN轉(zhuǎn)換器的設(shè)計(jì)
RS485 是一種平衡傳輸方式的串行接口標(biāo)準(zhǔn),采用半雙工異步數(shù)據(jù)通信方式?;谠赗S485 總線上只能有一個(gè)主機(jī)的特點(diǎn),它往往應(yīng)用在集中控制樞紐和分散控制單元之間。同時(shí)RS485 的總線效率低,系統(tǒng)的實(shí)時(shí)性差,通信的可靠性低,后期維護(hù)成本高,網(wǎng)絡(luò)工程調(diào)試復(fù)雜,傳輸距離不理想,單總線可掛接的節(jié)點(diǎn)少等缺點(diǎn)也局限了其應(yīng)用。
本文引用地址:http://m.butianyuan.cn/article/201611/319298.htmCAN(Controller Area Network,控制器局域網(wǎng))現(xiàn)場(chǎng)總線是一種由帶CAN 控制器組成的高性能串行數(shù)據(jù)局域通信網(wǎng)絡(luò),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。它的總線長(zhǎng)度最遠(yuǎn)可達(dá)10 千米(速率5Kbps 以下),數(shù)據(jù)傳輸速率最高可達(dá)1Mbps(通訊距離40 米以內(nèi))。它在多主方式下工作,不分主從。采用非破壞總線仲裁技術(shù),即使網(wǎng)絡(luò)負(fù)載很重也不會(huì)出現(xiàn)網(wǎng)絡(luò)癱瘓現(xiàn)象。此外,CAN 的每幀信息都有CRC 校驗(yàn)和其它檢錯(cuò)措施,有很好的檢錯(cuò)效果。由于CAN 總線具備以上優(yōu)點(diǎn),它目前已經(jīng)被廣泛應(yīng)用到汽車電子、電力系統(tǒng)、航空工業(yè)和自動(dòng)工作等領(lǐng)域中,并形成了國(guó)際標(biāo)準(zhǔn),被公認(rèn)為幾種最有前途的現(xiàn)場(chǎng)總線之一。
一時(shí)間完全放棄RS485網(wǎng)絡(luò)系統(tǒng)是有困難的,尤其是在已經(jīng)具有現(xiàn)成的硬件網(wǎng)絡(luò)中。因此考慮一種折中的方法,就是在保留現(xiàn)有RS485系統(tǒng)硬件結(jié)構(gòu)的基礎(chǔ)上,添加一個(gè)CAN總線接口,從而實(shí)現(xiàn)RS485網(wǎng)絡(luò)與CAN網(wǎng)絡(luò)的互聯(lián)。
2 系統(tǒng)硬件設(shè)計(jì)
RS485-CAN轉(zhuǎn)換器硬件設(shè)計(jì)框圖如圖1所示,整個(gè)硬件系統(tǒng)分為5個(gè)模塊:微控制器模塊,基本模塊,CAN接口模塊,RS485模塊和儲(chǔ)存模塊。其中CAN接口模塊的CAN控制器的選用要依據(jù)微控制器模塊,如果選擇的微控制器中集成了CAN控制器,則無(wú)需外接CAN控制器,否則需要外接CAN控制器。
2.1 微控制器模塊,基本模塊以及儲(chǔ)存模塊
這三個(gè)模塊的設(shè)計(jì)屬于常規(guī)設(shè)計(jì),因此省去具體的電路圖。需要說(shuō)明的是微控制器可以選擇內(nèi)部集成了CAN 控制器的單片機(jī),但是本設(shè)計(jì)基于系統(tǒng)成本,性價(jià)比以及微控制器的應(yīng)用普遍性的考慮,使用的是ATMEL 的AT89C52 單片機(jī);基本模塊主要是完成微控制器的外圍電路設(shè)計(jì),主要包括電源和晶振以及復(fù)位電路等;儲(chǔ)存模塊主要是用來(lái)儲(chǔ)存系統(tǒng)的配置信息,如CAN 波特率,RS485 波特率等,要求的儲(chǔ)存空間較小,1K 的片外EEPROM 足夠使用,當(dāng)然也可以選擇自帶EEPROM 的微處理器。
圖1:系統(tǒng)硬件設(shè)計(jì)框圖
2.2 CAN 接口模塊
CAN 接口模塊包括總線控制器和收發(fā)器兩部分。CAN 總線控制器選擇的是SJA1000,它是Philips 公司推出的一款完全符合CAN 總線協(xié)議規(guī)定的CAN 控制器,可完成報(bào)文控制,數(shù)據(jù)濾波等CAN 控制器功能,SJA1000 不僅兼容PCA82C200 支持的BasicCAN(CANBUS2.0A)模式,還支持功能更強(qiáng)的PeliCAN(CANBUS 2.0B)模式;收發(fā)器選擇的是TJA1050,它是CAN 協(xié)議控制器和物理總線的接口,是一種標(biāo)準(zhǔn)的高速CAN 收發(fā)器。
圖2:CAN 模塊電路圖
如圖2所示SJA1000的AD0-AD7與單片機(jī)的數(shù)據(jù)總線相連,P2.0引腳作為SJA1000的片選使能端,由ALE,WR,RD控制SJA1000的數(shù)據(jù)的發(fā)送和接收。11腳MODE接高電平,選用51系列的8位微控制器的Intel二分頻模式。16腳是中斷信號(hào),接單片機(jī)的外部中斷引腳。TX1腳懸空,RX1腳的電位必須維持在0.5VCC以上,否則將不能形成CAN總線所要求的電平邏輯。
高速光耦6N137提高了總線節(jié)點(diǎn)的抗干擾能力,TVS能避免數(shù)據(jù)受到不必要的外界影響并能保護(hù)元器件;另外在總線兩端的設(shè)備加120歐姆的匹配電阻會(huì)使數(shù)據(jù)通信的抗干擾性以及可靠性大大加強(qiáng),CANH和CANL與地之間并聯(lián)兩個(gè)30PF的小電容,可以濾除總線上的高頻干擾并且具有一定的防電磁輻射的能力。這些額外的保護(hù)電路同樣適合RS485模塊的設(shè)計(jì)。
2.3 RS485 接口模塊
RS485 接口模塊采用MAX485 芯片作為總線收發(fā)器,它是+5V 低功耗半雙工器件。MAX485 的驅(qū)動(dòng)器輸出是差分輸出,完全滿足RS485 串行協(xié)議的要求,兼容工業(yè)標(biāo)準(zhǔn)規(guī)范,符合RS485 串行協(xié)議的電氣規(guī)范。電路連接如圖3。
圖 3:RS485 模塊電路圖
3 系統(tǒng)軟件設(shè)計(jì)
本系統(tǒng)的軟件設(shè)計(jì)除了實(shí)現(xiàn)單個(gè)模塊的驅(qū)動(dòng)程序以外,最主要的就是實(shí)現(xiàn)兩種網(wǎng)絡(luò)間不同協(xié)議的轉(zhuǎn)換。CAN協(xié)議參考模型中定義了物理層和數(shù)據(jù)鏈路層,RS485協(xié)議參考模型中只定義了物理層。因此建立圖4所示的協(xié)議模型。
CAN的幀格式中,有一個(gè)標(biāo)識(shí)符域,CAN控制器的全局濾波器會(huì)檢測(cè)這個(gè)標(biāo)識(shí)域,決定是否接收本幀數(shù)據(jù)。由于RS485網(wǎng)絡(luò)上,所有節(jié)點(diǎn)都會(huì)同時(shí)收到數(shù)據(jù),因此可以為所有的RS485從設(shè)備設(shè)定同一個(gè)標(biāo)識(shí)符。一個(gè)CAN節(jié)點(diǎn)若要發(fā)送數(shù)據(jù)給RS485設(shè)備,只需在該幀把標(biāo)識(shí)符域設(shè)定為相應(yīng)的標(biāo)識(shí)符即可;RS485本質(zhì)上僅僅是一個(gè)物理層標(biāo)準(zhǔn),其幀格式完全由用戶自己定義。最終在RS485總線中傳輸還是以幀為單位,其中包含了地址信息。RS485設(shè)備會(huì)自動(dòng)根據(jù)接收到的幀,自動(dòng)判斷該幀是否發(fā)往本節(jié)點(diǎn),然后做出相應(yīng)處理。因此,在RS485設(shè)備要發(fā)送數(shù)據(jù)時(shí),RS485-CAN總線轉(zhuǎn)換器只需把RS485總線的數(shù)據(jù)進(jìn)行幀打包后送入CAN的數(shù)據(jù)幀中,然后發(fā)送到CAN網(wǎng)絡(luò)上;而RS485設(shè)備在接收數(shù)據(jù)時(shí),RS485-CAN總線轉(zhuǎn)換器則把RS485總線的數(shù)據(jù)幀從接收到的CAN數(shù)據(jù)幀中提取出來(lái),發(fā)往RS485設(shè)備即可。
圖4:RS485-CAN 協(xié)議模型
3.1CAN 接口軟件設(shè)計(jì)
CAN總線數(shù)據(jù)鏈路層結(jié)構(gòu)可分為邏輯鏈路控制(LLC)子層和媒體訪問(wèn)控制(MAC)子層。LLC子層主要完成幀接收濾波,超載通告和恢復(fù)管理,而MAC子層結(jié)構(gòu)功能模塊包括發(fā)送和接收兩個(gè)部分。對(duì)于CAN總線數(shù)據(jù)鏈路層的各種協(xié)議已經(jīng)被集成到SJA1000芯片中,應(yīng)用時(shí)只要對(duì)SJA1000芯片的控制寄存器進(jìn)行相應(yīng)的初始化即可進(jìn)行通信,而數(shù)據(jù)的接收和發(fā)送等也是通過(guò)讀寫SJA1000內(nèi)部寄存器來(lái)實(shí)現(xiàn)的。這里只給出SJA1000的初始化源程序,其它程序可參考文獻(xiàn)[2]進(jìn)行編寫。
SJA1000開(kāi)始工作之前,首先要判斷SJA1000與微處理器的連接是否正確,在確認(rèn)正確后開(kāi)始SJA1000的初始化,之后SJA1000進(jìn)入工作模式,然后才可以進(jìn)行數(shù)據(jù)的讀寫。
typedef struct _CAN_PORTSTRUCT /*SJA1000初始化配置文件結(jié)構(gòu)體*/
{
FIL filter; /*濾波方式*/
LIS lisen; /*只聽(tīng)模式/正常模式*/
TES test; /*自測(cè)試模式/正常模式*/
SLE sleep; /*睡眠模式設(shè)置*/
BAUD baud_rate; /*波特率*/
MODEL workmodel ; /*工作模式*/
UCHAR mask1;
UCHAR mask2;
UCHAR mask3;
UCHAR mask4;
UCHAR code1;
UCHAR code2;
UCHAR code3;
UCHAR code4;
}CAN_PORT,*CANPORTPTR;
STATUS sja1000Init(CANPORTPTR pDev) /*SJA1000初始化*/
{
UCHAR value;
canBoardInit(); /*進(jìn)入復(fù)位模式*/
canBoard_canOutByte(SJA1000_MOD,MOD_RM); /*確定CAN控制器工作模式*/
value = canBoard_canInByte(SJA1000_CDR);
if(pDev->workmodel == Peli) value|= PeliCAN ;
else value &= ~PeliCAN;
/*設(shè)置模式寄存器(只在PeliCAN模式可訪問(wèn))*/
canBoard_canOutByte(SJA1000_CDR,value|0x48);
value = canBoard_canInByte(SJA1000_MOD);
if(pDev->sleep == SNORM) value &=~(MOD_SM); /*睡眠模式*/
else value|= MOD_SM; /*正常模式*/
if(pDev->lisen == LNORM) value&= ~(MOD_LOM); /*正常模式*/
else value|= MOD_LOM; /*只聽(tīng)模式*/
if(pDev->test == TNORM) value&= ~(MOD_STM); /*正常模式*/
else value|= MOD_STM; /*自檢測(cè)模式*/
if(pDev->filter == SINGLE) value|= MOD_AFM; /*單向驗(yàn)收濾波*/
else value &=(~MOD_AFM); /*雙向驗(yàn)收濾波*/
canBoard_canOutByte(SJA1000_MOD,value);
switch (pDev->baud_rate)
{
case B20: //波特率為20kpbs
canBoard_canOutByte(SJA1000_BTR0,0x07);
canBoard_canOutByte(SJA1000_BTR1,0x7F);
break;
case B80: //波特率為80kpbs
canBoard_canOutByte(SJA1000_BTR0,0x01);
canBoard_canOutByte(SJA1000_BTR1,0x7F);
break;
case B250: //波特率為250kpbs
canBoard_canOutByte(SJA1000_BTR0,0x00);
canBoard_canOutByte(SJA1000_BTR1,0x1C);
break;
case B500: //波特率為500kpbs
canBoard_canOutByte(SJA1000_BTR0,0x00);
canBoard_canOutByte(SJA1000_BTR1,0x14);
break;
default: //默認(rèn)波特率為20kpbs
canBoard_canOutByte(SJA1000_BTR0,0x07);
canBoard_canOutByte(SJA1000_BTR1,0x7F);
}
canBoard_canOutByte(SJA1000_CMR,0); /*設(shè)置命令寄存器*/
canBoard_canOutByte(SJA1000_EWLR,0x60); /*設(shè)置錯(cuò)誤報(bào)警限額寄存器*/
canBoard_canOutByte(SJA1000_IER,0); /*不使能所有中斷*/
canBoard_canOutByte(SJA1000_OCR,0xaa); /*輸出控制寄存器設(shè)置*/
canBoard_canOutByte(SJA1000_TXERR,0x0); /*設(shè)置發(fā)送錯(cuò)誤計(jì)數(shù)器*/
canBoard_canOutByte(SJA1000_RXERR,0x0); /*設(shè)置接受錯(cuò)誤計(jì)數(shù)器*/
canBoard_canOutByte(SJA1000_RMC,0); /*設(shè)置接收?qǐng)?bào)文計(jì)數(shù)器*/
canBoard_canOutByte(SJA1000_ACR0,pDev->code1);
canBoard_canOutByte(SJA1000_ACR1,pDev->code2); /*設(shè)置驗(yàn)收代碼寄存器*/
canBoard_canOutByte(SJA1000_ACR2,pDev->code3);
canBoard_canOutByte(SJA1000_ACR3,pDev->code4);
canBoard_canOutByte(SJA1000_AMR0,pDev->mask4);
canBoard_canOutByte(SJA1000_AMR1,pDev->mask4); /*設(shè)置驗(yàn)收屏蔽寄存器*/
canBoard_canOutByte(SJA1000_AMR2,pDev->mask4);
canBoard_canOutByte(SJA1000_AMR3,pDev->mask4);
return OK;
}
3.2 RS485接口軟件設(shè)計(jì)
RS485接口軟件設(shè)計(jì)主要包括串口的初始化,串口中斷處理等函數(shù)的編寫,因?yàn)镽S485接口的軟件設(shè)計(jì)比較簡(jiǎn)單,所以這部分可參考文獻(xiàn)[4]設(shè)計(jì),這里省略。
結(jié)束語(yǔ)
CAN總線是當(dāng)前應(yīng)用最為廣泛的現(xiàn)場(chǎng)總線之一,而RS485總線是最常用的串行總線,二者之間的轉(zhuǎn)換具有很高的使用價(jià)值。設(shè)計(jì)應(yīng)注意以下幾點(diǎn):(1)RS485-CAN轉(zhuǎn)換器的主要任務(wù)是將數(shù)據(jù)以最快的速度轉(zhuǎn)發(fā),流量和差錯(cuò)控制應(yīng)由通信雙方的應(yīng)用層來(lái)完成,因此設(shè)計(jì)不能過(guò)于復(fù)雜。(2)處理速度是設(shè)計(jì)時(shí)首先考慮的一點(diǎn),這將影響芯片的選型。(3)RS485-CAN的通用性取決于軟件方面的設(shè)計(jì)和協(xié)議的使用,硬件上都是兼容的。
評(píng)論