📄 initcan0.c
字号:
#include <mc9s12dg128.h>
/*****************************
Structure Declaration
*****************************/
typedef struct{
byte id[4];
byte data[8];
byte length;
byte prio;
}candata;
/*****************************
function prototype
*****************************/
void Init_CAN0(void);
void Init_CAN0(void) {
//locate CAN0 port to PM0/PM1
//MODRR[1] MODRR[0] RXCAN0 TXCAN0
// 0 0 PM0 PM1
// 0 1 PM2 PM3
// 1 0 PM4 PM5
// 1 1 PJ6 PJ7
MODRR_MODRR0 = 0;
MODRR_MODRR1 = 0;
//Initialization Mode Request
CAN0CTL0_INITRQ = 1;
//Congfig CAN0CTL1 register
CAN0CTL1_CANE = 1; //enable msCAN module 1:enabled 0:disabled
CAN0CTL1_CLKSRC = 0; //Clock Source 1:Bus 0:OSC
CAN0CTL1_LOOPB = 0; //Loop Back Self Test Mode 1:enabled 0:disabled
CAN0CTL1_LISTEN = 0; //Listen Only Mode 1:Listen Only 0:Normal Mode
CAN0CTL1_WUPM = 0; //Wake-Up Mode 1:>Twup 0:Any Signal wake up
//=======================
//Config CAN0 Baudrate
//=======================
//
// Tq = 1/4000000(s) Fq=4000000(Hz)
// T_bit = (1+Tseg1+Tseg2)*Tq = 16*Tq
// F_bit = Fq/(1+Tseg1+Tseg2) = 4000000/16 = 250kbps
//
//=======================
//Config CAN0BTR0 register
CAN0BTR0_BRP = 7; //Baud Rate Prescaler(Prescaler=BRP+1=4 16M_OSC-->4M)
CAN0BTR0_SJW = 1; //SJW = (SJW+1)*Tq = 2*Tq
//Config CAN0BTR1 register
CAN0BTR1_SAMP = 1; //Sampling 1: 3 samples 0:1 sample per bit
CAN0BTR1_TSEG_10= 6; //Tseg1=6+1=7
CAN0BTR1_TSEG_20= 7; //Tseg2=7+1=8
//=======================
//Config CAN0 Filiter
//=======================
//Config CAN0IDAC register
//MSCAN Identifier Acceptance Control Register
CAN0IDAC_IDAM0 = 0; //00:2*32bit 01:4*16bit
CAN0IDAC_IDAM1 = 0; //10:8*8bit 11:closed,no message is acceped
//Config CAN0IDAR0-7 register
CAN0IDAR0 = 0x00;
CAN0IDAR1 = 0x00;
CAN0IDAR2 = 0x00;
CAN0IDAR3 = 0x00;
CAN0IDAR4 = 0x00;
CAN0IDAR5 = 0x00;
CAN0IDAR6 = 0x00;
CAN0IDAR7 = 0x00;
//Config CAN0IDMR0-7 register
CAN0IDMR0 = 0xff;
CAN0IDMR1 = 0xff;
CAN0IDMR2 = 0xff;
CAN0IDMR3 = 0xff;
CAN0IDMR4 = 0xff;
CAN0IDMR5 = 0xff;
CAN0IDMR6 = 0xff;
CAN0IDMR7 = 0xff;
//=======================
//Exit Initialization Mode Request
CAN0CTL0_INITRQ = 0;
while(CAN0CTL1_INITAK==1); //wait for exit initialization mode
//CAN0RFLG |= 254; //Reset error flags
//CAN0 Interrupts Enable
CAN0RIER = 0x01; //RxFIE=1; others=0
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -