打印
[DSP编程]

DSP2407芯片CAN通信从机接收,接收中断一直没进入,求大神

[复制链接]
1687|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
136297jia|  楼主 | 2016-7-18 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include        "register.h"

//Main.c
////////////////////////////////////////////
void SystemInit();
void KickDog();  
void Can_Init();
void Can_Send();
int CAN_FLAG;  
unsigned int ReceiveData[8];
///////////////////////////////////////////////////////////
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(" CLRC  SXM  ");        // 禁止符号位扩展
        asm(" CLRC  CNF  ");    // B0块映射为 on-chip DARAM
        asm(" CLRC  OVM  ");    // 累加器结果正常溢出*/
        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[1]<<8) | ReceiveData[0];
        MBX4B=(ReceiveData[3]<<8) | ReceiveData[2];
        MBX4C=(ReceiveData[5]<<8) | ReceiveData[4];
        MBX4D=(ReceiveData[7]<<8) | ReceiveData[6];

        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[0]=MBX2A & 0x00FF;
    ReceiveData[1]=MBX2A>>8;
    ReceiveData[2]=MBX2B & 0x00FF;
    ReceiveData[3]=MBX2B>>8;
    ReceiveData[4]=MBX2C & 0x00FF;
    ReceiveData[5]=MBX2C>>8;
    ReceiveData[6]=MBX2D & 0x00FF;
    ReceiveData[7]=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 | 只看该作者
不会吧,应该可以进的

使用特权

评论回复
5
136297jia|  楼主 | 2016-7-18 10:59 | 只看该作者
JY-DX-JY 发表于 2016-7-18 10:33
不会吧,应该可以进的

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

使用特权

评论回复
6
JY-DX-JY| | 2016-7-18 11:17 | 只看该作者
136297jia 发表于 2016-7-18 10:59
喔,既然硬件仿真没进入,是不是中断设置有问题,大神帮忙看一下代码

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

使用特权

评论回复
7
136297jia|  楼主 | 2016-7-18 11:23 | 只看该作者
JY-DX-JY 发表于 2016-7-18 11:17
2407的CAN我没用过,你看看芯片手册,或者百度一下

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

使用特权

评论回复
8
JY-DX-JY| | 2016-7-18 11:39 | 只看该作者
没有接收到,你怎么判断发送成功呢?

使用特权

评论回复
9
136297jia|  楼主 | 2016-7-18 11:41 | 只看该作者
JY-DX-JY 发表于 2016-7-18 11:39
没有接收到,你怎么判断发送成功呢?

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

使用特权

评论回复
10
136297jia|  楼主 | 2016-7-18 11:42 | 只看该作者
CAN分析仪收到,说明主机发送成功,且数据正常

使用特权

评论回复
11
136297jia|  楼主 | 2016-7-18 11:50 | 只看该作者
帖子中贴的就是从机代码,各路大神求解

使用特权

评论回复
12
花茶茶520| | 2017-10-30 11:06 | 只看该作者
可以不可以参考一下你的发送端程序啊,我回环模式自测时OK的,标准模式就发不出数据,示波器一直是隐性电平。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

13

帖子

0

粉丝