发表于:2003-10-13 10:29:00
6楼
SJA1000在硬件复位的时候就处于BasicCAN复位模式,测试确认为复位模式之后,如果要进入到PeliCAN模式,则需要操作ClockDivideReg
寄存器模式控制位,因为ClockDivideReg寄存器的改写必须在复位模
式状态下才可写数据,所以初始化过程是先给地址0赋值,再给CDR赋
值选择用BasicCAN模式还是PeliCAN模式
一个8051下的SJA1000初试化例子:
/*
*********************************************************************************************************
* 初始化CAN控制器
*
* 描述 : 1)接收广播地址: 0xFF;
* 2)接收本机地址: Node;
* 3)总线速率 : 1M bit/s at 24 MHz
* 参数 : 无.
* 返回 : CAN_NO_ERR : 初始化操作成功.
* CAN_ERR_INIT : 初始化操作失败.
*********************************************************************************************************
*/
INT8U CanInit (void) reentrant
{
INT16U timeout;
timeout = 2000;
/*--------------------------------- 设置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);
}