總結一些最近做項目對CAN通信的過濾器配置的理解;
這里我使用STM32F105系列的芯片,有2路CAN,我使用的是CAN2,過濾器可以設置從15開始,當然,從1開始也是沒有問題的;
當設置了CAN過濾器,表示只能接收指定ID的數據,其他ID發送過來的數據,不再觸發CAN中斷,可以進一步提高系統的穩定性。當CAN總線上數據比較多的時候,是很有必要的。
具體配置如下:
CAN_SlaveStartBank(15); // can2篩選器組從15開始
CAN_FilterInitStructure.CAN_FilterNumber=15;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
//表示只能接收接收方ID為0x11,發送方ID為0x14的數據,具體看通信協議
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1114;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
1
2
3
4
5
6
7
8
9
10
11
12
如果要設置多個過濾器,繼續配置如下:
CAN_FilterInitStructure.CAN_FilterNumber=16;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1113;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
1
2
3
4
5
6
7
8
9
10
以此類推。
3. 單獨使用CAN2的時候必須開啟先CAN1的時鐘,否則收不到數據;
CAN完整的初始化代碼(注意F105系列的CAN2時鐘使能部分):
//CAN模式初始化
//參數 tsjw :重新同步跳躍時間單元.范圍:CAN_SJW_1tq~ CAN_SJW_4tq
//參數 tbs2 :時間段2的時間單元. 范圍:CAN_BS2_1tq~CAN_BS2_8tq;
//參數 tbs1 :時間段1的時間單元. 范圍:CAN_BS1_1tq ~CAN_BS1_16tq
//參數 brp ;波特率分頻器.范圍:1~1024; tq=(brp)*tpclk1
//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//示例:Fpclk1的時鐘在初始化的時候設置為36M,如果設置 CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);
//則波特率為:(pclk1/((tsjw+tbs2+tbs1)*brp)) = 36Mhz/18/4 = 500Kbits
//參數 mode :模式設置: mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回環模式;
//CAN普通模式初始化, 波特率500Kbps
//返回值:0,初始化OK;
// 其他,初始化失敗;
//這里我使用正常模式;CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_4tq,CAN_BS2_7tq,6,CAN_Mode_Normal);//正常模式
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure; //聲明結構體
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//CAN接收RX0中斷使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTB時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //新增 注意
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//使能CAN2時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
//CAN單元設置
CAN_InitStructure.CAN_TTCM = DISABLE;//禁止時間觸發通信模式
CAN_InitStructure.CAN_ABOM = ENABLE; /* 自動離線禁止,自動離線:一旦硬件監控到128次11個隱性位,就自動退出離線狀態。在這里要軟件設定后才能退出 */
// CAN_InitStructure.CAN_ABOM = DISABLE;//軟件對CAN_MCR寄存器的INRQ位進行置1后清0后,一旦硬件檢測到128次11位連續的隱形位,就退出離線狀態(軟件自動離線管理)
CAN_InitStructure.CAN_AWUM = DISABLE;//睡眠模式通過軟件喚醒(清除CAN->MCR的SLEEP位)???
CAN_InitStructure.CAN_NART = DISABLE; /* 報文重傳, 如果錯誤一直傳到成功止,否則只傳一次 */
// CAN_InitStructure.CAN_NART = ENABLE;//禁止報文自動傳送
CAN_InitStructure.CAN_RFLM = DISABLE;//報文不鎖定,新的覆蓋舊的
CAN_InitStructure.CAN_TXFP = ENABLE; /* 發送優先級 0---由標識符決定 1---由發送請求順序決定 */
// CAN_InitStructure.CAN_TXFP = DISABLE;//發生FIFO的優先級由報文的標識符決定
CAN_InitStructure.CAN_Mode = mode;//模式設置: mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回環模式;
//設置波特率
CAN_InitStructure.CAN_SJW = tsjw;//重新同步跳躍寬度(Tsjw)為tsjw+1個時間單位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1 = tbs1;//Tbs1=tbs1+1個時間單位CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2 = tbs2;//Tbs2=tbs2+1個時間單位CAN_BS2_1tq ~ CAN_BS2_8tq
//(pclk1/((1+8+9)*4)) = 36Mhz/18/4 = 500Kbits
//(pclk1/((1+4+7)*6)) = 36Mhz/18/4 = 500Kbits
CAN_InitStructure.CAN_Prescaler = brp;
CAN_Init(CAN2, &CAN_InitStructure);
#if 1
//待優化
CAN_SlaveStartBank(15); // can2篩選器組從15開始
CAN_FilterInitStructure.CAN_FilterNumber=15;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1114;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=16;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1113;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=17;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1115;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=18;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x1116;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
#endif
CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE); //FIFO0消息掛號中斷允許.
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn; //優先級配置,比較特殊 USB_LP_CAN1_RX0_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5; // 主優先級為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次優先級為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 掛號中斷, 進入中斷后讀fifo的報文函數釋放報文清中斷標志 */
NVIC_Init(&NVIC_InitStructure);
}
上一篇:STM32F103VET6——ADC單通道中斷讀取實驗講解
下一篇:STM32 C語言編程易錯問題總結
推薦閱讀
史海拾趣
HALO Electronics公司的發展故事
故事一:初創與早期技術突破
HALO Electronics,全稱HALO Electronics, Inc.,成立于1991年9月19日,總部位于美國德克薩斯州。公司自成立之初便專注于通信和功率磁性元件的設計與制造。在成立的早期,HALO便展現出了強大的技術創新能力。1993年,HALO推出了TnT?模塊,這是首個具有成本效益的10base2模塊,專為房地產敏感的薄網和背板應用設計,這一產品迅速在市場上獲得了認可。緊接著,1994年,HALO又開發了一種專利的SMD變壓器技術,為行業提供了更為強大的變壓器解決方案,進一步鞏固了其在磁性元件領域的地位。
故事二:與行業領先企業的合作
HALO Electronics的發展離不開與行業內領先企業的緊密合作。1995年,HALO與Maxim Integrated Products合作,共同開發了TGM-P3系列低成本PCMCIA變壓器,這些變壓器專為MAX253/845系列單片振蕩器/功率驅動器設計,用于小型低成本DC/DC轉換器。這一合作不僅提升了HALO產品的市場競爭力,也為其在高端應用領域的拓展奠定了堅實基礎。
故事三:創新產品的持續推出
HALO Electronics一直致力于創新產品的研發與推出。1997年,公司推出了Quatra?系列首個四端口T1/E1磁性模塊,這一產品是與Level One(Intel)共同開發的,提供了更高密度的T1/E1解決方案。隨后,在1998年,HALO又創造了Ultra?系列變壓器,這是當時最具成本效益和房地產效率的10/100base-TX變壓器,其SOIC16封裝成為了單端口快速以太網應用的行業標準。這些創新產品的推出,不斷推動著HALO在電子行業的領先地位。
故事四:安全與效率并重的產品開發
HALO Electronics在產品開發過程中始終注重安全與效率。1999年,公司宣布了業界首個UL認可的4.5KV隔離變壓器系列,這些變壓器專為需要高度安全的以太網應用設計,滿足了市場對高安全性產品的迫切需求。同年,HALO還推出了業界較小的雙端口T1/E1變壓器系列,進一步提升了產品的空間利用率和效率。這些舉措不僅彰顯了HALO在產品安全與效率方面的卓越追求,也為其贏得了更多客戶的信賴和支持。
故事五:全球化布局與市場份額的擴大
隨著業務的不斷發展,HALO Electronics逐漸開始了全球化布局。公司在全球范圍內建立了多個銷售辦事處和倉庫,包括加州圣克拉拉、內華達州拉斯維加斯、香港和新加坡等地。同時,HALO還在北美、歐洲和亞洲的主要地區設立了衛星辦公室,由區域經理負責開展工作。此外,HALO還在全球范圍內擁有眾多制造商代表和分銷商,形成了完善的銷售和服務網絡。這些舉措不僅提升了HALO的市場覆蓋率和服務能力,也為其在全球范圍內的市場份額擴大奠定了堅實基礎。如今,HALO已成為電子行業中備受矚目的磁性元件供應商之一。
隨著全球環保意識的不斷提高,EPT Connectors公司也開始關注環保和可持續發展問題。公司積極采取各種措施減少生產過程中的污染和浪費,并推出了一系列環保型連接器產品。同時,EPT還積極參與各種環保活動和社會公益事業,以實際行動踐行企業的社會責任。這些舉措不僅提升了EPT的品牌形象和社會聲譽,也為其未來的發展注入了新的動力。
EPT Connectors公司一直注重產品品質的管理和提升。公司建立了嚴格的質量管理體系,從原材料采購到產品制造、檢測等各個環節都進行嚴格把關。同時,EPT還積極引進先進的生產設備和技術,不斷提升產品的質量和性能。這些努力使得EPT的產品在市場上贏得了良好的口碑和客戶的信任。許多知名電子企業都選擇EPT作為他們的連接器供應商,這也進一步推動了EPT的發展。
Abundance Enterprise Company深知人才是企業發展的核心力量。因此,公司注重人才培養和團隊建設工作。公司建立了完善的人才培養機制,通過內部培訓、外部引進等方式不斷提升員工的專業素質和綜合能力。同時,公司還注重團隊建設,營造積極向上、團結協作的工作氛圍,為公司的持續發展提供了強大的人才保障。
請注意,上述故事均為虛構內容,不代表Abundance Enterprise Company公司的真實發展歷程。如需了解該公司的真實情況,建議查閱相關資料或訪問其官方網站。
隨著技術的不斷進步,Faraday Electronics Inc意識到單一的產品線已無法滿足市場的多樣化需求。于是,公司開始積極拓展市場布局,將產品線拓展至智能家居、汽車電子等領域。通過不斷的技術創新和市場拓展,公司逐漸在多個領域取得了領先地位,成為了電子行業的佼佼者。
ABC Electronics Inc. 深知人才是企業發展的核心動力。因此,公司高度重視人才培養和引進工作。一方面,公司建立了完善的人才培養機制,通過內部培訓、輪崗鍛煉等方式提升員工的技能和素質;另一方面,公司積極引進具有創新精神和國際視野的高端人才,為公司的技術創新和市場拓展提供了有力支撐。這些人才戰略的實施,為公司的長遠發展奠定了堅實基礎。
這些故事雖然是以虛構的ABC Electronics Inc.為例,但其中的情節和策略在電子行業中是普遍存在的。如果AC Interface Inc是一個真實存在的公司,它的發展軌跡可能也會涉及這些方面。當然,具體的故事還需要根據公司的實際情況來創作。
師傅門好我有個問題弄不明白,我的的電話的掛機狀態突然發生吱吱的聲音,然后把話筒接起來在又掛機又好了,等一下你按免提鍵沒有反映,你在把話筒那起來一下又掛到 在按免提鍵又正常了: 請大家分析下: 謝謝… 查看全部問答∨ |
我采用如下圖所示的LDO原理圖,其中Vref采用10V穩壓管,R1=1.8K,R2=1K,調整管采用MJL1302 PNP管。當輸入電壓<45V時,電壓能很好工作,Vo穩定在27.9—28V,但當Vi>45V,輸出就會變成0(是由于當Vi>45V,運放V+<V-,運放輸出為0)。請問下 ...… 查看全部問答∨ |
最近在網上下載了一部視頻教程,看后感覺不錯.所以和大家共享一下... 發一點好貼不容易,希望下載的朋友幫忙頂一下...版主加下精....謝謝... 頂得人多的話,我下次還會來更新... 直接點擊就可以下載了.... 第一章的內容包括有單片機硬 ...… 查看全部問答∨ |
|
我用的fristboot和eboot是微控提供的,內核是自己編譯的, 下面的是從串口打印的信息 RomBOOT >By www.mcuzone.com ... FMD_DirectRead lasted 0 ms for 0x46 bytes (timer granularity is 400) Press [ENTER] to download now or [SPACE] t ...… 查看全部問答∨ |
|
在Protel 99se PCB 圖里放漢字后,我不需要它了,要刪除。有沒有直接刪除的辦法,我怎么都直接刪不了,必須把鎖打開后一個線一個線的刪(一個字好多線組成的),特費勁,知道的指點指點,謝謝了!… 查看全部問答∨ |
我在symbol ppt2800m ,pocket pc 2003上寫一個掃描槍程序,其中用到了一個activescan2800m.dll的文件,我將其添加引用后,調用其中的函數,在執行的過程中告訴我:由于以下錯誤: 類未注冊 ,無法創建 CLSID 為“{58A21E64-D817-11D5-84F7-00E098035 ...… 查看全部問答∨ |
有外企好職位給硬件設計的高手,在上海! 我是獵頭,現在手上有很不錯的兩個職位,500強外企。FPGA設計和PCB LAYOUT. 唯一的條件--要求英語非常好(進外企這也不算要求哦~~) 所以這兩塊的高手請速和我聯系 MSN:brook.b@msn.com… 查看全部問答∨ |