📄 can.h
字号:
void CAN_init()
{
*MCRB |= 0x00C0;//使能CANRX和CANTX
*CANIFR = 0xFFFF;//清除所有CAN中断标志
//邮箱0,1的接收屏蔽寄存器(设置为全0xFFFF为全部接收)
*CANLAM0H = 0xFFFF;
*CANLAM0L = 0xFFFF;
//邮箱2,3的接收屏蔽寄存器(设置为全0xFFFF为全部接收)
*CANLAM1H = 0xFFFF;
*CANLAM1L = 0xFFFF;
//----------------------- 设置波特率 -------------------------------
*CANMCR = 0X1040; //CAN控制器进入复位模式 排序0~7
while( *CANGSR&0X0010 == 0 ) continue;
//计算方法:(Page 249)
//波特率 = CAN控制器的时钟频率/[(CAN波特率预分频系数+1)*(TSEG1+TSEG2+3)]
//在这里:
// CAN控制器的时钟频率 = CPU时钟频率*PLL倍频系数,在*SCSR1里面设置
// CAN波特率预分频系数 = *CANBCR2
// 这样可以计算出 TSEG1和TSEG2 ,有的时候它们两个的值可以有多种组合。
//在波特率是250kbps的时候:可以这样设置
// PLL倍频系数是1时,*CANBCR2=0X0001,*CANBCR1=0X007E
// PLL倍频系数是2时,*CANBCR2=0X0003,*CANBCR1=0X007E
// PLL倍频系数是4时,*CANBCR2=0X0007,*CANBCR1=0X007E
*CANBCR2=0X0007; //设置波特率预分频
*CANBCR1=0X007E; //设置波特率250Kbps
*CANMCR &= 0XEFFF; //CAN控制器进入正常工作模式
while( *CANGSR&0X0010 != 0 ) continue;
//-----------------------------------------------------------------------
*CANMCR= 0x0480;// (Page 246)
*CANMDER = 0x0040;//0,1,2接收;3,4,5发送。禁止全部6个邮箱。
*CANMCR |= 0x0100; //改变数据域请求:CDR = 1;
//----------- 邮箱0 -----------
*CANMSGID0H = 0xC000;
*CANMSGID0L = 0x0000;
*CANMSGCTRL0 = 0x0008;
//----------- 邮箱1 -----------
*CANMSGID1H = 0xC000;
*CANMSGID1L = 0x0000;
*CANMSGCTRL1 = 0x0008;
//----------- 邮箱2 -----------
*CANMSGID2H = 0xC000;
*CANMSGID2L = 0x0000;
*CANMSGCTRL2 = 0x0008;
//----------- 邮箱3 -----------
*CANMSGID3H = 0xC000;
*CANMSGID3L = 0x0000;
*CANMSGCTRL3 = 0x0008;
//----------- 邮箱4 -----------
*CANMSGID4H = 0xC000;
*CANMSGID4L = 0x0000;
*CANMSGCTRL4 = 0x0008;
//----------- 邮箱5 -----------
*CANMSGID5H = 0xC000;
*CANMSGID5L = 0x0000;
*CANMSGCTRL5 = 0x0008;
*CANMCR &= ~0x0100;
*CANMDER = 0x007F;//0,1,2接收;3,4,5发送。使能全部6个邮箱。(注意:如果要修改发送邮箱和接收邮箱的个数,需要同时修改接收和发送历程)
// *CANIMR=0X077F; //使能接收高优先级中断,使能全部错误高优先级中断
*CANIMR=0X0700; //使能接收高优先级中断,使能全部错误高优先级中断
*CANIFR=0XFFFF; //清除中断标志
}
UCHAR CAN_Send_Data(UCHAR MailBox_Index,ULONG ID,UCHAR Data_length,UCHAR *data)//只处理扩展帧,数据帧
{
UINT offset = 0;
UCHAR i = 0;
static UCHAR LED_data = 0;
offset = MailBox_Index<<3;
if(MailBox_Index < 3)//确认选择的是发送邮箱
return 1;
*CANMDER &= ~(0x0001<<MailBox_Index); //禁止邮箱
*CANMCR |= 0x0100; //改变数据域请求:CDR = 1;
*(CANMSGID0H + offset)=(((UINT)(ID>>16))&0x1FFF) + 0x8000;
*(CANMSGID0L + offset)=(UINT)ID;
*(CANMSGCTRL0 + offset)=Data_length;
for(i=0;i<Data_length;i=i+2)
*(CANMBX0A + offset + i/2)=(((UINT)data[i])&0x00FF) + ((((UINT)data[i+1])<<8)&0xFF00);
*CANMCR &= ~0x0100;
*CANMDER |= 0x0001<<MailBox_Index; //使能邮箱
*CANTCR |= (0x0001<<(MailBox_Index+2)); //发送!
while(*CANTCR & (0x0001<<(MailBox_Index+2)) == 0)//这个地方是不是可以考虑修改,提高执行速度?
continue;
*CANTCR |= (0x0100<<(MailBox_Index+2));
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -