久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 基于LPC2131嵌入式系統μCOS-II實現CAN通訊

基于LPC2131嵌入式系統μCOS-II實現CAN通訊

作者: 時間:2013-09-12 來源:網絡 收藏

CAN收發器與總線接口電路

圖2 CAN收發器與總線接口電路

對于其他無內置CAN控制器的能夠承受5V的TTL電平的處理器來說,只需改變與SJA1000的數據端口ALE/AS,RD/E,WR,CS,INT,RST相連接的引腳即可完成外擴CAN接口的硬件設計工作,否則在兩者之間加一個邏輯電平轉換的器件即可。

軟件設計

對SJA1000的讀寫訪問

由于的48個引腳全是IO,所以首先需要通過軟件模擬讀寫SJA1000的時序,來對SJA1000進行操作,進而完成功能。

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

的實現

要實現一個需要實現3個功能模塊:對SJA1000的初始化模塊;數據發送模塊;數據接受模塊。

·對SJA1000的初始化模塊

在開始通訊之前,首先要在SJA

1000的各個功能寄存器進行設置,包括模式寄存器,波特率,時鐘分頻器,中斷使能寄存器,,濾波寄存器,輸出控制寄存器。

uint8 IniSJA1000(uint8 BTR0,uint8 BTR1)

{

IO0CLR=CS; //片選SJA1000

WriteCan(0,0x09); //進入復位模式

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

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

WriteCan(16,AcceptCode1);//設置驗收代碼1

WriteCan(17,AcceptCode2);//設置驗收代碼2

WriteCan(18,AcceptCode3);//設置驗收代碼3

WriteCan(19,AcceptCode4);//設置驗收代碼4

WriteCan(20,MaskCode1); //設置驗收屏蔽1

WriteCan(21,MaskCode2); //設置驗收屏蔽2

WriteCan(22,MaskCode3); //設置驗收屏蔽3

WriteCan(23,MaskCode4); //設置驗收屏蔽4

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

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

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

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

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

if (OSCANMbox==NULL)

{

return FALSE;

}

return TRUE;

}

·數據發送模塊

假設要發送的數據的ID存儲在數組ID[4]中,數據存儲在數組SendData[8]中,其發送模塊程序如下所示,其中參數DLC為發送的字節數,FF為幀類型,即0為數據幀,1為遠程幀。

void Tx(uint8 DLC,uint8 FF)

{

uint8 i;

OS_ENTER_CRITICAL();

If (FF==0x01)

{

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

}

else

{

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

}

WriteCan(17,ID[0]);

WriteCan(18,ID[1]);

WriteCan(19,ID[2]);

WriteCan(20,ID[3]); //TX標識碼

for (i=0;i

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

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

OS_EXIT_CRITICAL();

}



評論


相關推薦

技術專區

關閉