136297jia 发表于 2016-7-18 10:05

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

查询能收到吗?如果查询能收到,就证明硬件没问题

136297jia 发表于 2016-7-18 10:23

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

JY-DX-JY 发表于 2016-7-18 10:33
不会吧,应该可以进的

喔,既然硬件仿真没进入,是不是中断设置有问题,大神帮忙看一下代码

JY-DX-JY 发表于 2016-7-18 11:17

136297jia 发表于 2016-7-18 10:59
喔,既然硬件仿真没进入,是不是中断设置有问题,大神帮忙看一下代码

2407的CAN我没用过,你看看芯片手册,或者百度一下

136297jia 发表于 2016-7-18 11:23

JY-DX-JY 发表于 2016-7-18 11:17
2407的CAN我没用过,你看看芯片手册,或者百度一下

{:cry:}{:cry:}就是看数据手册写的程序,发送程序能成功,接收程序就出问题,找不出原因

JY-DX-JY 发表于 2016-7-18 11:39

没有接收到,你怎么判断发送成功呢?

136297jia 发表于 2016-7-18 11:41

JY-DX-JY 发表于 2016-7-18 11:39
没有接收到,你怎么判断发送成功呢?

我发送时单独一个程序,用CAN分析仪可以收到,但放在我从机板子上,就收不到,应该是从机程序有问题

136297jia 发表于 2016-7-18 11:42

CAN分析仪收到,说明主机发送成功,且数据正常

136297jia 发表于 2016-7-18 11:50

帖子中贴的就是从机代码,各路大神求解

花茶茶520 发表于 2017-10-30 11:06

可以不可以参考一下你的发送端程序啊,我回环模式自测时OK的,标准模式就发不出数据,示波器一直是隐性电平。。。
页: [1]
查看完整版本: DSP2407芯片CAN通信从机接收,接收中断一直没进入,求大神