纯新手学习DSP2407的CAN控制器,以北航出版社出版的刘和平的那本书后面的例程学习。
但是不知道为啥程序运行总是到下面这句就不往下运行了,程序运行到红色标注的那条语句就不往下走了。
求论坛里的各位大神帮忙,小弟不胜感激!!!!
下面是例程代码:
#include "f2407_c.h"
//引用头部文件
int CAN_FLAG;
//定义标志寄存器
void system_init();
//声明在程序中需要用到是函数
void CANMBX_ISR();
void CAN_INIT();
void inline disable()
{
asm(" setc INTM");
}
void inline enable()
{
asm(" clrc INTM");
}
//(1)主程序
main()
{
system_init();
//系统初始化子程序
CAN_FLAG=0x00;
//清CAN用户标志,CAN_FLAG=0表示收到数据
CAN_INIT();
//CAN初始化子程序
enable();
for(;;)
{
TCR=0x20;
//MBX3请求发送
while(TCR&0x2000==0)
//等待发送应答
continue;
TCR=0x2000;
//清TA3和MIF3标志位
while(CAN_FLAG==0)
continue;
//等待接收数据
CAN_FLAG=0x0000;
//清接收到标志
MDER=0x0000;
//邮箱不使能
MCR=0x0140;
//CDR=1,数据改变请求
MBX3A=MBX2A+1;
//邮箱3中数据加1用来更新2中的数据
MBX3B=MBX2B+1;
MBX3C=MBX2C+1;
MBX3D=MBX2D+1;
}
}
//(2) 系统初始化子程序
void system_init()
{
asm(" setc
SXM");
// 抑制符号位扩展
asm(" clrc
OVM");
// 累加器中结果正常溢出
asm(" clrc
CNF");
// B0被配置为数据存储空间
asm(" setc
INTM");
// 禁止所有中断
SCSR1=0x81FE;
// CLKIN=6M,CLKOUT=4CLKIN=24M
WDCR=0x0E8;
// 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD复位后的缺省值,故可以用
// 软件禁止看门狗
IMR=0x0010;
// 开中断优先级5
IFR=0x0FFFF;
// 清除全部中断标志,"写1清0"
}
//(3)CAN初始化子程序
void CAN_INIT()
{
MCRB=MCRB|0x0C0;
//设置IOPC6、IOPC7为CANRX,CANTX
CAN_IFR=0x0FFFF;
//清所有中断标志
LAM1_H=0x7FFF;
//设置邮箱3、2的屏蔽ID寄存器
LAM1_L=0x0FFFF;
//0则ID必须匹配
MCR=0x1040;
//CCR=1改变配置请求
while(GSR&0x0010==0) continue;
//CCE=1时即可配置BCR2、BCR1寄存器
BCR2=0x01;
//波特率预分频寄存器
BCR1=0x033;
//波特率设置为500Kbps
MCR=MCR&0x0EFFF;
//CCR=0改变配置请求
while(GSR&0x0010!=0) continue;
//只有当CCE=0时,配置BCR2、BCR1寄存器成功
MDER=0x040;
//不使能邮箱2,邮箱2改为接收方式
MCR=0x0143;
//CDR=1,数据区改变请求
MSGID2H=0x2447;
//设置邮箱2的控制字及ID
//IDE=0,AME=0,AAM=0
//标准方式为MSGID2H[12~2]
MSGID2L=0x0FFFF;
MSGCTRL2=0x08;
//设置控制器
//数据长度DCL=8,RTR=0数据帧
MBX2A=0x0000;
//邮箱2信息初始化
MBX2B=0x0000;
MBX2C=0x0000;
MBX2D=0x0000;
MSGID3H=0x2447;
//设置邮箱3的标识符
MSGID3L=0x0FFFF;
MSGCTRL3=0x08;
//RTR=0,DCL=8
MBX3A=0x2211;
//邮箱3信息初始化
MBX3B=0x4433;
MBX3C=0x6655;
MBX3D=0x8877;
CAN_IMR=0x0F7FF;
CAN_IFR=0x0FFFF;
MCR=0x04c0;
//DB0=1,AB0=1,STM=1设置为自测试模式
MDER=0x04C;
//使能邮箱2和3,邮箱2为接收方式
}
//(4)中断程序
void interrupt GRIS5()
{
switch(PIVR)
{
case 64:CANMBX_ISR();
break;
}
}
void CANMBX_ISR()
{
RCR=0x040;
//复位RMP2和MIF2
CAN_FLAG=1;
//置用户接收标志
}
// 直接返回中断服务程序
void interrupt nothing( )
{
return;
} |