- UID
- 114293
|
最近在调试DSP28035can通信,采用查询方式发送,发送标志始终显示未发送成功,但TX管脚示波器上又有发送数据波形,但显示的波形可以看出发送的数据又是不正确的,有没有遇到过同样问题的朋友?
下面为初始化代码
void InitCan(void)
{
        struct ECAN_REGS ECanaShadow;
            EALLOW;
            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;
            ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
            ECanaShadow.CANMC.bit.SCB = 1;// User has selected eCAN mode
            ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
            ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
            ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
            ECanaRegs.CANTA.all = 0xFFFFFFFF;   // Clear all TAn bits
            ECanaRegs.CANRMP.all = 0xFFFFFFFF;  // Clear all RMPn bits
            ECanaRegs.CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
            ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
            // Configure bit timing parameters for eCANA
            ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
            ECanaShadow.CANMC.bit.CCR = 1 ;            // Set CCR = 1
            ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
            // Wait until the CPU has been granted permission to change the configuration registers
            do
            {
              ECanaShadow.CANES.all = ECanaRegs.CANES.all;
            } while(ECanaShadow.CANES.bit.CCE != 1 );
            ECanaShadow.CANBTC.all = 0;
            ECanaShadow.CANBTC.bit.BRPREG = 1;    //2     1
            ECanaShadow.CANBTC.bit.TSEG2REG = 9;  //1     9
            ECanaShadow.CANBTC.bit.TSEG1REG = 6;  //6     6
            ECanaShadow.CANBTC.bit.SAM = 1;
            ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
            ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
            ECanaShadow.CANMC.bit.CCR = 0 ;
            /////////////////////////////////////////////////////
           /* ECanaShadow.CANMC.bit.PDR = 0;
            ECanaShadow.CANMC.bit.DBO = 0;
            ECanaShadow.CANMC.bit.WUBA = 0;
            ECanaShadow.CANMC.bit.CDR = 0;
            ECanaShadow.CANMC.bit.ABO = 0;
            ECanaShadow.CANMC.bit.STM = 0;
            ECanaShadow.CANMC.bit.SRES = 0;
            ECanaShadow.CANMC.bit.MBNR = 0;
            ECanaShadow.CANMC.bit.SUSP = 1;*/
            /////////////////////////////////////////////////////
            ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
            do
            {
              ECanaShadow.CANES.all = ECanaRegs.CANES.all;
            } while(ECanaShadow.CANES.bit.CCE != 0 );
            //Disable all Mailboxes
            ECanaRegs.CANME.all = 0;        // disable
            EDIS;
            EALLOW;
            ECanaMboxes.MBOX0.MSGID.all = 0x00040000;//0x9555AAA0     0x00040000
            ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;  //Send MailBox
            ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;  //Receive MailBox
            ECanaRegs.CANMD.all =0x00000002;//0:send   1:receive
            ECanaRegs.CANME.all = 0x00000003;
                EDIS;
            ECanaMboxes.MBOX0.MDL.all = 0x12345678;//0x9555AAA0;
            ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
            EALLOW;
                ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
                ECanaShadow.CANMC.bit.STM = 0;    // Configure CAN for self-test mode 1
                ECanaShadow.CANMC.bit.DBO = 1;
                ECanaShadow.CANMC.bit.ABO = 1;    //CAN BUS ON
                ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
            EDIS;
                EALLOW;
                ECanaRegs.CANMIM.all=0x00000002;//使能邮箱1接收中断
                ECanaRegs.CANMIL.all=0;//所有邮箱在中断0(ECANOINT)产生邮箱中断
                ECanaRegs.CANGIF0.all=0xFFFFFFFF;//全局中断标志寄存器CANGIF0所有标志位清零
                ECanaRegs.CANGIF1.all=0xFFFFFFFF;//全局中断标志寄存器CANGIF1所有标志位清零
                ECanaRegs.CANGIM.bit.I0EN=1;//eCAN模块中中断0使能
                EDIS;
}      
发送函数:
void sCanSend(void)
{
         ECanaRegs.CANTRS.all = 0;
         ECanaMboxes.MBOX0.MDL.all = 0x12345678;//0x9555AAA0;
         ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
         ECanaRegs.CANTRS.all = 0x00000001;
        while(ECanaRegs.CANTA.all != 0x00000001 ) {}//程序会一直卡在这里
         ECanaRegs.CANTA.all = 0x00000001;
   }      |
|