<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM32_MDK_bxCAN

          作者: 時(shí)間:2016-12-03 來(lái)源:網(wǎng)絡(luò) 收藏
          今天整理下CAN方面的資料,首先使用的是stm32f103vet6,只有一個(gè)CAN(2.0A & 2.0B)。CAN本身是工作的數(shù)據(jù)鏈路層的總線(xiàn),有很多優(yōu)勢(shì)就不再一一介紹了,隨便買(mǎi)本書(shū)看看都有。

          基礎(chǔ)的CAN的知識(shí)就不贅述了,這些是必要的可以自己去買(mǎi)書(shū)了解,現(xiàn)在來(lái)看下STM32下對(duì)CAN的驅(qū)動(dòng),STM32本身包括了CAN的數(shù)據(jù)鏈路層,然后物理層就是CAN收發(fā)器用的是TJA1050,是非容錯(cuò)CAN。終端電阻用120歐姆。

          本文引用地址:http://www.ex-cimer.com/article/201612/325151.htm

          說(shuō)道CAN最主要的是CAN的初始化,他包括兩個(gè)主要的部分,一個(gè)是基本屬性的聲明,另一部分就是過(guò)濾器的設(shè)置。見(jiàn)如下代碼:

          /*******************************************************************************
          * Function Name : bxCAN_Port_Configuration
          * Description : CAN端口設(shè)置
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void bxCAN_Port_Configuration(void)
          {
          GPIO_InitTypeDef GPIO_InitStructure_bxCAN;

          GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE); //端口復(fù)用為CAN1

          GPIO_InitStructure_bxCAN.GPIO_Pin = GPIO_Pin_8; //PB8:CAN-RX
          GPIO_InitStructure_bxCAN.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
          GPIO_InitStructure_bxCAN.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure_bxCAN);

          GPIO_InitStructure_bxCAN.GPIO_Pin = GPIO_Pin_9; //PB9:CAN-TX
          GPIO_InitStructure_bxCAN.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用模式
          GPIO_InitStructure_bxCAN.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure_bxCAN);
          }

          /*******************************************************************************
          * Function Name : bxCAN_Property_Configuration
          * Description : CAN配置具體屬性
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void bxCAN_Property_Configuration(void)
          {
          CAN_InitTypeDef CAN_InitStructure;
          CAN_FilterInitTypeDef CAN_FilterInitStructure;

          /* CAN register init */
          CAN_DeInit(CAN1);
          CAN_StructInit(&CAN_InitStructure);

          /* CAN cell init */
          CAN_InitStructure.CAN_TTCM=DISABLE; //MCR-TTCM 禁止時(shí)間觸發(fā)通信模式
          CAN_InitStructure.CAN_ABOM=DISABLE;//MCR-ABOM 禁止自動(dòng)離線(xiàn)管理
          CAN_InitStructure.CAN_AWUM=DISABLE;//MCR-AWUM 通過(guò)清除CAN_MCR_SLEEP位進(jìn)入自動(dòng)喚醒模式
          CAN_InitStructure.CAN_NART=DISABLE;//MCR-NART 禁止報(bào)文自動(dòng)重傳 0-自動(dòng)重傳 1-報(bào)文只傳一次
          CAN_InitStructure.CAN_RFLM=DISABLE;//MCR-RFLM 接收FIFO 鎖定模式 0-溢出時(shí)新報(bào)文會(huì)覆蓋原有報(bào)文 1-溢出時(shí),新報(bào)文丟棄
          CAN_InitStructure.CAN_TXFP=DISABLE;//MCR-TXFP 發(fā)送FIFO優(yōu)先級(jí) 0-優(yōu)先級(jí)取決于報(bào)文標(biāo)示符 1-優(yōu)先級(jí)取決于發(fā)送請(qǐng)求的順序
          CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;//BTR-SILM/LBKM CAN環(huán)回模式
          // CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;// CAN正常模式
          CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //BTR-SJW 重新同步跳躍寬度 1個(gè)時(shí)間單元
          CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;//BTR-TS1 時(shí)間段1 占用了2個(gè)時(shí)間單元
          CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;//BTR-TS1 時(shí)間段2 占用了3個(gè)時(shí)間單元

          #if CAN_BAUDRATE == 1000 /* 1MBps *///BTR-BRP 波特率分頻器 定義了時(shí)間單元的時(shí)間長(zhǎng)度 36/(1+2+3)/6=1Mbps
          CAN_InitStructure.CAN_Prescaler = 6;
          #elif CAN_BAUDRATE == 500 /* 500KBps */
          CAN_InitStructure.CAN_Prescaler = 12;
          #elif CAN_BAUDRATE == 250 /* 250KBps */
          CAN_InitStructure.CAN_Prescaler = 24;
          #elif CAN_BAUDRATE == 125 /* 125KBps */
          CAN_InitStructure.CAN_Prescaler = 48;
          #elif CAN_BAUDRATE == 100 /* 100KBps */
          CAN_InitStructure.CAN_Prescaler = 60;
          #elif CAN_BAUDRATE == 50 /* 50KBps */
          CAN_InitStructure.CAN_Prescaler = 120;
          #elif CAN_BAUDRATE == 20 /* 20KBps */
          CAN_InitStructure.CAN_Prescaler = 300;
          #elif CAN_BAUDRATE == 10 /* 10KBps */
          CAN_InitStructure.CAN_Prescaler = 600;
          #endif
          CAN_Init(CAN1, &CAN_InitStructure);//初始化CAN寄存器

          /* CAN filter init */
          CAN_FilterInitStructure.CAN_FilterNumber=1; // 選擇過(guò)濾器編號(hào)
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;// 選擇過(guò)濾器類(lèi)型為屏蔽位模式
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; // 選擇過(guò)濾器位寬為一個(gè)32位過(guò)濾器
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 標(biāo)識(shí)符匹配
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;// 標(biāo)識(shí)符屏蔽位,1:必須匹配,0:不用關(guān)心
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; // 選擇存放在關(guān)聯(lián)的FIFO為FIFO0
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 激活過(guò)濾器
          CAN_FilterInit(&CAN_FilterInitStructure);// 初始化過(guò)濾器

          /* CAN FIFO0 message pending interrupt enable */
          CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);// 設(shè)置CAN1,F(xiàn)IFO0接收中斷使能
          // CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE);
          }

          /*******************************************************************************
          * Function Name : bxCAN_Configuration
          * Description : CAN初始化
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void bxCAN_Configuration(void)
          {
          bxCAN_Port_Configuration();
          bxCAN_Property_Configuration();
          }

          /*******************************************************************************
          * Function Name : Interrupt_Handle_bxCAN
          * Description : 中斷服務(wù)函數(shù)
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void Interrupt_Handle_bxCAN(void)
          {
          CanRxMsg RxMessage;

          RxMessage.StdId=0x00;
          RxMessage.ExtId=0x00;
          RxMessage.IDE=0;
          RxMessage.DLC=0;
          RxMessage.FMI=0;
          RxMessage.Data[0]=0x00;
          RxMessage.Data[1]=0x00;

          CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
          }

          初始化第一部分基本屬性設(shè)置,要看下datasheet中,CAN的發(fā)送流程和接受流程,然后看下他相關(guān)的狀態(tài)寄存器就知道其意義了。在過(guò)濾器設(shè)置部分,要理解他兩種模式的不同之處,屏蔽位模式就是給出 一個(gè)參考值然后用屏蔽屬性去匹配,列表模式就是直接根據(jù)寄存器的參考值進(jìn)行全匹配。這里對(duì)屏蔽位我也沒(méi)有做特殊的設(shè)置,就設(shè)置全部接受。
          本歷程只實(shí)現(xiàn)了發(fā)送標(biāo)準(zhǔn)幀,擴(kuò)展幀,接受幀數(shù)據(jù)。
          接收程序使用中斷方式,見(jiàn)上面代碼函數(shù)Interrupt_Handle_bxCAN(),發(fā)送代碼如下:

          void Send_Std_KLS_KL15(unsigned char value)
          {
          CanTxMsg TxMessage;

          TxMessage.StdId=0x570;
          TxMessage.IDE=CAN_ID_STD;
          TxMessage.RTR=CAN_RTR_DATA;
          TxMessage.DLC=8;
          TxMessage.Data[0]=value;
          TxMessage.Data[1]=0x00;
          TxMessage.Data[2]=0x00;
          TxMessage.Data[3]=0x00;
          TxMessage.Data[4]=0x00;
          TxMessage.Data[5]=0x00;
          TxMessage.Data[6]=0x00;
          TxMessage.Data[7]=0x00;

          CAN_Transmit(CAN1, &TxMessage);
          }

          這個(gè)是發(fā)送一個(gè)標(biāo)準(zhǔn)幀,如果發(fā)送擴(kuò)展幀 如下:

          void Send_Exd_message(void)
          {
          CanTxMsg TxMessage;

          TxMessage.StdId=0x0000;
          TxMessage.ExtId=0x1234;
          TxMessage.IDE=CAN_ID_EXT;
          TxMessage.RTR=CAN_RTR_DATA;
          TxMessage.DLC=2;
          TxMessage.Data[0]=0xDE;
          TxMessage.Data[1]=0xCA;
          CAN_Transmit(CAN1, &TxMessage);
          }

          由于CAN透明化了數(shù)據(jù)鏈路層,所以在實(shí)際應(yīng)用中只要用好屏蔽位就能夠高效的使用CAN網(wǎng)絡(luò)。


          關(guān)鍵詞: STM32MDKbxCA

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();