[求助]9s12DG128,无法进入CAN接收中断!
- UID
- 344043
- 性别
- 男
|
[求助]9s12DG128,无法进入CAN接收中断!
我在用9s12DG128芯片做一个CAN收发的实验,CAN发送正常,但是无法正常接收!
现象是,用BDM在线仿真的时候,将程序LOAD到芯片中,全速运行会弹出illegal_BP的提示!如果设置屏蔽码,将所有CAN总线上的包都滤掉(也就是没有数据进入接收缓冲区,也就是无法触发接收中断),则程序可以正常运行,一旦有数据包进入,就会弹出错误提示!另外,我在接收中断中对一个IO口进行了取反操作,如果正确运行了中断,则应该用示波器可以在这个IO口上看到一个方波,现在是无论怎么样都没有看到方波产生!
CAN初始化的时候,设置了“CAN0RIER=0x01”,在中断中也设置了清除标志位:“CAN0RFLG =0x01”!
调了一下午了,一点进展也没有,谁能给我点提示啊!是不是我的接收中断设置的不对啊!?
[此贴子已经被作者于2007-6-19 18:30:47编辑过] |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
对不起,我刚接触飞思卡尔的芯片,处于起步阶段,不是很懂!
这是我的代码!
#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 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
#pragma TRAP_PROC这一句可以去掉。
另外,CAN0接收中断号似乎不是34,而应该是37。 |
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
改成37也是一样~!就是,CAN总线上没有包的时候,程序可以运行,一有包发送(现在接收端是全接收状态),接收端的仿真器就会出现“other BGND 0 illegal_BP”的提示!
我就是完全按照DEMO里面写的,不知道为什么会出现这样的问题!! |
|
|
|
|
|
- UID
- 344047
- 性别
- 男
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
看一下MAP文件里,CAN0接收中断是否分配了正确的地址。 |
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
谢谢版主的解答!
不过我不明白,map文件有两个,一个是P&E,一个是simulator,我应该看哪个呢?
CAN0接收中断的正确地址应该是多少呢?! |
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
我的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就是接收中断了!
请问这是怎么设置的?? |
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
用仿真器在线运行,出现illegal_BP提示后,查看CAN0口的各个寄存器的状态,发现CAN0RFLG的第二位,OVRIF=1;CAN0RFLG在初始化已经设置成0x01了!
这一位为什么会变成1呢?
版主,谢谢你帮帮我啊~~~~~~~~~ |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
CAN0的接收中断地址应该为0xFFB2。这在数据手册上可以查到的。如果你用硬件调试,则用P&E的MAP文件。CAN0的中断标志应该在初时化之后,允许中断之前清一次。 |
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
那map文件是不是可以自己修改啊?
我是不是直接把上面那一行复制进去就行了啊?
中断标志位是CAN0RFLG吗?
是不是要在初始化最后清一下啊!! |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
MAP文件是编译链接后生成的报告文件,修改它是没有作用的。 |
|
|
|
|
|
- UID
- 344043
- 性别
- 男
|
那我怎么把CAN中断的接收地址写进去啊?
还有,我刚才执行了一下,发现CAN数据已经进入了接收缓冲区了,但是中断无法执行!!
是不是数据到了缓冲区了,应该中断的接收地址就没有问题啊! |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
这是两回事。改变中断号就可改变中断地址了。MAP文件里应该有的,仔细搜索一下。 |
|
|
|
|
|