OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4870|回复: 4

请教一下大家与原子哥,关于CAN通信的问题

[复制链接]

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
发表于 2023-4-23 16:47:50 | 显示全部楼层 |阅读模式
10金钱
请教一下大家与原子哥,关于CAN通信的问题,我的程序参考了原子哥的HAL例程,进行了简单的修改,发送没有问题,用示波器检测到了波形,在接收端,CANH、CANL端也有波形,但是与STM32连接的PA11、PA12却没有波形,这是什么情况?
这是CAN配置程序
  1. #include "can.h"

  2. /* USER CODE BEGIN 0 */

  3. /* USER CODE END 0 */

  4. CAN_HandleTypeDef        hcan;   //CAN1¾ä±ú
  5. CAN_TxHeaderTypeDef        TxHeader;      //·¢Ëí
  6. CAN_RxHeaderTypeDef        RxHeader;      //½óêÕ
  7. /* CAN init function */


  8. uint8_t CAN1_Mode_Init(uint32_t tsjw,uint32_t tbs2,uint32_t tbs1,uint16_t brp,uint32_t mode)
  9. {
  10.         CAN_InitTypeDef                CAN1_InitConf;
  11.    
  12.     hcan.Instance=CAN1;
  13.        
  14.         hcan.Init = CAN1_InitConf;
  15.        
  16.     hcan.Init.Prescaler=brp;                                //·ÖÆμÏμêy(Fdiv)Îabrp+1
  17.     hcan.Init.Mode=mode;                                        //Ä£ê½éèÖÃ
  18.     hcan.Init.SyncJumpWidth=tsjw;                        //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1TQ~CAN_SJW_4TQ
  19.     hcan.Init.TimeSeg1=tbs1;                                //tbs1·¶Î§CAN_BS1_1TQ~CAN_BS1_16TQ
  20.     hcan.Init.TimeSeg2=tbs2;                                //tbs2·¶Î§CAN_BS2_1TQ~CAN_BS2_8TQ
  21.     hcan.Init.TimeTriggeredMode=DISABLE;        //·Çê±¼ä′¥·¢í¨DÅÄ£ê½
  22.     hcan.Init.AutoBusOff=DISABLE;                        //èí¼t×Ô¶ˉàëÏß1üàí
  23.     hcan.Init.AutoWakeUp=DISABLE;                        //ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)
  24.     hcan.Init.AutoRetransmission=ENABLE;        //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí
  25.     hcan.Init.ReceiveFifoLocked=DISABLE;        //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ
  26.     hcan.Init.TransmitFifoPriority=DISABLE;        //óÅÏ輶ó鱨Îıê궷û¾ö¶¨
  27.        
  28.     if(HAL_CAN_Init(&hcan)!=HAL_OK)                        //3õê¼»ˉ
  29.                 return 1;
  30.     return 0;
  31. }





  32. void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
  33. {

  34.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  35.   if(canHandle->Instance==CAN1)
  36.   {
  37.   /* USER CODE BEGIN CAN1_MspInit 0 */

  38.   /* USER CODE END CAN1_MspInit 0 */
  39.     /* CAN1 clock enable */
  40.     __HAL_RCC_CAN1_CLK_ENABLE();

  41.     __HAL_RCC_GPIOA_CLK_ENABLE();
  42.     /**CAN GPIO Configuration
  43.     PA11     ------> CAN_RX
  44.     PA12     ------> CAN_TX
  45.     */
  46.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  47.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  48.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  49.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  50.     GPIO_InitStruct.Pin = GPIO_PIN_12;
  51.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  52.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  53.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  54.     /* CAN1 interrupt Init */
  55.     HAL_NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, 0, 0);
  56.     HAL_NVIC_EnableIRQ(USB_HP_CAN1_TX_IRQn);
  57.     HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
  58.     HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
  59.   /* USER CODE BEGIN CAN1_MspInit 1 */

  60.   /* USER CODE END CAN1_MspInit 1 */
  61.   }
  62. }

  63. void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle)
  64. {

  65.   if(canHandle->Instance==CAN1)
  66.   {
  67.   /* USER CODE BEGIN CAN1_MspDeInit 0 */

  68.   /* USER CODE END CAN1_MspDeInit 0 */
  69.     /* Peripheral clock disable */
  70.     __HAL_RCC_CAN1_CLK_DISABLE();

  71.     /**CAN GPIO Configuration
  72.     PA11     ------> CAN_RX
  73.     PA12     ------> CAN_TX
  74.     */
  75.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);

  76.     /* CAN1 interrupt Deinit */
  77.     HAL_NVIC_DisableIRQ(USB_HP_CAN1_TX_IRQn);
  78.     HAL_NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);
  79.   /* USER CODE BEGIN CAN1_MspDeInit 1 */

  80.   /* USER CODE END CAN1_MspDeInit 1 */
  81.   }
  82. }

  83. /* USER CODE BEGIN 1 */

  84. /* USER CODE END 1 */
  85. void CAN_Config(void)
  86. {
  87.   CAN_FilterTypeDef  sFilterConfig;

  88.   /*##-2- Configure the CAN Filter ###########################################*/
  89.   sFilterConfig.FilterBank = 0;
  90.   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  91.   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  92.   sFilterConfig.FilterIdHigh = 0x0000;
  93.   sFilterConfig.FilterIdLow = 0x0000;
  94.   sFilterConfig.FilterMaskIdHigh = 0x0000;
  95.   sFilterConfig.FilterMaskIdLow = 0x0000;
  96.   sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
  97.   sFilterConfig.FilterActivation = ENABLE;
  98.   sFilterConfig.SlaveStartFilterBank = 14;

  99.   if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  100.   {
  101.     /* Filter configuration Error */
  102.     while(1)
  103.           {
  104.           }
  105.   }

  106.   /*##-3- Start the CAN peripheral ###########################################*/
  107.   if (HAL_CAN_Start(&hcan) != HAL_OK)
  108.   {
  109.     /* Start Error */
  110.     while(1)
  111.           {
  112.           }
  113.   }

  114.   /*##-4- Activate CAN RX notification #######################################*/
  115.   if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  116.   {
  117.     /* Notification Error */
  118.     while(1)
  119.           {
  120.           }
  121.   }

  122.   /*##-5- Configure Transmission process #####################################*/
  123.   TxHeader.StdId = 0x321;
  124.   TxHeader.ExtId = 0x01;
  125.   TxHeader.RTR = CAN_RTR_DATA;
  126.   TxHeader.IDE = CAN_ID_STD;
  127.   TxHeader.DLC = 2;
  128.   TxHeader.TransmitGlobalTime = DISABLE;
  129. }
  130. uint8_t CAN1_Send_Msg(uint8_t* msg,uint8_t len)
  131. {       
  132.     uint8_t i=0;
  133.         uint32_t TxMailbox;
  134.         uint8_t message[8];
  135.     TxHeader.StdId=0X12;        //±ê×¼±ê궷û
  136.     TxHeader.ExtId=0x12;        //à©Õ1±ê궷û(29λ)
  137.     TxHeader.IDE=CAN_ID_STD;    //ê1óñê×¼Ö¡
  138.     TxHeader.RTR=CAN_RTR_DATA;  //êy¾YÖ¡
  139.     TxHeader.DLC=len;               
  140.     for(i=0;i<len;i++)
  141.     {
  142.                 message[i]=msg[i];
  143.         }
  144.     if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, message, &TxMailbox) != HAL_OK)//·¢&#203;í
  145.         {
  146.                 return 1;
  147.         }
  148.         while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 3) {}
  149.     return 0;
  150. }

  151. //can&#191;ú&#189;óê&#213;êy&#190;Y2é&#209;ˉ
  152. //buf:êy&#190;Y&#187;o′&#230;&#199;&#248;;         
  153. //·μ&#187;&#216;&#214;μ:0,&#206;Têy&#190;Y±&#187;ê&#213;μ&#189;;
  154. //                 &#198;&#228;&#203;&#251;,&#189;óê&#213;μ&#196;êy&#190;Y3¤&#182;è;
  155. uint8_t CAN1_Receive_Msg(uint8_t *buf)
  156. {
  157.         uint32_t i;
  158.         uint8_t        RxData[8];

  159.         if(HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) != 1)
  160.         {
  161.                 return 0xF1;
  162.         }

  163.         if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
  164.         {
  165.                 return 0xF2;
  166.         }
  167.     for(i=0;i<RxHeader.DLC;i++)
  168.     buf[i]=RxData[i];
  169.         return RxHeader.DLC;
  170. }
复制代码
这是主程序
  1. int main(void)
  2. {
  3.   
  4.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  5.   HAL_Init();
  6.   SystemClock_Config();
  7.   MX_GPIO_Init();
  8.         CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS2_6TQ,CAN_BS1_7TQ,6,CAN_MODE_NORMAL);
  9.         CAN_Config();
  10.   MX_TIM2_Init();
  11.   MX_TIM3_Init();
  12.   MX_TIM4_Init();
  13.   MX_USART1_UART_Init();

  14.   while (1)
  15.   {
  16.     /* USER CODE END WHILE */
  17.                 canbuf[0]=0x01;canbuf[1]=0x01;canbuf[2]=0x01;canbuf[3]=0x01;
  18.                         canbuf[4]=0x01;canbuf[5]=0x01;canbuf[6]=0x01;canbuf[7]=0x01;
  19. CAN1_Send_Msg(canbuf,8);
  20.     /* USER CODE BEGIN 3 */
  21.   }
  22.   /* USER CODE END 3 */
  23. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-4-23 19:42:01 | 显示全部楼层
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
 楼主| 发表于 2023-4-24 09:55:40 | 显示全部楼层
jermy_z 发表于 2023-4-23 19:42
描述的,不太清楚。

就是做接收方时,can与32连接的部分没有波形,而CANH、CANL端有波形
回复

使用道具 举报

26

主题

1538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6376
金钱
6376
注册时间
2015-8-25
在线时间
1004 小时
发表于 2023-4-24 10:08:30 | 显示全部楼层
CAN收发器没接?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
 楼主| 发表于 2023-4-24 10:15:25 | 显示全部楼层

都接了,主从机的配置程序一模一样,主机可以发送,从机接收不到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 11:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表