打印
[DSP编程]

关于28035 eCAN的问题

[复制链接]
2910|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cjystar|  楼主 | 2013-12-30 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
eCAN, AD, IO, Nas, gp
我现在在做28035的eCAN的通讯,想用中断进行接收数据,但是貌似是怎么也进不去中断,各位大侠对于28035的eCAN的中断有什么需要特别注意的地方给点建议,我的程序如下

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
#include "DSP2803x_Device.h"
void delay_loop1();
void CAN_GpioInit();
void ECAN_Init();
Uint32 Rec_H;
Uint32 Rec_L;
void main()
{
        InitSysCtrl();
           DINT;
           IER = 0x0000;
           IFR = 0x0000;
           InitPieCtrl();
    InitPieVectTable();

    Rec_H=0;
    Rec_L=0;
    CAN_GpioInit();
    ECAN_Init();

    PieCtrlRegs.PIEIER9.bit.INTx5=1;            //使能PIE中断

    IER|=M_INT9;                               //使能CPU中断
    EINT;                                      //开全局中断
    ERTM;                                      //开实时中断


    for(;;)
    {
        
    }

}


void CAN_GpioInit()
{
   EALLOW;
   GpioCtrlRegs.GPAPUD.bit.GPIO30=0;
   GpioCtrlRegs.GPAPUD.bit.GPIO31=0;
   GpioCtrlRegs.GPAMUX2.bit.GPIO30=1;             //设置Gpio30工作在Ecan的模式
   GpioCtrlRegs.GPAMUX2.bit.GPIO31=1;             //设置Gpio31工作在ECAN的模式
   GpioCtrlRegs.GPAMUX2.bit.GPIO29=0;
   GpioCtrlRegs.GPADIR.bit.GPIO29=1;
   EDIS;
   GpioDataRegs.GPADAT.bit.GPIO29=1;
}

void ECAN_Init()
{
        struct ECAN_REGS ECanaShadow;
        EALLOW;
        ECanaShadow.CANTIOC.all=ECanaRegs.CANTIOC.all;
        ECanaShadow.CANTIOC.bit.TXFUNC=1;             //设置CANTx为ECAN的发送端口
        ECanaRegs.CANTIOC.all=ECanaShadow.CANTIOC.all;

        ECanaShadow.CANRIOC.all=ECanaRegs.CANRIOC.all;
        ECanaShadow.CANRIOC.bit.RXFUNC=1;             //设置CANRx为ECAN的接收端口
        ECanaRegs.CANRIOC.all=ECanaShadow.CANRIOC.all;

        ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
        ECanaShadow.CANMC.bit.STM=0;                  //0则是工作在正常的模式,1则是自测模式
        ECanaShadow.CANMC.bit.SCB=1;                  //选择工作在ECAN模式下
        ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
        EDIS;

        ECanaMboxes.MBOX1.MSGCTRL.all=0x00000000;      //初始化邮箱0的控制区域为零,
        ECanaRegs.CANTA.all=0xffffffff;                //清除所有的发送标志位
        ECanaRegs.CANRMP.all=0xffffffff;               //清除所有的接收标志位
        ECanaRegs.CANGIF0.all = 0xFFFFFFFF;            /* Clear all interrupt flag bits */
    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;   //这里一定要注意必须要有这一句,否则的话不会去判断位CCE是否置位
    }
    while(ECanaShadow.CANES.bit.CCE!=1);              //只有CCE置位以后才能对CANBTC进行设置
    EALLOW;
    ECanaRegs.CANBTC.all=0x00000000;
    ECanaShadow.CANBTC.all=ECanaRegs.CANBTC.all;
    ECanaShadow.CANBTC.bit.BRPREG=2;
    ECanaShadow.CANBTC.bit.TSEG1REG=6;
    ECanaShadow.CANBTC.bit.TSEG2REG=1;
    ECanaShadow.CANBTC.bit.SAM=1;
    ECanaRegs.CANBTC.all=ECanaShadow.CANBTC.all;

    ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR=0;                         //请求Cpu正常工作
    ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
    EDIS;

    do
    {
      ECanaShadow.CANES.all=ECanaRegs.CANES.all;
    }
    while(ECanaShadow.CANES.bit.CCE!=0);                  //等待CCE被清零

    ECanaRegs.CANME.all=0;                                //屏蔽 所有的邮箱
    ECanaMboxes.MBOX1.MSGID.all = 0X9555AAA1;               //设置接收邮箱1的ID

    ECanaShadow.CANMD.all=ECanaRegs.CANMD.all;
    ECanaShadow.CANMD.bit.MD1=1;                          //设置邮箱1作为接收邮箱
    ECanaRegs.CANMD.all=ECanaShadow.CANMD.all;

    //设置邮箱1的接收的数据的格式
    ECanaMboxes.MBOX1.MSGCTRL.bit.DLC=8;                   //邮箱1接收的数据长度为8个字节
    ECanaMboxes.MBOX1.MSGCTRL.bit.RTR=0;                   //没有远方应答帧被请求
    ECanaMboxes.MBOX1.MSGCTRL.bit.TPL=0;                   //优先级设置为0

    //ECanaMboxes.MBOX0.MDL.all=0x01234567;//向邮箱0的RAM区域写数据
    //ECanaMboxes.MBOX0.MDH.all=0x76543210;


    ECanaShadow.CANME.all=ECanaRegs.CANME.all;
    ECanaShadow.CANME.bit.ME1=1;                          //使能接收邮箱1
    ECanaRegs.CANME.all=ECanaShadow.CANME.all;

    EALLOW;
    ECanaRegs.CANMIM.all=0xffffffff;                      //使能全部邮箱中断
    ECanaRegs.CANMIL.all=0;                               //邮箱中断发生在中断线0上
    ECanaRegs.CANGIF0.all=0xffffffff;
    ECanaRegs.CANGIF1.all=0xffffffff;
    ECanaRegs.CANGIM.bit.I0EN=1;                          //ECANI0EN中断线使能
    ECanaRegs.CANGIM.bit.I1EN=1;
    ECanaRegs.CANGIM.bit.GIL=0;
    EDIS;
}



interrupt void ECAN0INTA_ISR(void)
{
   while(ECanaRegs.CANRMP.all!=0x00000002);
   ECanaRegs.CANRMP.all=0x00000002;                     //复位接收请求寄存器

   GpioDataRegs.GPADAT.bit.GPIO29=0;                     //中断进入指示
   delay_loop1();      
   GpioDataRegs.GPADAT.bit.GPIO29=1;

   Rec_L=ECanaMboxes.MBOX1.MDL.all;                    //接收数据
   Rec_H=ECanaMboxes.MBOX1.MDH.all;

   PieCtrlRegs.PIEACK.bit.ACK9=1;                      //中断应答
   EINT;
}



void delay_loop1()
{
    short      i,j;
    for (i = 0; i < 1000; i++)
        for(j=0;j<1000;j++);
}

相关帖子

沙发
wangch_sh| | 2013-12-30 16:42 | 只看该作者
PieCtrlRegs.PIEIER9.bit.INTx6=1;            //使能PIE中断

用这个中断试下。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cjystar + 1 赞一个!
板凳
cjystar|  楼主 | 2013-12-30 17:48 | 只看该作者
wangch_sh 发表于 2013-12-30 16:42
PieCtrlRegs.PIEIER9.bit.INTx6=1;            //使能PIE中断

用这个中断试下。

嗯,我换了,试了一下,但是还是不行,我查看了一下寄存器,发现RMP没有置位,当我把中断去掉的时候采用查询法来接收数据的时候,程序是停在            while(ECanaRegs.CANRMP.all!=0x00000002);(我设置的邮箱1作为接收邮箱),不知道是不是我的eCAN的设置的有什么问题吗?      我做了邮箱0的发送实验是可以正常发送的(查询法)

使用特权

评论回复
地板
wangch_sh| | 2013-12-30 17:56 | 只看该作者
我现在也做这个CAN实验,用中断。但是用INTX5不行,用INTX6就可以。搞不懂为什么。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cjystar + 1 赞一个!
5
cjystar|  楼主 | 2013-12-30 18:32 | 只看该作者
wangch_sh 发表于 2013-12-30 17:56
我现在也做这个CAN实验,用中断。但是用INTX5不行,用INTX6就可以。搞不懂为什么。 ...

嗯,应该是两个都是没有问题额,只要是配置好了,都是能用的,你能不能把你的那个实验成功的程序发出来参考一下啊

使用特权

评论回复
6
kingzlt| | 2014-1-2 08:52 | 只看该作者
中断到底是产生在9.5还是9.6上是由CANGIM和CANMIL共同决定的,然后就是ID的设置,看看是否有问题,还有个帧格式的问题

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cjystar + 1 赞一个!
7
cjystar|  楼主 | 2014-1-2 09:20 | 只看该作者
kingzlt 发表于 2014-1-2 08:52
中断到底是产生在9.5还是9.6上是由CANGIM和CANMIL共同决定的,然后就是ID的设置,看看是否有问题,还有个帧 ...

嗯,谢谢你的回答,我现在是先改为查询法接收再改为中断的接收,在查询接收的时候我检测的是
           while(ECanaRegs.CANRMP.bit.RMP1 !=1)
                  {

                      ECanaRegs.CANRMP.all=0x00000002;                      //复位接收请求寄存器
                      Rec_L=ECanaMboxes.MBOX1.MDL.all;                      //接收数据
                      Rec_H=ECanaMboxes.MBOX1.MDH.all;
                          }
但是始终是停在 while(ECanaRegs.CANRMP.bit.RMP1 !=1)这里,寄存器里也是没有置位,我后来改成自测模式,邮箱0发送,邮箱1接收,可以正常发送和接收,但是一旦改成正常模式STM=0是就就收不到,CANRMP不能置位,我的CAN的设置初始化都看了很多遍了,没有什么问题的啊,不知道大家有没有这方面的经验

使用特权

评论回复
8
kingzlt| | 2014-1-2 11:59 | 只看该作者
ECanaShadow.CANMC.bit.SUSP   = 1;                   //bit16

不知是否有用

使用特权

评论回复
9
cjystar|  楼主 | 2014-1-2 12:34 | 只看该作者
kingzlt 发表于 2014-1-2 11:59
ECanaShadow.CANMC.bit.SUSP   = 1;                   //bit16

不知是否有用

嗯,该位我设置了的,但还是CANRMP的相应位没有置位。你又没有单独做过eCAN的接收实验的呢?

使用特权

评论回复
10
kingzlt| | 2014-1-2 12:37 | 只看该作者
我做过同时开8个接收邮箱,中断接收,没遇到过你这种问题

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cjystar + 1 赞一个!
11
cjystar|  楼主 | 2014-1-2 12:46 | 只看该作者
kingzlt 发表于 2014-1-2 12:37
我做过同时开8个接收邮箱,中断接收,没遇到过你这种问题

你是用的28385的吗,方便把你的实验的程序发给我一份吗,我的邮箱605941063@qq.com,我找了好长时间的问题了,

使用特权

评论回复
12
cjystar|  楼主 | 2014-1-2 12:47 | 只看该作者
cjystar 发表于 2014-1-2 12:46
你是用的28385的吗,方便把你的实验的程序发给我一份吗,我的邮箱605941063@qq.com,我找了好长时间的问 ...

是28035的DSP吗

使用特权

评论回复
13
kingzlt| | 2014-1-2 12:54 | 只看该作者
希望能有帮助

DSP2803x_ECan.zip

3.33 KB

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
cjystar + 2 很给力!
14
cjystar|  楼主 | 2014-1-2 13:34 | 只看该作者
kingzlt 发表于 2014-1-2 12:54
希望能有帮助

嗯,好的,非常谢谢你!

使用特权

评论回复
15
csuzzp| | 2014-3-9 14:43 | 只看该作者
cjystar 发表于 2014-1-2 09:20
嗯,谢谢你的回答,我现在是先改为查询法接收再改为中断的接收,在查询接收的时候我检测的是
            ...

我也是遇到一样的问题,不知道你是怎么解决的?

使用特权

评论回复
16
cjystar|  楼主 | 2014-3-10 12:30 | 只看该作者
csuzzp 发表于 2014-3-9 14:43
我也是遇到一样的问题,不知道你是怎么解决的?

还是自己的配置的问题,后来又重新配置了,还有一个就是上位机CAN的调试软件中的数据的对其方式要选正确,我刚开始是MCP2515,后来是右对齐,

使用特权

评论回复
17
yjw16| | 2014-4-11 10:19 | 只看该作者
请问一下,can的两根高低线去哪买啊?

使用特权

评论回复
18
仙人球W| | 2015-9-2 14:11 | 只看该作者
楼主的初始化能否给个工程,最近调28035的eCAN。例程的回环测试好用,改为正常模式就卡死在 while(ECanaRegs.CANTA.all != 0x0000FFFF ) {}  // Wait for all TAn bits to be set.. 希望借鉴一下楼主的经验。谢谢 540709935@qq.com

使用特权

评论回复
19
andyjian| | 2015-9-14 09:06 | 只看该作者
我有一次波特率没有设置正确就不能进中断,希望对大家有所帮助

使用特权

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

本版积分规则

19

主题

80

帖子

1

粉丝