初级会员

- 积分
- 51
- 金钱
- 51
- 注册时间
- 2013-12-18
- 在线时间
- 5 小时
|

楼主 |
发表于 2014-4-29 11:11:37
|
显示全部楼层
void CAN_TX(void)
{
u32 id=0x400; //id = 100 0000 0000
CAN->sTxMailBox[0].TIR=0; //清除之前的设置
id<<=21;
CAN->sTxMailBox[0].TIR|=id;
CAN->sTxMailBox[0].TDTR&=0xFFFFFFF0;
CAN->sTxMailBox[0].TDTR|=8; //设置字节长度DLC.
//待发送数据存入邮箱.
CAN->sTxMailBox[0].TDHR= (((u32)can4_tx22[7]<<24)|
((u32)can4_tx22[6]<<16)|
((u32)can4_tx22[5]<<8)|
((u32)can4_tx22[4]));
CAN->sTxMailBox[0].TDLR= (((u32)can4_tx22[3]<<24)|
((u32)can4_tx22[2]<<16)|
((u32)can4_tx22[1]<<8)|
((u32)can4_tx22[0]));
CAN->sTxMailBox[0].TIR|=1; //请求发送邮箱数据
}
u8 CAN_init(void)
{
u8 sjw,bs1,bs2;
u16 brp,i=0;
sjw = ( 3 -1);
bs1 = ( 6 -1);
bs2 = ( 5 -1);
brp = (36 -1);
CAN->MCR =0x0000; //退出睡眠模式(同时设置所有位为0)
CAN->MCR|=1; //请求CAN进入初始化模式
while((CAN->MSR&1)==0)
{
i++;
if(i>65535)return 1;//进入初始化模式失败
}
CAN->MCR|=0x00000011; //禁止报文自动传送
CAN->BTR =0x00000000;//清除原来的设置.
CAN->BTR|=sjw<<24; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位
CAN->BTR|=bs2<<20; //Tbs2=tbs2+1个时间单位
CAN->BTR|=bs1<<16; //Tbs1=tbs1+1个时间单位
CAN->BTR|=brp<<0; //分频系数(Fdiv)为brp+1
//波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv)
CAN->MCR&=~(1<<0); //请求CAN退出初始化模式
while((CAN->MSR&1<<0)==1)
{
i++;
if(i>65535)return 2;//退出初始化模式失败
}
//过滤器初始化
CAN->FMR |= 0x00000001; //过滤器组工作在初始化模式
CAN->FA1R&=~(0x00000001<<0); //过滤器0不激活
CAN->FS1R|= (0x00000001<<0); //过滤器0位宽为32位.
CAN->sFilterRegister[0].FR1=0X00800000;//32位ID
CAN->sFilterRegister[0].FR2=0XFFFFFFFF;//32位MASK
CAN->FM1R &=~(0x00000001<<0); //过滤器0工作在标识符屏蔽位模式
CAN->FFA1R &=~(0x00000001<<0); //过滤器0关联到FIFO0
CAN->FA1R |= (0x00000001<<0); //激活过滤器0
CAN->FMR &=~(0x00000001); //过滤器组进入正常模式
return 0;
} |
|