- UID
- 114293
|
我现在在做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;
  &nbspieCtrlRegs.PIEACK.bit.ACK9=1;                      //中断应答
   EINT;
}
void delay_loop1()
{
    short      i,j;
    for (i = 0; i < 1000; i++)
        for(j=0;j<1000;j++);
} |
|