有关MC9S12SX128 (112硬件)芯片CAN总线滤波器设置的疑问
时间:10-02
整理:3721RD
点击:
我想要使用CAN总线滤波器来筛选自己需要的ID,但是我按照手册上设置的时候却不能正常运行。
下面是我的初始化代码
/* 初始化CAN0 */
void INIT_CAN0(void)
{
if(CAN0CTL0_INITRQ==0) // 查询是否进入初始化状态
CAN0CTL0_INITRQ =1; // 进入初始化状态
while (CAN0CTL1_INITAK==0); //等待进入初始化状态
CAN0BTR0_SJW = 0; //设置同步
CAN0BTR0_BRP = 7; //设置波特率
#if(CAN_BOUND_RATE == 500)
CAN0BTR1 = 0x14; //设置时段1和时段2的Tq个数 ,总线频率为500kb/s
#else if(CAN_BOUND_RATE == 250)
CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s
#endif
CAN0IDAC_IDAM1 = 0; //bit4= 0和bit5= 1,Four 16-bit acceptance filters
CAN0IDAC_IDAM0 = 1; //在这里我已经设置为4个十六位的滤波器,正常情况下应该能过通过四个ID的报文
//但是只能通过实际只能通过第一和第三个滤波器的两帧,我明明是按照手册设置的,很 //奇怪,然后我又将它设置为两个32位的滤波器,还是只能通过两个(通过的是标准帧),
//当我写成扩展帧的时候却一个都通过不了,崩溃
//开启全部滤波器
CAN0IDMR0 = 0x00;
CAN0IDMR1 = 0x00;
CAN0IDMR2 = 0x00;
CAN0IDMR3 = 0x00;
CAN0IDMR4 = 0x00;
CAN0IDMR5 = 0x00;
CAN0IDMR6 = 0x00;
CAN0IDMR7 = 0x00;
//对相应ID进行滤波
CAN0IDAR0 = 0x80;
CAN0IDAR1 = 0x60;
CAN0IDAR2 = 0x8D;
CAN0IDAR3 = 0x20;
CAN0IDAR4 = 0x82;
CAN0IDAR5 = 0x20;
CAN0IDAR6 = 0x82;
CAN0IDAR7 = 0x00;
CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用总线时钟源
CAN0CTL0 = 0x00; //返回一般模式运行
while(CAN0CTL1_INITAK); //等待回到一般运行模式
while(CAN0CTL0_SYNCH==0); //等待总线时钟同步
CAN0RIER_RXFIE = 1; //使能接收中断
}
下面是我的初始化代码
/* 初始化CAN0 */
void INIT_CAN0(void)
{
if(CAN0CTL0_INITRQ==0) // 查询是否进入初始化状态
CAN0CTL0_INITRQ =1; // 进入初始化状态
while (CAN0CTL1_INITAK==0); //等待进入初始化状态
CAN0BTR0_SJW = 0; //设置同步
CAN0BTR0_BRP = 7; //设置波特率
#if(CAN_BOUND_RATE == 500)
CAN0BTR1 = 0x14; //设置时段1和时段2的Tq个数 ,总线频率为500kb/s
#else if(CAN_BOUND_RATE == 250)
CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s
#endif
CAN0IDAC_IDAM1 = 0; //bit4= 0和bit5= 1,Four 16-bit acceptance filters
CAN0IDAC_IDAM0 = 1; //在这里我已经设置为4个十六位的滤波器,正常情况下应该能过通过四个ID的报文
//但是只能通过实际只能通过第一和第三个滤波器的两帧,我明明是按照手册设置的,很 //奇怪,然后我又将它设置为两个32位的滤波器,还是只能通过两个(通过的是标准帧),
//当我写成扩展帧的时候却一个都通过不了,崩溃
//开启全部滤波器
CAN0IDMR0 = 0x00;
CAN0IDMR1 = 0x00;
CAN0IDMR2 = 0x00;
CAN0IDMR3 = 0x00;
CAN0IDMR4 = 0x00;
CAN0IDMR5 = 0x00;
CAN0IDMR6 = 0x00;
CAN0IDMR7 = 0x00;
//对相应ID进行滤波
CAN0IDAR0 = 0x80;
CAN0IDAR1 = 0x60;
CAN0IDAR2 = 0x8D;
CAN0IDAR3 = 0x20;
CAN0IDAR4 = 0x82;
CAN0IDAR5 = 0x20;
CAN0IDAR6 = 0x82;
CAN0IDAR7 = 0x00;
CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用总线时钟源
CAN0CTL0 = 0x00; //返回一般模式运行
while(CAN0CTL1_INITAK); //等待回到一般运行模式
while(CAN0CTL0_SYNCH==0); //等待总线时钟同步
CAN0RIER_RXFIE = 1; //使能接收中断
}
希望大神们可以指导一下~~~
用codewarrior调试了吗,单步调试,看各个寄存器的状态
你是用板子调吗,下个手册上的例子程序,看是不是硬件原因
小伙子多看看数据手册吧,一个个对寄存器
寄存器设置不对吧