|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
求助ARM2119的CAN中斷程序 |
| 作者:bendanguo 欄目:ARM技術(shù) |
小弟用ARM2119想實現(xiàn)CAN2口發(fā)送信息,CAN1中斷接收這一簡單的功能,編了下面的程序,可是調(diào)試時發(fā)現(xiàn)無法進(jìn)入接收中斷,很是著急,不知問題出在哪里,請各位大俠指點(diǎn)!小弟感激不盡! 程序如下: /********************************************************************************************************/ #include "config.h" #define BPS_125K (0 << 23)|(1 << 20)|(3 << 16)|(0 << 14)| 31 #define BPS_250K (0 << 23)|(1 << 20)|(3 << 16)|(0 << 14)| 15 #define BPS_500K (0 << 23)|(1 << 20)|(3 << 16)|(0 << 14)| 7 #define CAN1 0 #define CAN2 1 /**************************************************************************** * 名稱:PinSet(uint8 CanNum) * 功能:實現(xiàn)CAN接口硬件連接。 * 入口參數(shù):CanNum * 出口參數(shù):無 ****************************************************************************/ void PinSet(uint8 CanNum) { PCONP |=~((uint32)0x01<<(13+CanNum)); SWITCH(CanNum) { case CAN1: PINSEL1&=~((uint32)0x03<<18); PINSEL1|=((uint32)0x01<<18); break; case CAN2: PINSEL1&=~((uint32)0x0F<<14); PINSEL1|=((uint32)0x05<<14); break; default: break; } } /**************************************************************************** * 名稱:SetBaud(uint8 CanNum) * 功能:設(shè)置CAN通訊波特率。 * 入口參數(shù):CanNum * 出口參數(shù):無 ****************************************************************************/ void SetBaud(uint8 CanNum) { SWITCH(CanNum) { case CAN1: CAN1BTR=BPS_500K; break; case CAN2: CAN2BTR=BPS_500K; break; default: break; } } /**************************************************************************** * 名稱:SetWarmVal(uint8 CanNum) * 功能:設(shè)置錯誤寄存器值。 * 入口參數(shù):CanNum * 出口參數(shù):無 ****************************************************************************/ void SetWarmVal(uint8 CanNum) { SWITCH(CanNum) { case CAN1: CAN1EWL=0x60; break; case CAN2: CAN2EWL=0x60; break; default: break; } } /**************************************************************************** * 名稱:SetInterrupt(uint8 CanNum) * 功能:設(shè)置CAN通訊中斷。 * 入口參數(shù):無 * 出口參數(shù):無 ****************************************************************************/ void SetInterrupt(uint8 CanNum) { SWITCH(CanNum) { case CAN1: CAN1IER=0x01; break; case CAN2: CAN2IER=0x01; break; default: break; } } /**************************************************************************** * 名稱:InitCAN(uint8 CanNum) * 功能:初始化CAN控制器。 * 入口參數(shù):CanNum * 出口參數(shù):無 ****************************************************************************/ void InitCAN(uint8 CanNum) { PinSet(CanNum); SWITCH(CanNum) { case CAN1: CAN1MOD=CAN1MOD|0x01; SetWarmVal(CAN1); SetBaud(CAN1); SetInterrupt(CAN1); CAN1MOD=CAN1MOD&0xFE; break; case CAN2: CAN2MOD=CAN2MOD|0x01; SetWarmVal(CAN2); SetBaud(CAN2); SetInterrupt(CAN2); CAN2MOD=CAN2MOD&0xFE; break; default: break; } } /**************************************************************************** * 名稱:CAN1IntPrg(void) * 功能:CAN1口接收中斷程序 * 入口參數(shù):無 * 出口參數(shù):無 ****************************************************************************/ void __irq CANIntPrg(void) { uint32 dataA,dataB,dataID; unsigned LONG TEMP; TEMP=CAN1ICR; dataID=CAN1RID; dataA=CAN1RDA; dataB=CAN1RDB; CAN1CMR=CAN1CMR|0x04; VICVectAddr=0x00; } /**************************************************************************** * 名稱:CAN2SendMSG() * 功能:CAN2口發(fā)送信息。 * 入口參數(shù):msg * 出口參數(shù):無 ****************************************************************************/ void CAN2SendMSG() { uint32 index,buf[8]; uint8 i; for (i=0;i<8;i++) { buf[i]=9; } CAN2TFI1=0<<31|0<<30|8<<16|0x00; //標(biāo)準(zhǔn)數(shù)據(jù)幀,8位數(shù)據(jù) CAN2TID1=(3<<8)|0x02; CAN2TDA1=(buf[0])|(buf[1]<<8)|(buf[2]<<16)|(buf[3]<<24); CAN2TDB1=buf[4]|buf[5]<<8|buf[6]<<16|buf[7]<<24; CAN2CMR=1<<5|0x01; //正常發(fā)送 } /**************************************************************************** * 名稱:main() * 功能:實現(xiàn)系統(tǒng)通訊及控制功能。 * 入口參數(shù):無 * 出口參數(shù):無 ****************************************************************************/ int main (void) { unsigned LONG TEMP; TargetInit(); // 初始化系統(tǒng)時鐘 InitCAN(CAN1); // 初始化CAN1口 InitCAN(CAN2); // 初始化CAN2口 VICDefVectAddr=(uint32)CANIntPrg; VICIntEnable|=(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23); CAN2SendMSG(); //CAN2口發(fā)送信息 while(1); //等待CAN1口接收中斷 } /****** |
| 2樓: | >>參與討論 |
| 作者: sen_81 于 2006/3/24 9:19:00 發(fā)布:
你是用了《基礎(chǔ)與實戰(zhàn)》上的例子吧? 你換個工程模板試試。 我用光盤上project MODULE_new里面模板,然后將CAN-232添加進(jìn)去,也是進(jìn)不了中斷的;然后我后來比較了SRC的內(nèi)容,用了project MODULE目錄里的模板,正常進(jìn)中斷。 |
|
| 3樓: | >>參與討論 |
| 作者: bendanguo 于 2006/3/24 13:15:00 發(fā)布:
求助ARM2119的CAN中斷程序 樓上的老師能不能把您說的那個模板給我發(fā)一份啊!我的郵箱是bendanguo@126.com,我在光盤里面沒有找到,萬分感謝! |
|
| 4樓: | >>參與討論 |
| 作者: sen_81 于 2006/3/24 15:19:00 發(fā)布:
在光盤的\EXAMPLES目錄下 |
|
| 5樓: | >>參與討論 |
| 作者: ajing429 于 2006/3/24 16:56:00 發(fā)布:
我也求助過這個問題 如果你使用的工程模板,那么需要在startup.s中打開中斷,下面是startup.s中 的代碼: ;設(shè)置系統(tǒng)模式堆棧 MSR CPSR_c, #0xdf LDR SP, =StackUsr 將0xdf改為0x5f |
|
| 6樓: | >>參與討論 |
| 作者: ZorroCN 于 2006/3/24 19:38:00 發(fā)布:
禁止扔板兒磚 另外還有一個問題,就是如果已清零I位,這里 VICIntEnable|=(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23); 也就是說,CAN的所有接收,發(fā)送,以及其他異常都會引發(fā)中斷,也就是說,CAN2發(fā)送的同時,2119也會進(jìn)入你所定義的非向量中斷,也就是說程序雖然進(jìn)入了你的中斷函數(shù),但是引起這個中斷的卻不是你所希望的CAN1的接收中斷,而是CAN2的發(fā)送中斷。 所以這里應(yīng)該將CAN2發(fā)送中斷屏蔽掉 |
|
| 7樓: | >>參與討論 |
| 作者: bendanguo 于 2006/3/25 22:40:00 發(fā)布:
救命啊! 首先謝謝樓上各位的熱心幫助!可是小弟按照你們說的都試過了,還是不行,CAN1ICR能夠置位,可是進(jìn)不了中斷程序,還請各位指點(diǎn)!現(xiàn)在真是心急如焚阿! 謝謝了! |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |