📄 mycan.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12d64.h> /* derivative information */
/*采用9S12D64实现的CAN,发送时while(1){CAN_Transmit();}可实现发送,接收时用中断,接受ID=2的扩展贞,接受的字符用串口发送到计算机显示*/
#define CAN_BUFFER_LNG 64
uchar CANReceive[CAN_BUFFER_LNG];
char i;
uchar mask;
/* MSCAN初始化*/
void MSCAN_init(void)
{ CAN0CTL1_CANE = 1;
CAN0CTL0_INITRQ = 1;
while(CAN0CTL1_INITAK!=1);
CAN0CTL1_CLKSRC = 0; /* 选择晶振频率 */
CAN0CTL1_LOOPB = 0;
CAN0CTL1_LISTEN = 0;
/* 用4M晶振100 kb rate */
CAN0BTR0_SJW =1; /* SJW=2tq*/
CAN0BTR0_BRP =1; /* 分频 2 */
CAN0BTR1_SAMP =0; /* one sample per bit */
CAN0BTR1_TSEG_20 =6; /* Tseg2=7 */
CAN0BTR1_TSEG_10 =11; /* Tseg1=12 */
CAN0IDAC = 0; /* two 32bit acceptance filter*/
/*下面仅配置为接受ID=02的扩展贞格式,此时Hit 0 命中,但对于ID=0的标准贞也接受,此时Hit 1命中*/
CAN0IDAR0 =0x00;
CAN0IDAR1 =0x00;
CAN0IDAR2 =0x00;
CAN0IDAR3 =0x04; //接受ID=2
CAN0IDMR0 = 0x00;
CAN0IDMR1 =0x18;//屏蔽SRR和IDE
CAN0IDMR2 = 0x00;
CAN0IDMR3 = 0x01;//屏蔽RTR
CAN0IDAR4 =0x00;//注意:如果标准贞ID设为1000,则也可接收到,因为1000已超出11位,所以此时的ID也为0
CAN0IDAR5 =0x00;
CAN0IDAR6 =0x00;
CAN0IDAR7 =0x00;
CAN0IDMR4 = 0x00;
CAN0IDMR5 = 0x00;
CAN0IDMR6 = 0x00;
CAN0IDMR7 = 0x00;
CAN0CTL0_INITRQ = 0;
while(CAN0CTL1_INITAK!=0);
CAN0RIER_RXFIE = 1; /* 接收中断使能,禁止发送中断 */
CAN0TIER = 0;
}
uchar CAN_Transmit(void)
{
mask = CAN0TFLG;
CAN0TBSEL= mask;
mask = CAN0TBSEL;
CAN0TXIDR0 = 0x00;
CAN0TXIDR1 = 0x08; //扩展桢
CAN0TXIDR2 = 0x00;
CAN0TXIDR3 = 0x04; //发送ID=2
CAN0TXDSR0 = 200;
CAN0TXDSR1 = 212;
CAN0TXDSR2 = 111;
CAN0TXDSR3 = 23;
CAN0TXDSR4 = 89;
CAN0TXDSR5 = 155;
CAN0TXDSR6 = 199;
CAN0TXDSR7 = 0;
CAN0TXDLR = 0x08;
CAN0TXTBPR = 0x00;
CAN0TFLG = mask;
return mask;
}
/* MSCAN 接收中断*/
/*中断入口: VECTOR ADDRESS 0XFFB2 CANReceive_ISR*/
interrupt void CANReceive_ISR(void) {
if (CAN0RXIDR1_IDE)
{
CANReceive[0]=CAN0RXIDR0; /* 扩展29位 */
CANReceive[1]=CAN0RXIDR1;
CANReceive[2]=CAN0RXIDR2;
CANReceive[3]=CAN0RXIDR3;
CANReceive[4]=CAN0RXDLR&0x0F;
CANReceive[5]=CAN0RXDSR0;
CANReceive[6]=CAN0RXDSR1;
CANReceive[7]=CAN0RXDSR2;
CANReceive[8]=CAN0RXDSR3;
CANReceive[9]=CAN0RXDSR4;
CANReceive[10]=CAN0RXDSR5;
CANReceive[11]=CAN0RXDSR6;
CANReceive[12]=CAN0RXDSR7;
}
else
{
CANReceive[0]=CAN0RXIDR0; /* 标准11位 */
CANReceive[1]=CAN0RXIDR1;
CANReceive[2]=CAN0RXDLR&0x0F;
CANReceive[3]=CAN0RXDSR0;
CANReceive[4]=CAN0RXDSR1;
CANReceive[5]=CAN0RXDSR2;
CANReceive[6]=CAN0RXDSR3;
CANReceive[7]=CAN0RXDSR4;
CANReceive[8]=CAN0RXDSR5;
CANReceive[9]=CAN0RXDSR6;
CANReceive[10]=CAN0RXDSR7;
}
for(i=0;i<13;i++){
sprintf(buf,"%d\n",CANReceive[i]);TransmitT(buf);}
CAN0RFLG_RXF=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -