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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 can總線通信[庫(kù)函數(shù)]

          stm32 can總線通信[庫(kù)函數(shù)]

          作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò) 收藏
          CAN是控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)的簡(jiǎn)稱,是由研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國(guó)BOSCH公司開(kāi)發(fā)了的,并最終成為國(guó)際標(biāo)準(zhǔn)(ISO118?8)。近年來(lái),其所具有的高可靠性和良好的錯(cuò)誤檢測(cè)能力受到重視,被廣泛應(yīng)用于汽車計(jì)算機(jī)控制系統(tǒng)和環(huán)境溫度惡劣、電磁輻射強(qiáng)和振動(dòng)大的工業(yè)環(huán)境。相比于I2C和SPI總線結(jié)構(gòu),can總線定義了更為優(yōu)秀的物理層、數(shù)據(jù)鏈路層,并擁有種類豐富、繁簡(jiǎn)不一的上層協(xié)議。
          CAN總線的物理連接只需要兩根線,通常稱為CAN_H和CAN_L,通常查分信號(hào)進(jìn)行數(shù)據(jù)的傳輸。CAN總線有兩種電平,分為隱性電平和顯性電平,這兩種電平表現(xiàn)為“與”的關(guān)系。
          • 若隱性電平相遇,則總線表現(xiàn)為隱性電平。
          • 若顯性電平相遇,則總線表現(xiàn)為顯性電平。
          • 若隱性電平和顯性電平相遇,則總線表現(xiàn)為顯性電平。
          CAN總線網(wǎng)絡(luò)是一種多主機(jī)網(wǎng)絡(luò),在總線處于空閑時(shí),任何一個(gè)節(jié)點(diǎn)都可以申請(qǐng)成為主機(jī),向總線發(fā)送消息,最先訪問(wèn)總線的節(jié)點(diǎn)單元可以獲得總線的控制權(quán)。
          CAN總線的所有消息都是以固定的形式打包發(fā)送的。兩個(gè)以上的節(jié)點(diǎn)單元同時(shí)發(fā)送數(shù)據(jù)時(shí),根據(jù)節(jié)點(diǎn)標(biāo)志符決定各自優(yōu)先關(guān)系。CAN總線并沒(méi)有類似其他的總線上的地址的概念,在總線上增加節(jié)點(diǎn)時(shí),連接節(jié)點(diǎn)的其他單元軟硬件什么都不需要改變。
          CAN總線的通信速率和總線長(zhǎng)度有關(guān),在總線長(zhǎng)度小于40m的場(chǎng)合中,數(shù)據(jù)傳輸速率可以達(dá)到1Mbps,即便長(zhǎng)度達(dá)到1000m,數(shù)據(jù)傳輸數(shù)率也可以達(dá)到50Kbps,無(wú)論在數(shù)率和傳輸距離上都由于常見(jiàn)的RS232、RS485和I2C總線。
          CAN總線在理論上節(jié)點(diǎn)數(shù)沒(méi)有上限,但是實(shí)際中受到總線上的時(shí)間延時(shí)和電氣負(fù)載的限制。降低節(jié)點(diǎn)數(shù)可以增大通信速率。
          Stm32 至少配備一個(gè)CAN總線控制器,最高速率可以達(dá)到1Mbps,支持11位的標(biāo)準(zhǔn)幀格式和29為的拓展幀格式的接收和發(fā)送,具備三個(gè)郵箱和2個(gè)接收FIFO,此外還有3級(jí)可編程濾波器。
          本例主要實(shí)現(xiàn)使用stm32的CAN總線實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收,使用串口觀察數(shù)據(jù)。

          本文引用地址:http://www.ex-cimer.com/article/201611/319914.htm
          庫(kù)函數(shù)操作
          CAN 通信 過(guò)濾器 和 屏蔽器 :
          例如設(shè)置某接收濾波寄存器00000000001(11位),接收屏蔽寄存器11111111101(11位),則該對(duì)組合會(huì)拒絕接收00000000011和00000000001之外所有的標(biāo)識(shí)符對(duì)應(yīng)的CAN幀,因?yàn)槠帘纹饕?guī)定第二位(為0)以外的所有標(biāo)識(shí)符位要嚴(yán)格匹配(與濾波器值一致),第二位的濾波器值和收到的CAN標(biāo)識(shí)符第二位值是否一致都可以.
          main.c
          view source
          print?
          001#include "stm32f10x.h"
          002#include "stdio.h"
          003
          004#define PRINTF_ON 1
          005
          006void RCC_Configuration(void);
          007void GPIO_Configuration(void);
          008void USART_Configuration(void);
          009void CAN_Configuration(void);
          010void NVIC_Configuration(void);
          011
          012u8 TransmitMailbox = 0;
          013CanTxMsg TxMessage;
          014CanRxMsg RxMessage;
          015
          016int main(void)
          017{
          018RCC_Configuration();
          019GPIO_Configuration();
          020USART_Configuration();
          021CAN_Configuration();
          022
          023
          024TxMessage.ExtId = 0x00AA0000;
          025TxMessage.RTR = CAN_RTR_DATA;
          026TxMessage.IDE = CAN_ID_EXT;
          027TxMessage.DLC = 8;
          028TxMessage.Data[0] = 0x00;
          029TxMessage.Data[1] = 0x12;
          030TxMessage.Data[2] = 0x34;
          031TxMessage.Data[3] = 0x56;
          032TxMessage.Data[4] = 0x78;
          033TxMessage.Data[5] = 0xAB;
          034TxMessage.Data[6] = 0xCD;
          035TxMessage.Data[7] = 0xEF;
          036
          037TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
          038while(CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK);
          039printf("rn The CAN has send data: %d ,%d,%d ,%d,%d ,%d,%d ,%d rn",
          040TxMessage.Data[0],
          041TxMessage.Data[1],
          042TxMessage.Data[2],
          043TxMessage.Data[3],
          044TxMessage.Data[4],
          045TxMessage.Data[5],
          046TxMessage.Data[6],
          047TxMessage.Data[7]
          048);
          049
          050while(CAN_MessagePending(CAN1,CAN_FIFO0) == 0);
          051
          052//RxMessage.StdId = 0x00;
          053RxMessage.IDE = CAN_ID_EXT;
          054RxMessage.DLC = 0;
          055RxMessage.Data[0] = 0x00;
          056RxMessage.Data[1] = 0x00;
          057RxMessage.Data[2] = 0x00;
          058RxMessage.Data[3] = 0x00;
          059RxMessage.Data[4] = 0x00;
          060RxMessage.Data[5] = 0x00;
          061RxMessage.Data[6] = 0x00;
          062RxMessage.Data[7] = 0x00;
          063
          064CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
          065printf("rn The CAN has receive data : %d,%d,%d,%d,%d,%d,%d,%d rn",
          066RxMessage.Data[0],
          067RxMessage.Data[1],
          068RxMessage.Data[2],
          069RxMessage.Data[3],
          070RxMessage.Data[4],
          071RxMessage.Data[5],
          072RxMessage.Data[6],
          073RxMessage.Data[7]
          074);
          075
          076while(1);
          077}
          078
          079void CAN_Configuration(void)
          080{
          081CAN_InitTypeDef CAN_InitStructure;
          082CAN_FilterInitTypeDef CAN_FilterInitStructure;
          083
          084CAN_DeInit(CAN1);
          085CAN_StructInit(&CAN_InitStructure);
          086
          087CAN_InitStructure.CAN_TTCM = DISABLE;
          088CAN_InitStructure.CAN_ABOM = DISABLE;
          089CAN_InitStructure.CAN_AWUM = DISABLE;
          090CAN_InitStructure.CAN_NART = DISABLE;
          091CAN_InitStructure.CAN_RFLM = DISABLE;
          092CAN_InitStructure.CAN_TXFP = DISABLE;
          093CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
          094CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
          095CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
          096CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
          097CAN_Init(CAN1,&CAN_InitStructure);
          098
          099CAN_FilterInitStructure.CAN_FilterNumber = 0;
          100CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
          101CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
          102CAN_FilterInitStructure.CAN_FilterIdHigh = 0x00AA << 3; //匹配過(guò)濾寄存器,因?yàn)閿?shù)據(jù)標(biāo)志符段 還有 IDE ,RTR 和一個(gè)補(bǔ)零位 所以左移三位
          103CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
          104CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x00FF << 3 ; //匹配屏蔽寄存器
          105CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
          106CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
          107
          108CAN_FilterInit(&CAN_FilterInitStructure);
          109
          110
          111}
          112
          113
          114void GPIO_Configuration(void)
          115{
          116GPIO_InitTypeDef GPIO_InitStructure;
          117
          118GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          119
          120GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
          121GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
          122GPIO_Init(GPIOB , &GPIO_InitStructure);
          123
          124GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
          125GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          126GPIO_Init(GPIOB , &GPIO_InitStructure);
          127
          128
          129GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          130GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          131GPIO_Init(GPIOA , &GPIO_InitStructure);
          132
          133GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
          134GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          135GPIO_Init(GPIOA , &GPIO_InitStructure);
          136}
          137
          138void RCC_Configuration(void)
          139{
          140
          141ErrorStatus HSEStartUpStatus;
          142
          143
          144RCC_DeInit();
          145
          146RCC_HSEConfig(RCC_HSE_ON);
          147
          148HSEStartUpStatus = RCC_WaitForHSEStartUp();
          149
          150if(HSEStartUpStatus == SUCCESS)
          151{
          152
          153RCC_HCLKConfig(RCC_SYSCLK_Div1);
          154
          155RCC_PCLK2Config(RCC_HCLK_Div1);
          156
          157RCC_PCLK1Config(RCC_HCLK_Div2);
          158
          159FLASH_SetLatency(FLASH_Latency_2);
          160
          161FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
          162
          163RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
          164
          165RCC_PLLCmd(ENABLE);
          166
          167while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
          168
          169RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
          170
          171while(RCC_GetSYSCLKSource() != 0x08);
          172}
          173
          174RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
          175
          176//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
          177
          178RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
          179//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG|RCC_APB1Periph_SPI2|RCC_APB1Periph_I2C1|RCC_APB1Periph_I2C2, ENABLE);
          180
          181}
          182
          183
          184void USART_Configuration(void)
          185{
          186USART_InitTypeDef USART_InitStructure;
          187USART_ClockInitTypeDef USART_ClockInitStructure;
          188
          189USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
          190USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
          191USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
          192USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
          193USART_ClockInit(USART1 , &USART_ClockInitStructure);
          194
          195USART_InitStructure.USART_BaudRate = 9600;
          196USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          197USART_InitStructure.USART_StopBits = USART_StopBits_1;
          198USART_InitStructure.USART_Parity = USART_Parity_No;
          199USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
          200USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
          201USART_Init(USART1,&USART_InitStructure);
          202
          203USART_Cmd(USART1,ENABLE);
          204}
          205
          206#if PRINTF_ON
          207
          208int fputc(int ch,FILE *f)
          209{
          210USART_SendData(USART1,(u8) ch);
          211while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
          212return ch;
          213}
          214
          215#endif



          關(guān)鍵詞: stm32can總線通信庫(kù)函

          評(píng)論


          技術(shù)專區(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); })();