DSP2407芯片CAN通信从机接收,接收中断一直没进入,求大神
#include "register.h"//Main.c
////////////////////////////////////////////
void SystemInit();
void KickDog();
void Can_Init();
void Can_Send();
int CAN_FLAG;
unsigned int ReceiveData;
///////////////////////////////////////////////////////////
void inline disable()
{
asm(" setc INTM");
}
// 开总中断程序
void inline enable()
{
asm(" clrc INTM");
}
/////////////////////////////////////////////////////////
main()
{
disable();
SystemInit(); //系统初始化
CAN_FLAG=0x00; //CAN接收标志位
Can_Init(); //CAN模块初始化
enable();
for(;;)
{
while(CAN_FLAG==0x00);
CAN_FLAG=0x00;
Can_Send();
MDER=0x0000; //邮箱不使能
}
}
////////////////////////////////////////////////////
void SystemInit()
{
asm(" SETC INTM "); // 关闭总中断
asm(" CLRCSXM"); // 禁止符号位扩展
asm(" CLRCCNF"); // B0块映射为 on-chip DARAM
asm(" CLRCOVM"); // 累加器结果正常溢出*/
SCSR1=0x87FE; // 系统时钟CLKOUT=20*1=20M
// 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
WDCR=0x006F; // 禁止看门狗,看门狗时钟64分频
KickDog(); // 初始化看门狗
IMR=0x0010; //开中断优先级5
IFR=0xFFFF; // 清除中断标志
}
/////////////////////////////////////////////////////
void Can_Init()
{
MCRB|=0x00C0; //IOPC6,IOPC7配置为特殊功能
CAN_IFR=0xFFFF; // 清除全部CAN中断标志
LAM1_H=0xFFFF; // 使用LAM1
LAM1_L=0xFFFF; // 接收任何信息
MCR=0x1000; // 配置寄存器改变请求,正常模式
while((GSR & 0x0010)!=0x0010);// CCE=1?
BCR2=0x0003; // 设置数据传输率:500Kbps,20M *
BCR1=0x0023;
MCR=MCR&0xEFFF; // CPU正常工作请求
while((GSR & 0x0010)!=0x0000); // CCE=0?
MDER=0x040; /* 配置邮箱2为接收邮箱,且不使能 */
MCR=MCR|0x0100; /* 数据场改变请求 */
MSGID2H=0x8000; /*ID=0x1314,扩展帧,只有满足这个ID的CAN控制器才能接收本信息*/
MSGID2L=0x1314;
MSGCTRL2=0x08; /* 数据帧,发送8个字节 */
MBX2A=0x0000;
MBX2B=0x0000;
MBX2C=0x0000;
MBX2D=0x0000;
MCR=0x0480; /* CPU正常工作请求0x0480 ,自测试为0x04C0*/
MDER=0x0044; /* MessageBox2使能 */
CAN_IMR=0xFFFF; //中断屏蔽寄存器
CAN_IFR=0xFFFF; // 清除全部CAN中断标志
}
///////////////////////////////////////////////////////
void Can_Send()
{
MCR=MCR|0x0100; /* 数据场改变请求 */
MSGID4H=0x8000; /*ID=0x1314,扩展帧,只有满足这个ID的CAN控制器才能接收本信息*/
MSGID4L=0x1314;
MSGCTRL4=0x0008; /* 数据帧,发送8个字节 */
MBX4A=(ReceiveData<<8) | ReceiveData;
MBX4B=(ReceiveData<<8) | ReceiveData;
MBX4C=(ReceiveData<<8) | ReceiveData;
MBX4D=(ReceiveData<<8) | ReceiveData;
MCR=0x0480; /* CPU正常工作请求0x0480 ,自测试为0x04C0*/
MDER=MDER | 0x0010;/* MessageBox4使能 */
asm(" SETC INTM ");
TCR=0x0040; /* MessageBox4, 发送请求 */
while((TCR & 0x4000)!=0x4000);
asm(" CLRC INTM ");
CAN_IFR=0xFFFF;
TCR=0x4040;
}
////////////////////////////////////////////////////
void interrupt CANINT()
{
if(PIVR!=0x40) //高优先级的CAN接收中断
{ asm(" CLRC INTM ");
return;
}
ReceiveData=MBX2A & 0x00FF;
ReceiveData=MBX2A>>8;
ReceiveData=MBX2B & 0x00FF;
ReceiveData=MBX2B>>8;
ReceiveData=MBX2C & 0x00FF;
ReceiveData=MBX2C>>8;
ReceiveData=MBX2D & 0x00FF;
ReceiveData=MBX2D>>8;
CAN_FLAG=0x01; //收到标志位置1
RCR=0x0040; //复位RMP2和MIF2
CAN_IFR=0xFFFF; //清除CAN中断
IFR=0xFFFF; //清除所有中断
asm(" CLRC INTM ");
}
////////////////////////////////////////////////////
void interrupt nothing()
{
enable( ); // 允许总中断,因一进中断服务程序后总中断就自动关闭了
return; // 中断返回
}
///////////////////////////////////////////////////////////////////////////////
void KickDog() //踢除看门狗
{
WDKEY=0x5555;
WDKEY=0xAAAA;
} 查询能收到吗?如果查询能收到,就证明硬件没问题 JY-DX-JY 发表于 2016-7-18 10:14
查询能收到吗?如果查询能收到,就证明硬件没问题
我在CCS3.3的环境下,用仿真器在线仿真,在中断哪儿设置断点,一直没进入,有人说CCS3.3仿C2000的DSP不能进中断,是吗?查询方式我没试过,初学者,求代码一份 不会吧,应该可以进的 JY-DX-JY 发表于 2016-7-18 10:33
不会吧,应该可以进的
喔,既然硬件仿真没进入,是不是中断设置有问题,大神帮忙看一下代码 136297jia 发表于 2016-7-18 10:59
喔,既然硬件仿真没进入,是不是中断设置有问题,大神帮忙看一下代码
2407的CAN我没用过,你看看芯片手册,或者百度一下 JY-DX-JY 发表于 2016-7-18 11:17
2407的CAN我没用过,你看看芯片手册,或者百度一下
{:cry:}{:cry:}就是看数据手册写的程序,发送程序能成功,接收程序就出问题,找不出原因 没有接收到,你怎么判断发送成功呢? JY-DX-JY 发表于 2016-7-18 11:39
没有接收到,你怎么判断发送成功呢?
我发送时单独一个程序,用CAN分析仪可以收到,但放在我从机板子上,就收不到,应该是从机程序有问题 CAN分析仪收到,说明主机发送成功,且数据正常 帖子中贴的就是从机代码,各路大神求解 可以不可以参考一下你的发送端程序啊,我回环模式自测时OK的,标准模式就发不出数据,示波器一直是隐性电平。。。
页:
[1]