打印
[DSP编程]

can通信无法进入中断接受中断

[复制链接]
4330|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
869385911|  楼主 | 2016-10-10 17:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "DSP280x_Device.h"
#include "DSP280x_Examples.h"

interrupt void ECAN0INTA(void) ;
long candatahighword=0;
long candatalowword =0;

#define LED3       GpioDataRegs.GPADAT.bit.GPIO23 //工作指示灯,LED3
void main(void)
{
    InitSysCtrl();
    InitGpio();
        DINT;
        IER = 0x0000;
        IFR = 0x0000;

        InitPieCtrl();
        InitPieVectTable();
        EALLOW;
        PieVectTable.ECAN0INTA = &ECAN0INTA;
        EDIS;
    InitECan();
    PieCtrlRegs.PIEIER9.bit.INTx5=1;
    IER|=M_INT9;
    EINT;
    ERTM;
    LED3=1;
    int i ;
    while(1)
    {
            i++;
            if (i>100)
                    i--;
    }
}

interrupt void ECAN0INTA(void)  // eCAN-A
{
        LED3=0;
        while(ECanaRegs.CANRMP.bit.RMP16!=1);
        ECanaRegs.CANRMP.all=0x00010000;
        candatahighword=ECanaMboxes.MBOX16.MDH.all;
        candatalowword =ECanaMboxes.MBOX16.MDL.all;
        PieCtrlRegs.PIEACK.bit.ACK9=1;
        EINT;

}




void InitECan(void)
{
        InitECanGpio();
        InitECana();
}
void InitECana(void)        // Initialize eCAN-A module
{
        struct ECAN_REGS ECanaShadow;
   EALLOW;     // EALLOW enables access to protected bits
   GpioCtrlRegs.GPAMUX2.bit.GPIO30=1;
   GpioCtrlRegs.GPAMUX2.bit.GPIO31=1;
   //配置eCAN的RX和TX分别为eCAN的接收和发送引脚
   ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
   ECanaShadow.CANTIOC.bit.TXFUNC = 1;
   ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;

   ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
   ECanaShadow.CANRIOC.bit.RXFUNC = 1;
   ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
   EDIS;
   ECanaRegs.CANMC.all=0;//主控寄存器各位清
   EALLOW;
   ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   //工作在正常模式
   ECanaShadow.CANMC.bit.STM = 0;
   //工作在eCAN模式
   ECanaShadow.CANMC.bit.SCB=1;
   ECanaShadow.CANMC.bit.DBO = 0;
   ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
   EDIS;

   ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
   //清除所有的TA位
   ECanaRegs.CANTA.all = 0xFFFFFFFF;
           //清除所有的RMP位
   ECanaRegs.CANRMP.all = 0xFFFFFFFF;
   //配置时钟参数
   ECanaRegs.CANGIF0.all= 0xFFFFFFFF;
   ECanaRegs.CANGIF1.all= 0xFFFFFFFF;
   EALLOW;
   ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   ECanaShadow.CANMC.bit.CCR = 1;
   ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
   EDIS;
   do
   {
     ECanaShadow.CANES.all = ECanaRegs.CANES.all;
   }
   while(ECanaShadow.CANES.bit.CCE != 1);

   EALLOW;
   //(BRPREG+1)=100 ,CAN时钟为100MHz
   ECanaShadow.CANBTC.bit.BRPREG = 99;
   //CAN通信的波特率为100kbps
   ECanaShadow.CANBTC.bit.TSEG2REG = 2;
   ECanaShadow.CANBTC.bit.TSEG1REG = 5;
   ECanaRegs.CANBTC.all=ECanaShadow.CANBTC.all;

   //CPU请求正常操作
   ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
   ECanaShadow.CANMC.bit.CCR = 0;
   ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
   EDIS;
   do
   {
     ECanaShadow.CANES.all = ECanaRegs.CANES.all;
   }
   while(ECanaShadow.CANES.bit.CCE != 0);


   //设置邮箱16为接收邮箱
    ECanaRegs.CANME.all = 0;
   ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
   ECanaShadow.CANMD.bit.MD16 =1;
   ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
   //全局接受屏蔽,标示符位必须一一匹配
   ECanaRegs.CANGAM.all=0;
   //设置接收邮箱的ID,扩展帧,IDE,
   ECanaMboxes.MBOX16.MSGID.all =  0x80C80000;
   //数据长度 8个BYTE
   ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8;
   //有远方应答帧被请求
   ECanaMboxes.MBOX16.MSGCTRL.bit.RTR = 0;

   //邮箱16使能
   ECanaShadow.CANME.all=ECanaRegs.CANME.all;
   ECanaShadow.CANME.bit.ME16=1;
   ECanaRegs.CANME.all=ECanaShadow.CANME.all;
   EALLOW;
   ECanaRegs.CANMIM.all = 0xFFFFFFFF;
   ECanaRegs.CANMIL.all = 0;
   ECanaRegs.CANGIF0.all= 0xFFFFFFFF;
   ECanaRegs.CANGIM.bit.I0EN = 1;
   EDIS;
}

void InitECanGpio(void)
{
         EALLOW;
         GpioCtrlRegs.GPAPUD.bit.GPIO30   = 0;     // Enable pull-up for GPIO30 (CANRXA)
         GpioCtrlRegs.GPAPUD.bit.GPIO31   = 0;     // Enable pull-up for GPIO31 (CANTXA)
         GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3;
         // Asynch qual for GPIO30 (CANRXA)
         GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;    // Configure GPIO30 for CANTXA operation
         GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;
         EDIS;
}
/*************************************************************no more **********************************************************************/
前边是主接受函数,后边是配置。现在数据能从上位机发送到dsp的输入引脚上了,但是dsp就是不进入接受中断。请高手帮忙一下。跪谢!

相关帖子

沙发
zhangmangui| | 2016-10-10 22:23 | 只看该作者
中断    没有打开吧   你看看PIE的框图

使用特权

评论回复
板凳
869385911|  楼主 | 2016-10-11 09:15 | 只看该作者
zhangmangui 发表于 2016-10-10 22:23
中断    没有打开吧   你看看PIE的框图

大虾,能否再详细点?我这是按ti给的例程来写的呀

使用特权

评论回复
地板
869385911|  楼主 | 2016-10-11 09:16 | 只看该作者
zhangmangui 发表于 2016-10-10 22:23
中断    没有打开吧   你看看PIE的框图

大虾,能否再详细点?我这是按ti给的例程来写的呀, ECanaRegs.CANGIM.bit.I0EN = 1;这个不是开can0中断吗?

使用特权

评论回复
5
长的帅怪我落| | 2016-10-11 16:39 | 只看该作者
PieCtrlRegs.PIECTRL.bit.ENPIE=1;
  PieCtrlRegs.PIEIER9.bit.INTx5=1;
然后我不知道你的芯片对应的can中断是不是PIEIER9.bit.INTx5,你最好是自己确认下。
InitECan();放前面去,不知道会不会有影响,但是放这里不好看

使用特权

评论回复
6
869385911|  楼主 | 2016-10-13 10:40 | 只看该作者
长的帅怪我落 发表于 2016-10-11 16:39
PieCtrlRegs.PIECTRL.bit.ENPIE=1;
  PieCtrlRegs.PIEIER9.bit.INTx5=1;
然后我不知道你的芯片对应的can ...

额,现在有新的问题了,就是同时使用dsp的cana和canb通信,一样的配置,cana可以正常收发,但canb却接受和发送都不行。是不是canb在配置的时候和cana有什么区别吗?

使用特权

评论回复
7
长的帅怪我落| | 2016-10-13 10:48 | 只看该作者
本帖最后由 长的帅怪我落 于 2016-10-13 10:52 编辑
869385911 发表于 2016-10-13 10:40
额,现在有新的问题了,就是同时使用dsp的cana和canb通信,一样的配置,cana可以正常收发,但canb却接受 ...

cana和canb的pie分组不一样,如果cana是PIEIER9,canb肯定不是,至于具体是哪个,你自己看咯。我看了下我的dsp,cana和canb都是group9,但是一个是intx5和6,一个是7和8

使用特权

评论回复
8
869385911|  楼主 | 2016-10-13 10:53 | 只看该作者
本帖最后由 869385911 于 2016-10-13 10:54 编辑
长的帅怪我落 发表于 2016-10-13 10:48
cana和canb的pie分组不一样,如果cana是PIEIER9,canb肯定不是,至于具体是哪个,你自己看咯。我看了下我 ...

您好,感谢您的回答,这个是2808的pie分组,我看了他们确实是在同一组pieier9.int5和pieier.int7

使用特权

评论回复
9
8869385911| | 2016-10-19 16:47 | 只看该作者
问题已解决,结贴。

使用特权

评论回复
10
覃生| | 2016-11-2 17:34 | 只看该作者

你好,我遇到了同样的问题了。使用dsp的cana和canb通信,一样的配置,canb可以正常收发,但cana不能接收

使用特权

评论回复
11
muhongqing| | 2017-2-22 13:40 | 只看该作者
本帖最后由 muhongqing 于 2017-2-22 13:55 编辑
覃生 发表于 2016-11-2 17:34
你好,我遇到了同样的问题了。使用dsp的cana和canb通信,一样的配置,canb可以正常收发,但cana不能接收 ...
应该是下面这条语句的问题。需要设置第二个CAN的起始滤波器,STM32是这么处理的。
CAN_SlaveStartBank(14);                                                        // 设置从CAN滤波器组的起始编号

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝