新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于LPC2131嵌入式系統(tǒng)μCOS-II實(shí)現(xiàn)CAN通訊

基于LPC2131嵌入式系統(tǒng)μCOS-II實(shí)現(xiàn)CAN通訊

作者: 時(shí)間:2013-09-12 來(lái)源:網(wǎng)絡(luò) 收藏

CAN收發(fā)器與總線接口電路

圖2 CAN收發(fā)器與總線接口電路

對(duì)于其他無(wú)內(nèi)置CAN控制器的能夠承受5V的TTL電平的處理器來(lái)說(shuō),只需改變與SJA1000的數(shù)據(jù)端口ALE/AS,RD/E,WR,CS,INT,RST相連接的引腳即可完成外擴(kuò)CAN接口的硬件設(shè)計(jì)工作,否則在兩者之間加一個(gè)邏輯電平轉(zhuǎn)換的器件即可。

軟件設(shè)計(jì)

對(duì)SJA1000的讀寫(xiě)訪問(wèn)

由于的48個(gè)引腳全是IO,所以首先需要通過(guò)軟件模擬讀寫(xiě)SJA1000的時(shí)序,來(lái)對(duì)SJA1000進(jìn)行操作,進(jìn)而完成功能。

依據(jù)SJA1000在Intel模式下的讀寫(xiě)時(shí)序[4],可編寫(xiě)通過(guò)CAN控制器SJA1000發(fā)送數(shù)據(jù)的寫(xiě)函數(shù)void WriteCan(uint8 Addr,uint8 Data)和接受CAN控制器所接受的數(shù)據(jù)的讀函數(shù)uint8 ReadCan(uint8 Addr),其中Addr為SJA1000相應(yīng)的寄存器的地址,Data為所發(fā)送的數(shù)據(jù),讀函數(shù)ReadCan可返回所接受的數(shù)據(jù)。

的實(shí)現(xiàn)

要實(shí)現(xiàn)一個(gè)需要實(shí)現(xiàn)3個(gè)功能模塊:對(duì)SJA1000的初始化模塊;數(shù)據(jù)發(fā)送模塊;數(shù)據(jù)接受模塊。

·對(duì)SJA1000的初始化模塊

在開(kāi)始通訊之前,首先要在SJA

1000的各個(gè)功能寄存器進(jìn)行設(shè)置,包括模式寄存器,波特率,時(shí)鐘分頻器,中斷使能寄存器,,濾波寄存器,輸出控制寄存器。

uint8 IniSJA1000(uint8 BTR0,uint8 BTR1)

{

IO0CLR=CS; //片選SJA1000

WriteCan(0,0x09); //進(jìn)入復(fù)位模式

WriteCan(31,0xe8); //設(shè)置時(shí)鐘分頻器

WriteCan(4,0xfd); //設(shè)置中斷使能寄存器

WriteCan(16,AcceptCode1);//設(shè)置驗(yàn)收代碼1

WriteCan(17,AcceptCode2);//設(shè)置驗(yàn)收代碼2

WriteCan(18,AcceptCode3);//設(shè)置驗(yàn)收代碼3

WriteCan(19,AcceptCode4);//設(shè)置驗(yàn)收代碼4

WriteCan(20,MaskCode1); //設(shè)置驗(yàn)收屏蔽1

WriteCan(21,MaskCode2); //設(shè)置驗(yàn)收屏蔽2

WriteCan(22,MaskCode3); //設(shè)置驗(yàn)收屏蔽3

WriteCan(23,MaskCode4); //設(shè)置驗(yàn)收屏蔽4

WriteCan(6,BTR0); //設(shè)置總線時(shí)序寄存器1

WriteCan(7,BTR1); //設(shè)置總線時(shí)序寄存器2

WriteCan(8,0xfa); //設(shè)置輸出控制積存器

WriteCan(0,0x08); //進(jìn)入操作模式

OSCANMbox=OSMboxCreate(0);/建立CAN通訊郵箱

if (OSCANMbox==NULL)

{

return FALSE;

}

return TRUE;

}

·數(shù)據(jù)發(fā)送模塊

假設(shè)要發(fā)送的數(shù)據(jù)的ID存儲(chǔ)在數(shù)組ID[4]中,數(shù)據(jù)存儲(chǔ)在數(shù)組SendData[8]中,其發(fā)送模塊程序如下所示,其中參數(shù)DLC為發(fā)送的字節(jié)數(shù),F(xiàn)F為幀類型,即0為數(shù)據(jù)幀,1為遠(yuǎn)程幀。

void Tx(uint8 DLC,uint8 FF)

{

uint8 i;

OS_ENTER_CRITICAL();

If (FF==0x01)

{

WriteCan(16,DLC+0x80); //數(shù)據(jù)幀

}

else

{

WriteCan(16,DLC+0xd0); //遠(yuǎn)程幀

}

WriteCan(17,ID[0]);

WriteCan(18,ID[1]);

WriteCan(19,ID[2]);

WriteCan(20,ID[3]); //TX標(biāo)識(shí)碼

for (i=0;i

WriteCan(21+i,sentdata[i]); //TX數(shù)據(jù)

WriteCan(1,0x01);//設(shè)置發(fā)送寄存器發(fā)送

OS_EXIT_CRITICAL();

}



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉