基于CAN總線的現(xiàn)場(chǎng)設(shè)備控制管理系統(tǒng)
SJA1000作為微控制器的片外擴(kuò)展芯片,其片選引腳CS應(yīng)接在微控制器的P2.0 上,以用于決定CAN控制器各寄存器的地址。SJA1000通過(guò)CAN總線驅(qū)動(dòng)器PCA82C250連接在物理總線上。PCA82C250器件可提供對(duì)總線的差動(dòng)發(fā)送能力和對(duì)CAN控制器的差動(dòng)接受能力,它同時(shí)完全和“ISO11898”標(biāo)準(zhǔn)兼容。由于通信信號(hào)傳輸?shù)綄?dǎo)線的端點(diǎn)時(shí)會(huì)發(fā)生反射,而且反射信號(hào)會(huì)干擾正常信號(hào)的傳輸,因此,總線兩端應(yīng)接有終端電阻R1、R2,以消除反射信號(hào),其阻值應(yīng)當(dāng)與傳輸電纜的特性阻抗大致相當(dāng)。
2.CAN節(jié)點(diǎn)的軟件設(shè)計(jì)
本節(jié)點(diǎn)的軟件編程主要包括A/D轉(zhuǎn)換(ADC)、CAN控制器的初始化、CAN總線數(shù)據(jù)的發(fā)送和接收等幾個(gè)部分。主程序的流程圖如圖3所示。
下面分別對(duì)這幾個(gè)主要部分的程序設(shè)計(jì)做一介紹。
2.1 A/D轉(zhuǎn)換部分
筆者在本設(shè)計(jì)中采用的是單步A/D轉(zhuǎn)換模式,并將A/D轉(zhuǎn)換結(jié)果存入指定的數(shù)據(jù)存儲(chǔ)區(qū)。具體步驟如下:
(1)通過(guò)設(shè)置ADC控制寄存器(ADCCON1和ADCCON(2)的值來(lái)確定A/D轉(zhuǎn)換的工作狀態(tài)和采樣通道號(hào);
(2)使能ADC中斷,置位SCONV位以啟動(dòng)單步A/D轉(zhuǎn)換;
(3)等待響應(yīng)ADC中斷,并進(jìn)入中斷服務(wù)程序;
(4)把采樣所得的數(shù)據(jù)從ADCDATAL和ADC-DATAH兩個(gè)特殊寄存器中取出,并存入預(yù)設(shè)的片內(nèi)數(shù)據(jù)存儲(chǔ)器中,然后退出中斷服務(wù)程序;
(5)判斷所需通道是否采樣完畢,如果未完成,則設(shè)置采樣通道號(hào)并返回步驟(2),若完成則退出A/D轉(zhuǎn)換子程序。
通過(guò)該程序可隨時(shí)根據(jù)實(shí)際需要更改采樣通道數(shù),并將采樣結(jié)果直接存入指定數(shù)據(jù)存儲(chǔ)區(qū),以為今后向CAN總線發(fā)送所得數(shù)據(jù)提供便利。
2.2 SJA1000的初始化
CAN的通信協(xié)議主要是由CAN控制器完成的,因此,要想實(shí)現(xiàn)CAN節(jié)點(diǎn)的數(shù)據(jù)傳送,對(duì)CAN控制器的初始化是十分關(guān)鍵的。這個(gè)步驟直接決定著該CAN網(wǎng)絡(luò)系統(tǒng)各節(jié)點(diǎn)所共同遵守的協(xié)議。對(duì)SJA1000進(jìn)行初始化實(shí)際上就是通過(guò)單片機(jī)向其片內(nèi)的各個(gè)寄存器寫(xiě)入控制字的過(guò)程,其寄存器包括以下幾個(gè):
REG CONTROL―內(nèi)部控制寄存器地址;
REG COMMAND―內(nèi)部命令寄存器地址;
REG STATUS ―內(nèi)部狀態(tài)寄存器地址;
REG INTERRUPT―內(nèi)部中斷寄存器地址;
REG ACR―內(nèi)部驗(yàn)收代碼寄存器地址;
REG AMR―內(nèi)部驗(yàn)收屏蔽寄存器地址;
REG BTR0―總線定時(shí)寄存器0;
REG BTR1―總線定時(shí)寄存器1;
REG OCR―輸出控制寄存器。
其中:BTR0、BTR1寄存器的內(nèi)容可用于決定系統(tǒng)通信的波特率和CAN協(xié)議物理層中的同步跳轉(zhuǎn)寬度,因此,對(duì)于一個(gè)系統(tǒng)中的所有節(jié)點(diǎn),這兩個(gè)寄存器的內(nèi)容必須相同(包括上位機(jī)),否則將無(wú)法進(jìn)行通信;OCR寄存器的內(nèi)容用于決定CAN控制器的輸出方式;而寫(xiě)入ACR、AMR寄存器的內(nèi)容則要根據(jù)實(shí)際的網(wǎng)絡(luò)系統(tǒng)和報(bào)文標(biāo)志符來(lái)決定。本設(shè)計(jì)中筆者采用的是BasicCAN模式。
完成初始化后,CAN控制器就能正常運(yùn)行了,但是要實(shí)現(xiàn)具體的數(shù)據(jù)收發(fā)任務(wù),還必須編制特定的收、發(fā)程序。
2.3 CAN總線數(shù)據(jù)的發(fā)送和接收
(1)發(fā)送部分的程序設(shè)計(jì)
用CAN總線發(fā)送數(shù)據(jù)的流程圖如圖4所示。實(shí)際上,在程序運(yùn)行過(guò)程中,常常會(huì)在發(fā)送某一幀數(shù)據(jù)時(shí)發(fā)現(xiàn)上一幀的數(shù)據(jù)還沒(méi)有完全發(fā)送完畢(可以通過(guò)查詢(xún)狀態(tài)寄存器REG STATUS的第4位BIT TCS的顯、隱狀態(tài)可了解上次數(shù)據(jù)的發(fā)送情況)。因此,筆者采用的處理方法是:通過(guò)指令啟動(dòng)本次發(fā)送之后,就不停地查詢(xún)狀態(tài)寄存器,以判斷本次發(fā)送是否完成,直到確定完成為止。這樣可以為下次發(fā)送提供便利,同時(shí)也有利于程序的順利執(zhí)行,從而避免出現(xiàn)錯(cuò)誤。
(2)接收部分的程序設(shè)計(jì)
圖5所示是該系統(tǒng)接收部分的軟件流程圖。實(shí)際上,在對(duì)響應(yīng)速度要求不太高的場(chǎng)合,以查詢(xún)方式來(lái)設(shè)計(jì)接收子程序是最簡(jiǎn)單、最可靠的方式。如果總線上有數(shù)據(jù)發(fā)往本節(jié)點(diǎn),則通過(guò)查詢(xún)狀態(tài)寄存器的第1位BIT_RBS的位狀態(tài),便可得知接收緩沖區(qū)(RXFIFO)中的可用信息,然后通過(guò)軟件將RXFIFO中的數(shù)據(jù)逐個(gè)“移入”到指定的片內(nèi)存儲(chǔ)空間即可。對(duì)于這樣一個(gè)主要以數(shù)據(jù)采集功能為主的CAN節(jié)點(diǎn),這些數(shù)據(jù)多半是由CAN網(wǎng)絡(luò)中的“控制中心”發(fā)來(lái)的控制信號(hào),設(shè)計(jì)時(shí)把它們留給ADμC812進(jìn)一步處理就可以了。
參考文獻(xiàn)
1 Bosch 公司 CAN 協(xié)議規(guī)范 V2.0版本
2 肖海榮 周風(fēng)余.基于SJA1000的CAN總線系統(tǒng)智能節(jié)點(diǎn)設(shè)計(jì) 計(jì)算機(jī)自動(dòng)測(cè)量與控制 2001、9(2)
3 鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì),北京航空航天大學(xué)出版社
4 SJA1000獨(dú)立CAN控制器介紹,廣州周立功單片機(jī)發(fā)展有限公司.
5 獨(dú)立CAN器件SJA1000的應(yīng)用,東南大學(xué)學(xué)報(bào),2002年3月.
評(píng)論