飛思卡爾MC9S12X:CAN初始化配置
飛思卡爾MC9S12X:CAN發送配置
飛思卡爾MC9S12X:CAN接收配置
一、MSCAN發送流程
- 檢查資料長度:超過8個就不發送了,
- 檢查總線時鐘:使用外部晶振時鐘,此段可以省略,
- 尋找空閑緩沖器,
- 寫入識別符號:此處用到CANIDR暫存器,
- 判斷幀格式(遠程幀 /資料幀):此處用到CANIDR暫存器,
- 寫入資料:此處用到CANDSR暫存器,
- 寫入資料長度:此處用到CANDLR暫存器,
- 寫入優先級:此處用到CANTBPR暫存器,
- 清除發送標志位 :此處用到CANTFLG暫存器,
二、MSCAN發送暫存器介紹
CANIDR暫存器有兩種型式:標準幀型式和擴展幀型式,
標準幀型式:

擴展幀型式:







三、CAN發送配置具體程式實作
1.標準幀程式
具體代碼如下:
struct can_msg //發送報文的結構體
{
unsigned int id; //幀ID
unsigned char RTR; // RTR: 1為遠程幀,0為資料幀
unsigned char data[8]; //幀資料
unsigned char len; //資料長度
unsigned char prty; //優先級
};
/*************************************************************/
/* CAN0發送 */
/*************************************************************/
void MSCAN0_Send(struct can_msg msg)
{
unsigned char send_buf, sp;
// 檢查資料長度
if(msg.len > 8)
return(FALSE);
// 檢查總線時鐘
if(CAN0CTL0_SYNCH==0)
return(FALSE);
send_buf = 0;
do
{
// 尋找空閑的緩沖器
CAN0TBSEL=CAN0TFLG;
send_buf=CAN0TBSEL;
}
while(!send_buf);
// 寫入識別符號
CAN0TXIDR0 = (unsigned char)(msg.id>>3);
CAN0TXIDR1 = (unsigned char)(msg.id<<5);
// RTR: 1為遠程幀,0為資料幀
if(msg.RTR)
CAN0TXIDR1 |= 0x10;
// 寫入資料
for(sp = 0; sp < msg.len; sp++)
*((&CAN0TXDSR0)+sp) = msg.data[sp];
// 寫入資料長度
CAN0TXDLR = msg.len;
// 寫入優先級
CAN0TXTBPR = msg.prty;
// 清 TXx 標志 (緩沖器準備發送)
CAN0TFLG = send_buf;
return(TRUE);
}
2.擴展幀程式
具體代碼如下:
struct can_msg //發送報文的結構體
{
unsigned long ID; //幀ID
unsigned char RTR; // RTR: 1為遠程幀,0為資料幀
unsigned char data[8]; //幀資料
unsigned char len; //資料長度
unsigned char prty; //優先級
};
/*************************************************************/
/* CAN0發送 */
/*************************************************************/
void MSCAN0_Send(struct can_msg msg)
{
unsigned char send_buf, sp;
// 檢查資料長度
if(msg.len > 8)
return(FALSE);
// 檢查總線時鐘
if(CAN0CTL0_SYNCH==0)
return(FALSE);
send_buf = 0;
do
{
// 尋找空閑的緩沖器
CAN0TBSEL=CAN0TFLG;
send_buf=CAN0TBSEL;
}
while(!send_buf);
// 寫入識別符號
CAN0TXIDR0 = (unsigned char)(msg.ID>>21);
CAN0TXIDR1 = (unsigned char)(msg.ID>>13)&0xE0;
CAN0TXIDR1 |=0x18; //寫替代遠程請求位SRR和擴展幀標志位IDE
CAN0TXIDR1 |=(unsigned char)(msg.ID>>15)&0x07;
CAN0TXIDR2 = (unsigned char)(msg.ID>>7);
CAN0TXIDR3 = (unsigned char)(msg.ID<<1);
// RTR: 1為遠程幀,0為資料幀
if(msg.RTR)
CAN0TXIDR3 |= 0x01;
// 寫入資料
for(sp = 0; sp < msg.len; sp++)
*((&CAN0TXDSR0)+sp) = msg.data[sp];
// 寫入資料長度
CAN0TXDLR = msg.len;
// 寫入優先級
CAN0TXTBPR = msg.prty;
// 清 TXx 標志 (緩沖器準備發送)
CAN0TFLG = send_buf;
return(TRUE);
}
點擊下載,關于MSCAN暫存器的詳細中文介紹
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/250755.html
標籤:其他
上一篇:C語言 | 輸出魔方矩陣
下一篇:C一百題
