在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DSP CAN總線(xiàn)無(wú)法進(jìn)如中斷的解決辦法

            DSP CAN總線(xiàn)無(wú)法進(jìn)如中斷的解決辦法

            作者: 時(shí)間:2016-12-15 來(lái)源:網(wǎng)絡(luò) 收藏
            一個(gè)項(xiàng)目要用到TMS320LF2407 DSP,之前沒(méi)用過(guò),花了一天時(shí)間了解了一下基本操作,就開(kāi)始調(diào)試CAN控制器。
            使用CAN自測(cè)模式,設(shè)置郵箱3發(fā)送、郵箱2接收,并使能郵箱2的接收中斷、高優(yōu)先級(jí),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;// 定義標(biāo)志寄存


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

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

            CANBX3A=CANBX3A+1;// 郵箱2中數(shù)據(jù)加1用來(lái)更新郵箱3中的數(shù)據(jù)
            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發(fā)送

            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;//定時(shí)器1周期中斷使能
            EVAIFRA=0xFFFF;//清除中斷標(biāo)志
            GPTCONA=0x0000;
            T1PR=2500;//定時(shí)器1初值,定時(shí)0.4us*2500=1ms
            T1CNT=0;
            T1CON=0x144E;//增模式, TPS系數(shù)40M/16=2.5M,T1使能

            }
            void CAN_INIT()
            {
            MCRB=MCRB|0X0C0;// 設(shè)置IOPC6、IOPC7 為 CANRX,CANTX
            CANIFR=0XFFFF;// 清所有CAN中斷標(biāo)志
            CANLAM0H=0X7FFF;// 設(shè)置郵箱2、3的屏蔽ID寄存器
            CANLAM0L=0XFFFF;// 0則ID必須匹配
            CANMCR=0X1040;//CCR=1 改變配置請(qǐng)求
            while(CANGSR&0X0010==0)continue;// 當(dāng)CCE=1 時(shí)即可配置 BCR2,BCR1 寄存器
            CANBCR2=0x01;
            CANBCR1=0x0033;
            CANMCR=CANMCR&0XEFFF;//CCR=0 改變配置結(jié)束請(qǐng)求
            while(CANGSR&0X0010!=0)continue; // 只有當(dāng)CEE=0時(shí),BCR2,BCR1 寄存器配置成功
            CANMDER=0X040;// 不使能郵箱,郵箱2設(shè)為接收方式
            CANMCR=0X0143;//CDR=1,數(shù)據(jù)區(qū)改變請(qǐng)求
            CANID2H=0X2447;// 設(shè)置郵箱2的控制字及ID
            //IDE=0, AME=0, AAM=0
            // 標(biāo)準(zhǔn)方式為MSGID2H[12-2]
            CANID2L=0XFFFF;
            CANCTRL2=0X08; // 設(shè)置控制域
            // 數(shù)據(jù)長(zhǎng)度DCL = 8,RTR=0 數(shù)據(jù)幀
            CANBX2A=0X0000;// 郵箱2信息初始化
            CANBX2B=0X0000;
            CANBX2C=0X0000;
            CANBX2D=0X0000;
            CANID3H=0X2447;// 設(shè)置郵箱3的標(biāo)識(shí)符
            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設(shè)置為自測(cè)試模式
            CANMDER=0X4C;//ME3=1,MBX3 發(fā)送, ME2=1 接收
            CANIMR=0X0400;// 中斷MBX3 不使能 ,MBX2使能, 高中斷優(yōu)先級(jí)
            CANIFR=0XFFFF;// 清全部中斷標(biāo)志
            }


            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;// 復(fù)位 RMP2 和 MIF2
            CAN_FLAG=1;// 置用戶(hù)接收標(biāo)志

            break;
            }
            }

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


            關(guān)鍵詞: DSPCAN總線(xiàn)中

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉