基于CAN總線的汽車CAN節(jié)點(diǎn)測(cè)試儀設(shè)計(jì)
CAN通訊程序包括SJA1000芯片的初始化、接收數(shù)據(jù)和發(fā)送數(shù)據(jù)。測(cè)試儀上電后進(jìn)行SJA1000的初始化,該操作必須正確可靠,這是接收數(shù)據(jù)和發(fā)送數(shù)據(jù)的前提。根據(jù)SJA1000的手冊(cè),設(shè)計(jì) 代碼如下:
writesja1000(MODADDR, 0x09);
//設(shè)置方式寄存器,進(jìn)入復(fù)位操作以初始化
writesja1000(CDRADDR, 0x88);
//設(shè)置時(shí)鐘分頻寄存器,選PeliCAN模式
writesja1000(AMR0ADDR, AMR0 );
//設(shè)置接收屏蔽寄存器0
writesja1000(AMR1ADDR, AMR1);
//設(shè)置接收屏蔽寄存器1
writesja1000(AMR2ADDR, AMR2);
//設(shè)置接收屏蔽寄存器2
writesja1000(AMR3ADDR, AMR3);
//設(shè)置接收屏蔽寄存器3
writesja1000(ACR0ADDR, ACR0);
//設(shè)置接收驗(yàn)收代碼寄存器0
writesja1000(ACR1ADDR, ACR1);
//設(shè)置接收驗(yàn)收代碼寄存器1
writesja1000(ACR2ADDR, ACR2);
//設(shè)置接收驗(yàn)收代碼寄存器2
writesja1000(ACR3ADDR, ACR3);
//設(shè)置接收驗(yàn)收代碼寄存器3
writesja1000(BTR0ADDR, 0x03);
//設(shè)置總線定時(shí)器0
writesja1000(BTR1ADDR, 0xFF);
//設(shè)置總線定時(shí)器1
writesja1000(OCRADDR, 0xAA);
//設(shè)置輸出寄存器
writesja1000(RBSAADDR, 0x00);
//設(shè)置接收數(shù)據(jù)緩沖區(qū)首地址
writesja1000(TXERRADDR, 0x00);
//清除發(fā)送錯(cuò)誤寄存器
writesja1000(RXERRADDR, 0x00);
//清除接收錯(cuò)誤寄存器
readsja1000(ECCADDR);
//清除錯(cuò)誤代碼捕捉寄存器
writesja1000(IERADDR, 0xFF);
//打開(kāi)中斷使能寄存器
writesja1000(MODADDR, 0x08);
//設(shè)置方式寄存器,進(jìn)入政黨操作模式以收發(fā)數(shù)據(jù)
writesja1000()和readsja1000()是封裝好的底層函數(shù),其具體實(shí)現(xiàn)如下:
static void writesja1000(unsigned char addr, unsigned char data)
{
*SJAADDR = addr;
*SJADATA = data;
}
static unsigned char readsja1000(unsigned char addr)
{
*SJAADDR = addr;
return *SJADATA;
}
其中SJADATA、SJAADDR分別是為讀/寫(xiě)SJA1000的數(shù)據(jù)或地址所分配的AT91RM9200地址。
接收數(shù)據(jù)和發(fā)送數(shù)據(jù)均采用中斷來(lái)實(shí)現(xiàn),基于中斷的數(shù)據(jù)處理流程是CAN通訊程序的重點(diǎn),其具體實(shí)現(xiàn)流程如圖4所示:
結(jié)束語(yǔ)
與傳統(tǒng)的8/16位單片機(jī)測(cè)試儀系統(tǒng)相比,本文介紹的測(cè)試儀基于32位ARM9處理器,運(yùn)行速度可高達(dá)180MHz,擴(kuò)展能力強(qiáng);采用Linux操作系統(tǒng),軟件更加模塊化,更新和移植更加方便,運(yùn)行更穩(wěn)定;采用虛擬儀器技術(shù)實(shí)現(xiàn)測(cè)試儀的操作面板,便于功能擴(kuò)展,通用性強(qiáng)。在對(duì)汽車CAN節(jié)點(diǎn)現(xiàn)場(chǎng)測(cè)試時(shí),該測(cè)試儀運(yùn)行穩(wěn)定快速,保證了該產(chǎn)品的順利生產(chǎn)。
評(píng)論