发表于:2003-07-13 02:40:00
9楼
一个初始化SJA1000 CAN控制器的样本,希望能有所帮助。
初始化CAN控制器
描述 : 1)接收广播地址: 0xFF;
2)接收本机地址: Node;
3)总线速率 : 1M bit/s at 24 MHz
参数 : 无.
返回 : CAN_NO_ERR : 初始化操作成功.
CAN_ERR_INIT : 初始化操作失败.
INT8U CanInit (void)
{
/* 设置SJA100T进入复位模式 */
while ((ModeControlReg & RM_RR_Bit ) == 0x00) {
ModeControlReg = ModeControlReg | RM_RR_Bit ;
if (timeout-- == 0) {
return (CAN_ERR_INIT);
}
}
/* 设置PeliCAN 模式,关闭输入比较器,关闭时钟输出Pin. */
ClockDivideReg = CANMode_Bit | CBP_Bit | ClkOff_Bit;
InterruptEnReg = 0x00; /* 禁止CAN控制器中断. */
/*------------------------------ 滤波器分组1: 接收广播地址 0xFF -----------------------------------*/
AcceptCode0 = 0xFF;
AcceptCode1 = 0xFF;
AcceptMask0 = 0xFF;
AcceptMask1 = 0x00;
/*------------------------------ 滤波器分组2: 接收本机地址 CANNode --------------------------------*/
AcceptCode2 = 0xFF;
AcceptCode3 = Module.ID;
AcceptMask2 = 0xFF;
AcceptMask3 = 0x00;
/* 设置总线速率为1M bit/s @ 24 MHz,采样为一次. */
BusTiming0Reg = SJW_1MB_24M | Presc_1MB_24M;
BusTiming1Reg = TSEG2_1MB_24M | TSEG1_1MB_24M;
OutControlReg = Tx1Float | Tx0PshPull | NormalMode; /* 设置TX1浮空,TX0推挽,正常输出方式. */
timeout = 2000;
/*------------ 设置: 清除复位bit; 选择双过滤器模式; 关闭自检测模式,只听模式,休眠模式. -------------*/
do{
ModeControlReg = 0x00;
if (timeout-- == 0) {
return (CAN_ERR_INIT);
}
}
while ((ModeControlReg & RM_RR_Bit ) != 0x00);
InterruptEnReg = 0xFF; /* 开启SJA100T中断. */
EX0 = 1; /* 开放CAN通讯中断. */
return (CAN_NO_ERR);
}