新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > DSP CAN總線無法進如中斷的解決辦法

        DSP CAN總線無法進如中斷的解決辦法

        作者: 時間:2016-12-15 來源:網絡 收藏
        一個項目要用到TMS320LF2407 DSP,之前沒用過,花了一天時間了解了一下基本操作,就開始調試CAN控制器。
        使用CAN自測模式,設置郵箱3發送、郵箱2接收,并使能郵箱2的接收中斷、高優先級,main.c如下:

        #include "global.c"
        void SystemInit();
        void Timer1Init();
        void KickDog();
        void CANMBX_ISR();
        void CAN_INIT();
        unsigned int numled=0;
        unsigned int CAN_FLAG;// 定義標志寄存


        main()
        {
        unsigned int i=0;
        unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
        SystemInit();//系統初始化

        MCRC=MCRC & 0xFF00; //IOE0-7設為IO口模式
        PEDATDIR=0xFF00;//所有LED=0,
        asm(" CLRC INTM ");// 中斷使能
        CAN_FLAG=0X00;// 清CAN用戶標志,CAN_FLAG=01表示接收到數據
        CAN_INIT();// CAN初始化程序
        while(1)
        {
        CANTCR=0X20;// MBX3請求發送
        while(CANTCR&0X2000==0)// 等待發送應答
        continue;
        CANTCR=0X2000; // 清 TA3 和MIF3標志位
        while(CAN_FLAG==0)
        //while(CANRCR&0x0040!=0x0040)
        continue;// 等待接收數據
        CANRCR=0x0040;//清接收懸掛位
        CAN_FLAG=0;
        i++;// 清接收到標志
        CANMDER=0X0000;// 郵箱不使能
        CANMCR=0X0140;//CDR=1,數據改變請求

        CANBX3A=CANBX3A+1;// 郵箱2中數據加1用來更新郵箱3中的數據
        CANBX3B=CANBX3B+1;
        CANBX3C=CANBX3C+1;
        CANBX3D=CANBX3D+1;
        CANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=1
        CANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3發送

        RCA1=CANBX2A;
        RCB1=CANBX2B;
        RCC1=CANBX2C;
        RCD1=CANBX2D;


        }
        }
        void SystemInit()
        {

        asm(" SETCINTM ");
        asm(" CLRCSXM");
        asm(" CLRCCNF");
        asm(" CLRCOVM");
        SCSR1=0x02FC;
        WDCR=0x006F;
        KickDog();
        IFR=0xFFFF;
        IMR=0x0003;

        }

        void Timer1Init()
        {

        EVAIMRA=0x0080;//定時器1周期中斷使能
        EVAIFRA=0xFFFF;//清除中斷標志
        GPTCONA=0x0000;
        T1PR=2500;//定時器1初值,定時0.4us*2500=1ms
        T1CNT=0;
        T1CON=0x144E;//增模式, TPS系數40M/16=2.5M,T1使能

        }
        void CAN_INIT()
        {
        MCRB=MCRB|0X0C0;// 設置IOPC6、IOPC7 為 CANRX,CANTX
        CANIFR=0XFFFF;// 清所有CAN中斷標志
        CANLAM0H=0X7FFF;// 設置郵箱2、3的屏蔽ID寄存器
        CANLAM0L=0XFFFF;// 0則ID必須匹配
        CANMCR=0X1040;//CCR=1 改變配置請求
        while(CANGSR&0X0010==0)continue;// 當CCE=1 時即可配置 BCR2,BCR1 寄存器
        CANBCR2=0x01;
        CANBCR1=0x0033;
        CANMCR=CANMCR&0XEFFF;//CCR=0 改變配置結束請求
        while(CANGSR&0X0010!=0)continue; // 只有當CEE=0時,BCR2,BCR1 寄存器配置成功
        CANMDER=0X040;// 不使能郵箱,郵箱2設為接收方式
        CANMCR=0X0143;//CDR=1,數據區改變請求
        CANID2H=0X2447;// 設置郵箱2的控制字及ID
        //IDE=0, AME=0, AAM=0
        // 標準方式為MSGID2H[12-2]
        CANID2L=0XFFFF;
        CANCTRL2=0X08; // 設置控制域
        // 數據長度DCL = 8,RTR=0 數據幀
        CANBX2A=0X0000;// 郵箱2信息初始化
        CANBX2B=0X0000;
        CANBX2C=0X0000;
        CANBX2D=0X0000;
        CANID3H=0X2447;// 設置郵箱3的標識符
        CANID3L=0XFFFF;
        CANCTRL3=0X08;//RTR=0,DCL=8
        CANBX3A=0X10;// 郵箱3信息初始化
        CANBX3B=0X10;
        CANBX3C=0X10;
        CANBX3D=0X10;
        CANMCR=0X04C0;//DBO=1,ABO=1,STM=1設置為自測試模式
        CANMDER=0X4C;//ME3=1,MBX3 發送, ME2=1 接收
        CANIMR=0X0400;// 中斷MBX3 不使能 ,MBX2使能, 高中斷優先級
        CANIFR=0XFFFF;// 清全部中斷標志
        }


        void interruptc_int2()
        {

        if(PIVR!=0x27)
        {asm(" CLRC INTM ");
        return;
        }
        T1CNT=0;
        numled++;

        EVAIFRA=0x80;
        asm(" CLRCINTM ");

        }
        void interruptc_int1() // 中斷入口程序
        {
        switch(PIVR)
        {
        case 0x40:
        CANRCR=0X040;// 復位 RMP2 和 MIF2
        CAN_FLAG=1;// 置用戶接收標志

        break;
        }
        }

        void KickDog()
        {
        WDKEY=0x5555;
        WDKEY=0xAAAA;
        }
        但是調試發現,郵箱能正常發送和接受,就是進不去中斷,查了一上午才解決問題。對于DSP的外設中斷,INT1到INT6,在Define.asm中有相應的中斷向量表與之對應,如下:
        ;建立中斷向量表
        .sect".vectors"
        RSVECTB_c_int0
        INT1B_c_int1
        INT2B_c_int2
        INT3BPHANTOM
        INT4BPHANTOM
        INT5BPHANTOM
        INT6BPHANTOM
        對于郵箱2 的高優先級中斷c_int2,一開始并沒有在此定義,因此無法進入相應的中斷,將原先的PHANTOM改為_c_int1就行了,即為其建立中斷入口地址。_c_int與C語言的c_int是一樣的。
        PIVR是外設中斷向量寄存器,用于存儲最近一次被應答的外設中斷的地址向量,其具體值可在中斷源優先級和中斷向量表中查的,對于每一個外設都有一個唯一的中斷向量入口地址與之對應。


        關鍵詞: DSPCAN總線中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 阿勒泰市| 宝鸡市| 高尔夫| 泌阳县| 平度市| 彰化县| 鄯善县| 错那县| 阳新县| 巧家县| 太谷县| 泗阳县| 温宿县| 鲁甸县| 罗甸县| 巴中市| 垫江县| 泸州市| 枣庄市| 鲜城| 桑日县| 钦州市| 莲花县| 巨鹿县| 刚察县| 息烽县| 饶河县| 肃南| 万安县| 巴彦淖尔市| 大庆市| 循化| 紫金县| 浙江省| 南华县| 定兴县| 肥城市| 米林县| 乐都县| 敦化市| 衡东县|