📄 initcan4.c
字号:
#include <mc9s12dg128.h>
/*****************************
Structure Declaration
*****************************/
typedef struct{
byte id[4];
byte data[8];
byte length;
byte prio;
}candata;
/*****************************
function prototype
*****************************/
void Init_CAN4(void);
void Init_CAN4(void) {
//locate CAN4 port to
//MODRR[3] MODRR[2] RXCAN4 TXCAN4
// 0 0 PJ6 PJ7
// 0 1 PM4 PM5
// 1 0 PM6 PM7
MODRR_MODRR2 = 1;
MODRR_MODRR3 = 0;
//Initialization Mode Request
CAN4CTL0_INITRQ = 1;
//Congfig CAN4CTL1 register
CAN4CTL1_CANE = 1; //enable msCAN module 1:enabled 0:disabled
CAN4CTL1_CLKSRC = 0; //Clock Source 1:Bus 0:OSC
CAN4CTL1_LOOPB = 0; //Loop Back Self Test Mode 1:enabled 0:disabled
CAN4CTL1_LISTEN = 0; //Listen Only Mode 1:Listen Only 0:Normal Mode
CAN4CTL1_WUPM = 0; //Wake-Up Mode 1:>Twup 0:Any Signal wake up
//=======================
//Config CAN4 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 CAN4BTR0 register
CAN4BTR0_BRP = 7; //Baud Rate Prescaler(Prescaler=BRP+1=4 16M_OSC-->4M)
CAN4BTR0_SJW = 1; //SJW = (SJW+1)*Tq = 2*Tq
//Config CAN4BTR1 register
CAN4BTR1_SAMP = 1; //Sampling 1: 3 samples 0:1 sample per bit
CAN4BTR1_TSEG_10= 6; //Tseg1=6+1=7
CAN4BTR1_TSEG_20= 7; //Tseg2=7+1=8
//=======================
//Config CAN4 Filiter
//=======================
//Config CAN4IDAC register
//MSCAN Identifier Acceptance Control Register
CAN4IDAC_IDAM0 = 0; //00:2*32bit 01:4*16bit
CAN4IDAC_IDAM1 = 0; //10:8*8bit 11:closed,no message is acceped
//Config CAN4IDAR0-7 register
CAN4IDAR0 = 0x00;
CAN4IDAR1 = 0x00;
CAN4IDAR2 = 0x00;
CAN4IDAR3 = 0x00;
CAN4IDAR4 = 0x00;
CAN4IDAR5 = 0x00;
CAN4IDAR6 = 0x00;
CAN4IDAR7 = 0x00;
//Config CAN4IDMR0-7 register
CAN4IDMR0 = 0xff;
CAN4IDMR1 = 0xff;
CAN4IDMR2 = 0xff;
CAN4IDMR3 = 0xff;
CAN4IDMR4 = 0xff;
CAN4IDMR5 = 0xff;
CAN4IDMR6 = 0xff;
CAN4IDMR7 = 0xff;
//=======================
//Exit Initialization Mode Request
CAN4CTL0_INITRQ = 0;
while(CAN4CTL1_INITAK==1); //wait for exit initialization mode
//CAN0RFLG |= 254; //Reset error flags
//CAN4 Interrupts Enable
CAN4RIER = 0x01; //RxFIE=1; others=0
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -