硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2876|回复: 3
收起左侧

调试F429的CAN2时遇到的一个问题

[复制链接]

9

主题

28

回帖

55

积分

初级会员

积分
55
发表于 2020-11-21 16:25:23 | 显示全部楼层 |阅读模式
    使用CAN2连续发送4个包,因为之前使用CAN1的时候遇到过发送超过3个就会丢包的问题,那个时候用的方法是用while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0)进行判断,如果发送队列空,然后继续发送,今天使用CAN2的时候遇到了同样的问题,但是使用同样的方法就不能解决这个问题了。CAN1和CAN2都已经初始化了,使用的是最新的CUBE MX进行初始化的,有人遇到同样的问题没有
  1. /*
  2.         函数名:CAN1_Send_Msg
  3.         形  参:
  4.                         msg:待发送的数组
  5.                         stdid:CAN StdID
  6.                         extid:CAN extid
  7.                         len:发送的数据长度,最长8
  8.         返回值:无
  9.         功  能:CAN1发送函数
  10. */
  11. void CAN1_Send_Msg(uint8_t msg[],uint32_t stdid,uint32_t extid,uint8_t len)
  12. {
  13.     uint32_t can1_return;
  14.        
  15.     can1_tx.StdId=stdid;
  16.     can1_tx.ExtId=extid;
  17.     can1_tx.IDE=CAN_ID_STD;
  18.     can1_tx.RTR=CAN_RTR_DATA;
  19.     can1_tx.DLC=len;
  20.     if(len>8)
  21.     {
  22.         printf("ERROR:CAN DLC MAX LEN 8");
  23.     }
  24.         while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0)                        /*CAN发送FIFO只有3个,灯待发送完毕后再发送,否则会造成数据丢包*/
  25.         {
  26.                 printf("CAN1 FIFO发送队列溢出!\r\n");
  27.         }
  28.     HAL_CAN_AddTxMessage(&hcan1,&can1_tx,msg,&can1_return);
  29. }

  30. /*
  31.         函数名:CAN2_Send_Msg
  32.         形  参:
  33.                         msg:待发送的数组
  34.                         stdid:CAN StdID
  35.                         extid:CAN extid
  36.                         len:发送的数据长度,最长8
  37.         返回值:无
  38.         功  能:CAN2发送函数
  39. */
  40. void CAN2_Send_Msg(uint8_t* msg,uint32_t stdid,uint32_t extid,uint8_t len)
  41. {
  42.     uint32_t can2_return;

  43.     can2_tx.StdId=stdid;
  44.     can2_tx.ExtId=extid;
  45.     can2_tx.IDE=CAN_ID_STD;
  46.     can2_tx.RTR=CAN_RTR_DATA;
  47.     can2_tx.DLC=len;
  48.     if(len>8)
  49.     {
  50.         printf("ERROR:CAN DLC MAX LEN 8");
  51.     }
  52.         while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan2)==0)
  53.         {
  54.                 printf("CAN2 FIFO发送队列溢出!\r\n");
  55.         }
  56.     HAL_CAN_AddTxMessage(&hcan2, &can2_tx, msg, &can2_return);
  57.        
  58. }
复制代码



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-11-21 17:45:50 | 显示全部楼层
V6板子裸机例子里面有个CAN1和CAN2双CAN之间通信的例子,可以随意折腾,无此问题

论坛置顶帖标准库网盘:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=15518
回复

使用道具 举报

3

主题

1230

回帖

1239

积分

至尊会员

积分
1239
发表于 2020-11-21 20:51:31 | 显示全部楼层
  1.     if ((CANmodule->CANtxCount == 0) &&
  2.             (HAL_CAN_GetTxMailboxesFreeLevel(CANmodule->CANbaseAddress) > 0 ))
  3.     {
  4.         CANmodule->bufferInhibitFlag = buffer->syncFlag;

  5.         if( HAL_CAN_AddTxMessage(CANmodule->CANbaseAddress,
  6.                                  &TxHeader,
  7.                                  &buffer->data[0],
  8.                                  &TxMailboxNum)
  9.                 != HAL_OK)
  10.         {
  11.             err = CO_ERROR_HAL;
  12.         }
  13.         else
  14.         {
  15.             ;/*do nothing*/
  16.         }
  17.     }
复制代码
回复

使用道具 举报

9

主题

28

回帖

55

积分

初级会员

积分
55
 楼主| 发表于 2020-11-22 09:59:21 | 显示全部楼层
调试的时候我将实时的剩余邮箱容量打印了出来,然后发现并不是邮箱的问题,后续还需要继续排查,不知道今天能不能解决
  1. CAN2_Send_Msg stdid:320
  2. CAN2_Send_Msg remain_mailbox:3
  3. 跳出While()
  4. CAN2_Send_Msg stdid:320
  5. CAN2_Send_Msg remain_mailbox:2
  6. 跳出While()
  7. CAN2_Send_Msg stdid:321
  8. CAN2_Send_Msg remain_mailbox:2
  9. 跳出While()
  10. CAN2_Send_Msg stdid:322
  11. CAN2_Send_Msg remain_mailbox:2
  12. 跳出While()
  13. CAN_RX_HDR.StdId:a1
  14. CAN_RX_HDR.StdId:a1
  15. CAN_RX_HDR.StdId:a2
  16. CAN_RX_HDR.StdId:a3
复制代码
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 20:09 , Processed in 0.212124 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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