STM32G474使用CAN实现基础发送和接收

打印 上一主题 下一主题

主题 1521|帖子 1521|积分 4563

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
使用STM32CubeMX天生代码,


  • CAN波特率设置:经Clock Divider分频后,得到CAN的时钟频率                                                   f                                           c                                  a                                  n                                                       f_{can}                     fcan​,CAN的发送波特率为                                                   f                                           c                                  a                                  n                                                 /                            (                            N                            o                            m                            i                            n                            a                            l                            S                            y                            n                            c                            J                            u                            m                            p                            W                            i                            d                            t                            h                            +                            N                            o                            m                            i                            n                            a                            l                            T                            i                            m                            e                            S                            e                            g                            1                            +                            N                            o                            m                            i                            n                            a                            l                            T                            i                            m                            e                            S                            e                            g                            2                            )                                  f_{can}/(Nominal Sync Jump Width + Nominal Time Seg1 + Nominal Time Seg2)                     fcan​/(NominalSyncJumpWidth+NominalTimeSeg1+NominalTimeSeg2)。
  • 开启interrupt 0停止,以启动接收停止
设置完成后天生代码,在fdcan.c文件修改MX_FDCAN3_Init函数,只列出修改部分:
  1.   /* USER CODE BEGIN FDCAN3_Init 0 */
  2.         FDCAN_FilterTypeDef FDCAN3_RXFilter;
  3.   /* USER CODE END FDCAN3_Init 0 */
  4.         FDCAN3_RXFilter.IdType=FDCAN_STANDARD_ID;                       
  5.     FDCAN3_RXFilter.FilterIndex=0;                                                  
  6.     FDCAN3_RXFilter.FilterType=FDCAN_FILTER_RANGE;                  
  7.     FDCAN3_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           
  8.     FDCAN3_RXFilter.FilterID1=0x0000;                              
  9.     FDCAN3_RXFilter.FilterID2=0x0000;                              
  10.     if(HAL_FDCAN_ConfigFilter(&hfdcan3,&FDCAN3_RXFilter)!=HAL_OK)
  11.         {
  12.                 Error_Handler();
  13.         }
  14.     HAL_FDCAN_Start(&hfdcan3);                          
  15.     HAL_FDCAN_ActivateNotification(&hfdcan3,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
复制代码
在fdcan.c文件最下端添加发送和停止处置惩罚函数
  1. /* USER CODE BEGIN 1 */
  2. FDCAN_TxHeaderTypeDef TxHeader;
  3. uint8_t FDCAN_Transmit(uint32_t can_id, uint32_t DataLength, uint8_t tx_data[])
  4. {
  5.        
  6.   TxHeader.Identifier = can_id;
  7.   TxHeader.IdType = FDCAN_EXTENDED_ID; // 先设置为扩展ID
  8.   if(can_id < 0x800) { //一般情况都是标准ID
  9.     TxHeader.IdType = FDCAN_STANDARD_ID;
  10.   }
  11.   TxHeader.TxFrameType = FDCAN_DATA_FRAME;  //
  12.   TxHeader.DataLength = DataLength;
  13.   TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
  14.   TxHeader.BitRateSwitch = FDCAN_BRS_ON;
  15.   TxHeader.FDFormat = FDCAN_FD_CAN;
  16.   TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
  17.   TxHeader.MessageMarker = 0;       
  18.   if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan3, &TxHeader, tx_data) != HAL_OK) {
  19.                 return 1;
  20.   }
  21.         return 0;
  22. }
  23. uint8_t RxData1[8];
  24. FDCAN_RxHeaderTypeDef RxHeader;
  25. void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
  26. {
  27.   if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0) {        
  28.     HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData1);
  29.                 if (hfdcan->Instance == FDCAN3) {
  30.                
  31.                 }  
  32.   }
  33. }
  34. /* USER CODE END 1 */
复制代码
最后,在fdcan.h添加函数声明:
  1. uint8_t FDCAN_Transmit(uint32_t can_id, uint32_t DataLength, uint8_t tx_data[]);
  2. void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs);
复制代码
此时,可以使用fdcan1_transmit发送数据,在HAL_FDCAN_RxFifo0Callback函数中对接收数据举行处置惩罚
如果要过滤ID,那么需要将StdFiltersNbr或者ExtFiltersNbr设置为你使用的滤波器个数,StdFiltersNbr为标准帧滤波器个数,ExtFiltersNbr为扩展帧滤波器个数。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

灌篮少年

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表