Board logo

标题: [求助]9s12DG128,无法进入CAN接收中断! [打印本页]

作者: jpzy216    时间: 2007-6-19 18:30     标题: [求助]9s12DG128,无法进入CAN接收中断!

我在用9s12DG128芯片做一个CAN收发的实验,CAN发送正常,但是无法正常接收!


现象是,用BDM在线仿真的时候,将程序LOAD到芯片中,全速运行会弹出illegal_BP的提示!如果设置屏蔽码,将所有CAN总线上的包都滤掉(也就是没有数据进入接收缓冲区,也就是无法触发接收中断),则程序可以正常运行,一旦有数据包进入,就会弹出错误提示!另外,我在接收中断中对一个IO口进行了取反操作,如果正确运行了中断,则应该用示波器可以在这个IO口上看到一个方波,现在是无论怎么样都没有看到方波产生!


CAN初始化的时候,设置了“CAN0RIER=0x01”,在中断中也设置了清除标志位:“CAN0RFLG =0x01”!


调了一下午了,一点进展也没有,谁能给我点提示啊!是不是我的接收中断设置的不对啊!?

[此贴子已经被作者于2007-6-19 18:30:47编辑过]


作者: strongchen    时间: 2007-6-20 09:50

中断程序是否写入了非分页地址?
作者: jpzy216    时间: 2007-6-20 11:04

对不起,我刚接触飞思卡尔的芯片,处于起步阶段,不是很懂!
这是我的代码!

#include /* common defines and macros */
#include /* derivative information */


#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

byte canid[4];
byte candata[8];
byte canlength;

byte canrxflag;
byte cansel;

byte i;


void MSCAN0_Init(void);

void main(void) {
/* put your own code here */

DisableInterrupts;

for(i=0;i<4;i++)
canid=0;

for(i=0;i<8;i++)
candata=0;

canlength = 0;
canrxflag = 0;

MSCAN0_Init();

EnableInterrupts;

for(;;)
{
//if(canrxflag == 1)
{
canrxflag = 0;

CAN0TBSEL = CAN0TFLG; /*select one available transmit buffer*/

cansel = CAN0TBSEL;

CAN0TXIDR0 = 0x07; /*DP256:0x11; AG60:0x33; GZ16:0x22; MPC555:0x44*/
CAN0TXIDR1 = 0x98; /*Extended ID*/
CAN0TXIDR2 = 0x05;
CAN0TXIDR3 = 0x00;

/*
CAN4TXDSR0 = candata[0];
CAN4TXDSR1 = candata[1];
CAN4TXDSR2 = candata[2];
CAN4TXDSR3 = candata[3];
CAN4TXDSR4 = candata[4];
CAN4TXDSR5 = candata[5];
CAN4TXDSR6 = candata[6];
CAN4TXDSR7 = candata[7];
*/

CAN0TXDSR0 = 0;
CAN0TXDSR1 = 1;
CAN0TXDSR2 = 2;
CAN0TXDSR3 = 3;
CAN0TXDSR4 = 4;
CAN0TXDSR5 = 5;
CAN0TXDSR6 = 6;
CAN0TXDSR7 = 7;

CAN0TXDLR = 8;
CAN0TXTBPR = 0;

CAN0TFLG = cansel;

i++;

}
}
}


void MSCAN0_Init(void)
{
CAN0CTL1 = 0x87;

CAN0BTR0 = 0x43; /*CAN0BTR0 = 0x43; set SJW=2, Prescaler value=4*/
CAN0BTR1 = 0xF6; /*CAN0BTR1 = 0xF6; set TSEG2=8,TSEG1=7 Bit Rate=250k*/

CAN0IDAC = 0x00;

CAN0IDAR0 = 0xB7;
CAN0IDAR1 = 0x9E;
CAN0IDAR2 = 0x01;
CAN0IDAR3 = 0x40;


CAN0IDMR0 = 0x00; /*no filter,define to accept all coming message*/
CAN0IDMR1 = 0x00;
CAN0IDMR2 = 0x00;
CAN0IDMR3 = 0x00;

/*
CAN4IDMR4 = 0xFF;
CAN4IDMR5 = 0xFF;
CAN4IDMR6 = 0xFF;
CAN4IDMR7 = 0xFF;
*/

CAN0CTL0_INITRQ = 0; /*enable normal operation mode*/

while(CAN0CTL1_INITAK != 0)
{
}

CAN0CTL0_TIME = 1; /*enable internal timer*/
//CAN4CTL0_WUPE = 1; /*WAKE UP enable*/

CAN0RIER = 0x01; /*only enable receive buffer full interrupt*/
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
#pragma TRAP_PROC

void interrupt 34 MSCAN0_RX(void)
{

canid[0] = CAN0RXIDR0;
canid[1] = CAN0RXIDR1;
canid[2] = CAN0RXIDR2;
canid[3] = CAN0RXIDR3;

candata[0]= CAN0RXDSR0;
candata[1] = CAN0RXDSR1;
candata[2] = CAN0RXDSR2;
candata[3] = CAN0RXDSR3;
candata[4] = CAN0RXDSR4;
candata[5] = CAN0RXDSR5;
candata[6] = CAN0RXDSR6;
candata[7] = CAN0RXDSR7;

canlength = CAN0RXDLR;

canrxflag = 1;

CAN0RFLG = 0x01;
}

#pragma CODE_SEG DEFAULT
作者: strongchen    时间: 2007-6-20 11:47

#pragma TRAP_PROC这一句可以去掉。
另外,CAN0接收中断号似乎不是34,而应该是37。
作者: jpzy216    时间: 2007-6-20 12:03

改成37也是一样~!就是,CAN总线上没有包的时候,程序可以运行,一有包发送(现在接收端是全接收状态),接收端的仿真器就会出现“other BGND 0 illegal_BP”的提示!
我就是完全按照DEMO里面写的,不知道为什么会出现这样的问题!!
作者: yang2311    时间: 2007-6-20 12:07

我也遇到类似问题,恳请版主指点
作者: strongchen    时间: 2007-6-20 13:52

看一下MAP文件里,CAN0接收中断是否分配了正确的地址。
作者: jpzy216    时间: 2007-6-20 14:16

谢谢版主的解答!
不过我不明白,map文件有两个,一个是P&E,一个是simulator,我应该看哪个呢?
CAN0接收中断的正确地址应该是多少呢?!
作者: jpzy216    时间: 2007-6-20 14:49

我的P&E文件里有这样的一段:

********************************************************************************
VECTOR-ALLOCATION SECTION
Address InitValue InitFunction
--------------------------------------------------------------------------------
0xFFFE 0xC000 _Startup

********************************************************************************

而另外一个DEMO里面是这样的,

********************************************************************************
VECTOR-ALLOCATION SECTION
Address InitValue InitFunction
--------------------------------------------------------------------------------
0xFFB2 0xC06B MSCAN0Rec
0xFFD6 0xC044 SCI0_REC
0xFFF0 0xC14D RTI_ISR
0xFFFE 0xC000 _Startup

********************************************************************************

这里面的MSCAN0Rec就是接收中断了!
请问这是怎么设置的??
作者: jpzy216    时间: 2007-6-20 15:38

用仿真器在线运行,出现illegal_BP提示后,查看CAN0口的各个寄存器的状态,发现CAN0RFLG的第二位,OVRIF=1;CAN0RFLG在初始化已经设置成0x01了!
这一位为什么会变成1呢?
版主,谢谢你帮帮我啊~~~~~~~~~
作者: strongchen    时间: 2007-6-20 16:13

CAN0的接收中断地址应该为0xFFB2。这在数据手册上可以查到的。如果你用硬件调试,则用P&E的MAP文件。CAN0的中断标志应该在初时化之后,允许中断之前清一次。
作者: jpzy216    时间: 2007-6-20 16:17

那map文件是不是可以自己修改啊?
我是不是直接把上面那一行复制进去就行了啊?
中断标志位是CAN0RFLG吗?
是不是要在初始化最后清一下啊!!
作者: strongchen    时间: 2007-6-20 16:20

MAP文件是编译链接后生成的报告文件,修改它是没有作用的。
作者: jpzy216    时间: 2007-6-20 16:24

那我怎么把CAN中断的接收地址写进去啊?

还有,我刚才执行了一下,发现CAN数据已经进入了接收缓冲区了,但是中断无法执行!!

是不是数据到了缓冲区了,应该中断的接收地址就没有问题啊!
作者: strongchen    时间: 2007-6-20 16:41

这是两回事。改变中断号就可改变中断地址了。MAP文件里应该有的,仔细搜索一下。
作者: jpzy216    时间: 2007-6-20 17:04

太谢谢版主了~!问题解决了,中断号是38!
现在已经没有illegal_BP的提示了,在中断里面打断点,也能执行了,可以看到CANDATA里面已经接收到了我所发送的数了!!
估计接收这里应该不会再有问题了!!
谢谢版主,真心的谢谢你的帮助!!!
作者: jpzy216    时间: 2007-6-20 17:11

对了,还有事情麻烦版主!您的数据手册是在哪弄到的?
方便的话给我发一份好吗?或者给个下载链接!
我的邮箱是jpzy216621@163.com!
很希望能跟版主成为朋友!我还有很多问题要请教您呢!
作者: strongchen    时间: 2007-6-20 17:12

不客气。数中断号确实容易出错。所以我一般推荐在PRM文件中定义中断地址的方式。在写中断函数时不要写中断号,在PRM文件中可以这样定义:

VECTOR ADDRESS 0xFFB2 MSCAN0_RX
作者: jpzy216    时间: 2007-6-20 17:38

太谢谢了!!数据手册的问题还能帮我吗??
作者: strongchen    时间: 2007-6-21 09:44

数据手册在飞思卡尔网站的DG128主页里就可以下载到。
作者: scs_iloveyou    时间: 2007-7-23 20:40

我也在为类似的问题烦神
劳烦strongchen解答呀!!!!~~~~~~~
谢谢神一般的人物指点!~
哈~~~
作者: jianw007    时间: 2007-8-3 09:54

楼上的,不要搞个人崇拜...
哈哈,strong是好人.
作者: lchx320    时间: 2011-7-28 15:23

CAN0接收中断号为38 其它是错的




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0