中级会员
 
- 积分
- 446
- 金钱
- 446
- 注册时间
- 2011-11-15
- 在线时间
- 4 小时
|

楼主 |
发表于 2012-4-5 14:02:29
|
显示全部楼层
参数:usBaudRate为要设的波特率,stInit是一个结构体
unsigned char sj,p;
unsigned char t_seg1, t_seg2;
unsigned char BRP = stInit.ucBaudRate;
unsigned int uiDMR = 0, uiDAR = 0;
//使能CAN
CANCTL1_CANE = 1;
//进入初始化模式
if (!(CANCTL1&0x01))
CANCTL0 =0x01;
// 确认是否进入初始化模式
while (!(CANCTL1&0x01));
//********************* 设置ID过滤器****************************************
switch(stInit.ucFilterMode)
{
case 0:
{ // Disables all the Filters
CANIDMR0 = 0xFF;
CANIDMR1 = 0xFF;
CANIDMR2 = 0xFF;
CANIDMR3 = 0xFF;
CANIDMR4 = 0xFF;
CANIDMR5 = 0xFF;
CANIDMR6 = 0xFF;
CANIDMR7 = 0xFF;
break;
}
case 1:
{
//Abales Filter0;
CANIDAC_IDAM0 = 1;
CANIDAC_IDAM1 = 0;
if(stInit.uiFilterID1 == 0 || stInit.uiFilterID2 == 0)
{
uiDAR = stInit.uiFilterID1 | stInit.uiFilterID2;
uiDMR = 0;
}
else
{
uiDAR = stInit.uiFilterID1;
uiDMR = stInit.uiFilterID1 ^ stInit.uiFilterID2;
}
CANIDAR0 = (unsigned char)(uiDAR >> 3);
CANIDAR1 = (uiDAR & 0x07) << 5;
CANIDMR0 = (unsigned char)(uiDMR >> 3);
CANIDMR1 = ((uiDMR & 0x07) << 5) | 0x1f;
CANIDAR2 = 0;
CANIDAR3 = 0;
CANIDMR2 = 0x00;
CANIDMR3 = 0x1f;
if(stInit.uiFilterID3 == 0 || stInit.uiFilterID4 == 0)
{
uiDAR = stInit.uiFilterID3 | stInit.uiFilterID4;
uiDMR = 0;
}
else
{
uiDAR = stInit.uiFilterID3;
uiDMR = stInit.uiFilterID3 ^ stInit.uiFilterID4;
}
CANIDAR4 = (unsigned char)(uiDAR >> 3);
CANIDAR5 = (uiDAR & 0x07) << 5;
CANIDMR4 = (unsigned char)(uiDMR >> 3);
CANIDMR5 = ((uiDMR & 0x07) << 5) | 0x1f;
CANIDAR6 = 0;
CANIDAR7 = 0;
CANIDMR6 = 0x00;
CANIDMR7 = 0x1f;
break;
}
}
//设置波特率
switch(usBaudRate)
{
case BAUDRATE_50K:
sj=(SJW_50K-1)<<6;
p=(PRE_50K-1);
t_seg1=(T_SEG1_50K-1);
t_seg2=(T_SEG2_50K-1)<<4;
break;
case BAUDRATE_100K:
sj=(SJW_100K-1)<<6;
p=(PRE_100K-1);
t_seg1=(T_SEG1_100K-1);
t_seg2=(T_SEG2_100K-1)<<4;
break;
case BAUDRATE_125K:
sj=(SJW_125K-1)<<6;
p=(PRE_125K-1);
t_seg1=(T_SEG1_125K-1);
t_seg2=(T_SEG2_125K-1)<<4;
break;
case BAUDRATE_250K:
sj=(SJW_250K-1)<<6;
p=(PRE_250K-1);
t_seg1=(T_SEG1_250K-1);
t_seg2=(T_SEG2_250K-1)<<4;
break;
case BAUDRATE_500K:
sj=(SJW_500K-1)<<6;
p=(PRE_500K-1);
t_seg1=(T_SEG1_500K-1);
t_seg2=(T_SEG2_500K-1)<<4;
break;
case BAUDRATE_800K:
sj=(SJW_800K-1)<<6;
p=(PRE_800K-1);
t_seg1=(T_SEG1_800K-1);
t_seg2=(T_SEG2_800K-1)<<4;
break;
case BAUDRATE_1000K:
sj=(SJW_1000K-1)<<6;
p=(PRE_1000K-1);
t_seg1=(T_SEG1_1000K-1);
t_seg2=(T_SEG2_1000K-1)<<4;
break;
default:
break;
}
//选择时钟源
CANCTL1_CLKSRC=0;
// 设置SJW和Tq clock分频器
CANBTR0 = (sj|p);
// 设置时间段1和时间段2
CANBTR1 = (t_seg1 | t_seg2);
CANCTL1 = 0x84; // 设置CAN的loop功能
if(stInit.ucLoopEnable == 1)
CANCTL1_LOOPB = 1;
else
CANCTL1_LOOPB = 0;
CANCTL0 = 0x00; // 让CAN进入正常运行模式
while(CANCTL1&0x01); // 确认CAN进入正常模式
while(!(CANCTL0&0x10)); //等待CAN同步
CANRIER_RXFIE = 1; // 使能接收中断 |
|