首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]9s12DG128,无法进入CAN接收中断!

[求助]9s12DG128,无法进入CAN接收中断!

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


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


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


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

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

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

#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
改成37也是一样~!就是,CAN总线上没有包的时候,程序可以运行,一有包发送(现在接收端是全接收状态),接收端的仿真器就会出现“other BGND 0 illegal_BP”的提示!
我就是完全按照DEMO里面写的,不知道为什么会出现这样的问题!!
谢谢版主的解答!
不过我不明白,map文件有两个,一个是P&E,一个是simulator,我应该看哪个呢?
CAN0接收中断的正确地址应该是多少呢?!
我的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就是接收中断了!
请问这是怎么设置的??
用仿真器在线运行,出现illegal_BP提示后,查看CAN0口的各个寄存器的状态,发现CAN0RFLG的第二位,OVRIF=1;CAN0RFLG在初始化已经设置成0x01了!
这一位为什么会变成1呢?
版主,谢谢你帮帮我啊~~~~~~~~~
那map文件是不是可以自己修改啊?
我是不是直接把上面那一行复制进去就行了啊?
中断标志位是CAN0RFLG吗?
是不是要在初始化最后清一下啊!!
那我怎么把CAN中断的接收地址写进去啊?

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

是不是数据到了缓冲区了,应该中断的接收地址就没有问题啊!
太谢谢版主了~!问题解决了,中断号是38!
现在已经没有illegal_BP的提示了,在中断里面打断点,也能执行了,可以看到CANDATA里面已经接收到了我所发送的数了!!
估计接收这里应该不会再有问题了!!
谢谢版主,真心的谢谢你的帮助!!!
对了,还有事情麻烦版主!您的数据手册是在哪弄到的?
方便的话给我发一份好吗?或者给个下载链接!
我的邮箱是jpzy216621@163.com!
很希望能跟版主成为朋友!我还有很多问题要请教您呢!
太谢谢了!!数据手册的问题还能帮我吗??
返回列表