找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4469|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

STM32CAN通信不能正常通信求解。▋(nèi)附代碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:714887 發(fā)表于 2020-5-11 10:28 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. //S選擇模式 高速 接地 靜默模式 接高電 PA15
  2. //PA11 CANRX PA12 CANTX
  3. //can總線io口配置初始化
  4. void can_io_init(void)
  5. {
  6.        
  7.         GPIO_InitTypeDef GPIO_Structure;
  8.        
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   
  10. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  11.        
  12.          GPIO_Structure.GPIO_Pin=GPIO_Pin_12; //管腳
  13.          GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz;      //輸出速度
  14.          GPIO_Structure.GPIO_Mode=GPIO_Mode_AF_PP;  //復(fù)用推挽輸出
  15.          GPIO_Init(GPIOA,&GPIO_Structure);  //初始化PA12       
  16.          
  17.          GPIO_Structure.GPIO_Pin=GPIO_Pin_11; //管腳
  18.          GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz;      
  19.          GPIO_Structure.GPIO_Mode=GPIO_Mode_IPU;  //上拉輸入
  20.          GPIO_Init(GPIOA,&GPIO_Structure);  //初始化PA11
  21.        
  22.          GPIO_Structure.GPIO_Pin=GPIO_Pin_15; //管腳
  23.          GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz;      
  24.          GPIO_Structure.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽輸出
  25.          GPIO_Init(GPIOA,&GPIO_Structure);  //初始化PA15
  26.          GPIO_ResetBits(GPIOA,GPIO_Pin_15);   //寫(xiě)低電平
  27. }
  28. //can總線工作模式設(shè)置
  29. void can_structure(void)
  30. {
  31.    //主控MCR寄存器設(shè)置 can工作模式
  32.          CAN_InitTypeDef CAN_InitStructure;
  33.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); //打開(kāi)can1時(shí)鐘總線
  34.          CAN_DeInit(CAN1); //清除can通訊寄存器
  35.        
  36.         CAN_StructInit(&CAN_InitStructure);
  37.          CAN_InitStructure.CAN_TXFP=DISABLE;   //優(yōu)先級(jí)由報(bào)文標(biāo)識(shí)符決定
  38.          CAN_InitStructure.CAN_RFLM=DISABLE; //三個(gè)郵箱收滿時(shí) 溢出時(shí)覆蓋原有的報(bào)文
  39.         CAN_InitStructure.CAN_NART=ENABLE;         //報(bào)文發(fā)送失敗時(shí)會(huì)不斷的繼續(xù)發(fā)送
  40.         CAN_InitStructure.CAN_AWUM=DISABLE; //檢測(cè)到報(bào)文,自動(dòng)喚醒can
  41.          CAN_InitStructure.CAN_ABOM=DISABLE;// 離線過(guò)程 對(duì)INRQ置1 在清0初始化can寄存器如果還是檢測(cè)到隱性就自動(dòng)退出
  42.          CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時(shí)間觸發(fā)通訊模式
  43.          CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//正常模式
  44.         //can 波特率設(shè)置 位時(shí)序 baud=1/正常位時(shí)間 baud=1mbps
  45.          CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度為1個(gè)時(shí)間單位
  46.          CAN_InitStructure.CAN_BS1=CAN_BS1_7tq;//時(shí)間段1占用8個(gè)時(shí)間單位
  47.          CAN_InitStructure.CAN_BS2=CAN_BS2_4tq; //時(shí)間段2占用7個(gè)時(shí)間單位
  48.          CAN_InitStructure.CAN_Prescaler=6;  //分頻系數(shù)5
  49.          CAN_Init(CAN1,&CAN_InitStructure); //初始化can1
  50. }
  51. //can濾波器設(shè)置函數(shù) 接收
  52. void Filter_Sturcture(void)
  53. {
  54.    CAN_FilterInitTypeDef CAN_FilterStructure;
  55.          CAN_FilterStructure.CAN_FilterNumber=0;  //過(guò)濾器0
  56.         CAN_FilterStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//標(biāo)識(shí)符屏蔽位
  57.         CAN_FilterStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32 位寬
  58.         CAN_FilterStructure.CAN_FilterIdHigh=0x0000;////32 位 標(biāo)識(shí)符
  59.         CAN_FilterStructure.CAN_FilterIdLow=0x0000;
  60.         CAN_FilterStructure.CAN_FilterMaskIdHigh=0x0000;//32 位 MASK屏蔽寄存器
  61.         CAN_FilterStructure.CAN_FilterMaskIdLow=0x0000;
  62.    
  63.         CAN_FilterStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;// FIFO0
  64.         CAN_FilterStructure.CAN_FilterActivation=ENABLE; //激活過(guò)濾器 0
  65.         CAN_FilterInit(&CAN_FilterStructure);  //初始化過(guò)濾器0
  66.         CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);  //FIFO0使能can通訊中斷 接收 //發(fā)送CAN_IT_TME
  67.    //發(fā)送中斷
  68.    CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE); //發(fā)送郵箱空中斷
  69. //         CAN_ITConfig(CAN1,CAN_IT_FF0,ENABLE);
  70. }
  71. void can_nvic_structure(void)
  72. {
  73.         // CAN1_RX1_IRQn處理FIFO1中斷
  74.         NVIC_InitTypeDef NVIC_InitStructure;
  75.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中斷組別1
  76.         NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;//設(shè)置can總線中斷線FIF0
  77.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//搶占優(yōu)先級(jí)0
  78.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應(yīng)優(yōu)先級(jí)
  79.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
  80.         NVIC_Init(&NVIC_InitStructure);
  81.        
  82.         NVIC_InitStructure.NVIC_IRQChannel=USB_HP_CAN1_TX_IRQn;//設(shè)置can總線中斷線
  83.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//搶占優(yōu)先級(jí)0
  84.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//響應(yīng)優(yōu)先級(jí)
  85.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
  86.         NVIC_Init(&NVIC_InitStructure);
  87.         //USB_LP_CAN1_RX0_IRQn互聯(lián)型 如上
  88. }
  89. //can初始化函數(shù)
  90. void can_Init(void)
  91. {
  92.         can_io_init();
  93.         can_structure();
  94.         Filter_Sturcture();
  95.         can_nvic_structure();
  96. }
  97. //發(fā)送數(shù)據(jù)函數(shù)
  98. //return 0;發(fā)送成功
  99. //    其他;失敗
  100. u8 can_senddate(u8 *date,u8 len)
  101. {
  102.    u8 i=0,j=0,mbox=0;
  103.         //設(shè)定標(biāo)識(shí)符 共11位 取值范圍 0~0x7FF
  104.         //決定該幀優(yōu)先級(jí) 數(shù)值越小 優(yōu)先級(jí)越高
  105.          CanTxMsg CanTxMsgStructure;
  106.          CanTxMsgStructure.StdId=0x314; //標(biāo)準(zhǔn)標(biāo)識(shí)符
  107.          CanTxMsgStructure.ExtId=0;//設(shè)定擴(kuò)展標(biāo)識(shí)符 共18bit 取值范圍 0~0x3FFFF
  108.    CanTxMsgStructure.IDE=CAN_ID_STD; //標(biāo)準(zhǔn)格式
  109.          CanTxMsgStructure.RTR=CAN_RTR_Data; //數(shù)據(jù)幀
  110.          CanTxMsgStructure.DLC=len; //數(shù)據(jù)長(zhǎng)度
  111.          for(i=0;i<len;i++)
  112.          {
  113.             CanTxMsgStructure.Data[i]=date[i];//can總線上裝載數(shù)據(jù)
  114.          }
  115.          mbox=CAN_Transmit(CAN1,&CanTxMsgStructure); //發(fā)送數(shù)據(jù)
  116.          while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(j<0XFFF)) j++;  
  117.                 if(j>0xFFF) return 1;
  118.          return 0;
  119. }
  120. //接收中斷函數(shù)
  121. void USB_LP_CAN1_RX0_IRQHandler(void) //PA11 PA12
  122. {
  123.         CanRxMsg RxMessage;
  124.         int i=0;
  125.           RxMessage.StdId=0x00;
  126.           RxMessage.ExtId=0x00;
  127.           RxMessage.IDE=0;
  128.           RxMessage.DLC=0;
  129.           RxMessage.FMI=0;
  130.           RxMessage.Data[0]=0x00;
  131.           RxMessage.Data[1]=0x00;  
  132.           RxMessage.Data[2]=0x00;
  133.           RxMessage.Data[3]=0x00;
  134.         RxMessage.Data[4]=0x00;
  135.         RxMessage.Data[5]=0x00;
  136.         RxMessage.Data[6]=0x00;
  137.         RxMessage.Data[7]=0x00;
  138.         CAN_Receive(CAN1,CAN_Filter_FIFO0,&RxMessage);  //接受數(shù)據(jù)
  139.         for(i=0;i<8;i++)
  140.         {
  141.                 recive_buf[i]=RxMessage.Data[i];       
  142.         }
  143.        
  144.         Rx_finish_Flag=1;
  145. }
  146. //發(fā)送中斷函數(shù)
  147. void USB_HP_CAN1_TX_IRQHandler(void) //CAN TX
  148. {
  149.     if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
  150.         {
  151. //          LED4=!LED4;
  152.                 CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
  153.   }
  154. }

  155. //can數(shù)據(jù)查詢收到
  156. u8 can_recive_check(void)
  157. {
  158.   u32 i=0;
  159.         CanRxMsg CanRxMsgStructure;
  160.           //檢測(cè)有無(wú)數(shù)據(jù)收到
  161.         CanRxMsgStructure.StdId=0x00;
  162.         CanRxMsgStructure.ExtId=0x00;
  163.         CanRxMsgStructure.IDE=0;
  164.         CanRxMsgStructure.DLC=0;
  165.         CanRxMsgStructure.FMI=0;
  166.         CanRxMsgStructure.Data[0]=0x00;
  167.         CanRxMsgStructure.Data[1]=0x00;  
  168.         CanRxMsgStructure.Data[2]=0x00;
  169.         CanRxMsgStructure.Data[3]=0x00;
  170.         CanRxMsgStructure.Data[4]=0x00;
  171.         CanRxMsgStructure.Data[5]=0x00;
  172.         CanRxMsgStructure.Data[6]=0x00;
  173.         CanRxMsgStructure.Data[7]=0x00;
  174.         CAN_Receive(CAN1, CAN_Filter_FIFO0, &CanRxMsgStructure);//讀取數(shù)據(jù)
  175.          for(i=0;i<8;i++)
  176.                 {
  177.                   recive_buf[i]=CanRxMsgStructure.Data[i];               
  178.                 }
  179.                 return CanRxMsgStructure.DLC;
  180. }
復(fù)制代碼

芯片型號(hào) STM32F103VCT6
會(huì)不會(huì)是因?yàn)镻A11和PA12IO口有其他功能復(fù)用了。求解答感謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:416287 發(fā)表于 2020-5-11 12:24 | 只看該作者
你看一下兩塊單片機(jī)的can通訊速率是否設(shè)置成一樣
回復(fù)

使用道具 舉報(bào)

板凳
ID:347349 發(fā)表于 2020-5-11 14:36 | 只看該作者
波特率是否設(shè)置一致
回復(fù)

使用道具 舉報(bào)

地板
ID:597048 發(fā)表于 2020-5-11 16:24 | 只看該作者
首先使用還回模式測(cè)試是否正常  如果正常那就是波特率不對(duì)  檢查一下時(shí)鐘配置
回復(fù)

使用道具 舉報(bào)

5#
ID:403284 發(fā)表于 2020-12-17 09:29 | 只看該作者
樓主問(wèn)題解決了嗎,遇到了同樣的問(wèn)題,求解
回復(fù)

使用道具 舉報(bào)

6#
ID:453198 發(fā)表于 2020-12-17 10:52 | 只看該作者
使用環(huán)回模式自發(fā)自收,測(cè)試無(wú)誤后再排查硬件 終端的匹配電阻是否正常查一下 然后用示波器掛一下canl 和canh 看一下顯性位和隱性位的電平差是否正常
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表