OpenEdv-开源电子网

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

stm32f103两个开发板can通信正常模式下发送数据失败

[复制链接]

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2023-3-13
在线时间
11 小时
发表于 2023-3-24 17:37:59 | 显示全部楼层 |阅读模式
1金钱
基于正点原子的stm32f103zet6开发板跟正点原子的can通信例程hal版本,连接两个板子的canh跟canl,想通信,看到在正常模式下,发送数据会一直卡在while (HAL_CAN_GetTxMailboxesFreeLevel(&g_canx_handler) != 3); /* 等待发送完成,所有邮箱(有三个邮箱)为空 */,出不去,这是为什么呢,回环模式是正常的

最佳答案

查看完整内容[请看2#楼]

找到原因了,开发指南里面写的,“另外,需要注意:CAN 和 USB 共用了 PA11 和 PA12,所以他们不 能同时使用。这里还要注意,我们要设置好开发板上 P6 排针的连接,通过跳线帽将 PA11 和 PA12 分别 连接到 CRX 和 CTX 上面”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2023-3-13
在线时间
11 小时
 楼主| 发表于 2023-3-24 17:38:00 | 显示全部楼层
找到原因了,开发指南里面写的,“另外,需要注意:CAN 和 USB 共用了 PA11 和 PA12,所以他们不
能同时使用。这里还要注意,我们要设置好开发板上 P6 排针的连接,通过跳线帽将 PA11 和 PA12 分别
连接到 CRX 和 CTX 上面”
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2023-3-13
在线时间
11 小时
 楼主| 发表于 2023-3-24 17:39:21 | 显示全部楼层
我尝试过用周立功的usb转can,正常模式发送也是不成功
回复

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
发表于 2023-3-24 20:59:53 | 显示全部楼层
首先你得确保你的配置是对的,首先是初始CAN初始化成功,包括波特率等配置,其次是对于发送参数的配置,长度,发送邮箱,标准帧还是扩展帧,数据帧还是远程帧这些都需要配置好,CAN初始化部分还需要启动CAN等等,你可以把代码发出来我给你看看,CAN这块我还比较熟悉
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2023-3-13
在线时间
11 小时
 楼主| 发表于 2023-3-27 08:23:29 | 显示全部楼层
15284083060 发表于 2023-3-24 20:59
首先你得确保你的配置是对的,首先是初始CAN初始化成功,包括波特率等配置,其次是对于发送参数的配置,长 ...

代码完完全全就是正点原子stm32f103精英开发板的HAL库例程,里面的can通信,一个字都没改动过
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2023-3-13
在线时间
11 小时
 楼主| 发表于 2023-3-27 08:24:17 | 显示全部楼层
  1. /**
  2. ****************************************************************************************************
  3. * [url=home.php?mod=space&uid=175224]@file[/url]        can.c
  4. * [url=home.php?mod=space&uid=90321]@Author[/url]      正点原子团队(ALIENTEK)
  5. * @version     V1.0
  6. * @date        2020-04-24
  7. * @brief       CAN 驱动代码
  8. * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
  9. ****************************************************************************************************
  10. * @attention
  11. *
  12. * 实验平台:正点原子 STM32F103开发板
  13. * 在线视频:www.yuanzige.com
  14. * 技术论坛:www.openedv.com
  15. * 公司网址:www.alientek.com
  16. * 购买地址:openedv.taobao.com
  17. *
  18. * 修改说明
  19. * V1.0 20200424
  20. * 第一次发布
  21. *
  22. ****************************************************************************************************
  23. */

  24. #include "./BSP/CAN/can.h"
  25. #include "./BSP/LED/led.h"
  26. #include "./SYSTEM/delay/delay.h"
  27. #include "./SYSTEM/usart/usart.h"

  28. CAN_HandleTypeDef   g_canx_handler;     /* CANx句柄 */
  29. CAN_TxHeaderTypeDef g_canx_txheader;    /* 发送参数句柄 */
  30. CAN_RxHeaderTypeDef g_canx_rxheader;    /* 接收参数句柄 */

  31. /**
  32. * @brief       CAN初始化
  33. * @param       tsjw    : 重新同步跳跃时间单元.范围: 1~3;
  34. * @param       tbs2    : 时间段2的时间单元.范围: 1~8;
  35. * @param       tbs1    : 时间段1的时间单元.范围: 1~16;
  36. * @param       brp     : 波特率分频器.范围: 1~1024;
  37. *   @note      以上4个参数, 在函数内部会减1, 所以, 任何一个参数都不能等于0
  38. *              CAN挂在APB1上面, 其输入时钟频率为 Fpclk1 = PCLK1 = 36Mhz
  39. *              tq     = brp * tpclk1;
  40. *              波特率 = Fpclk1 / ((tbs1 + tbs2 + 1) * brp);
  41. *              我们设置 can_init(1, 8, 9, 4, 1), 则CAN波特率为:
  42. *              36M / ((8 + 9 + 1) * 4) = 500Kbps
  43. *
  44. * @param       mode    : CAN_MODE_NORMAL,  正常模式;
  45.                           CAN_MODE_LOOPBACK,回环模式;
  46. * @retval      0,  初始化成功; 其他, 初始化失败;
  47. */
  48. uint8_t can_init(uint32_t tsjw, uint32_t tbs2, uint32_t tbs1, uint16_t brp, uint32_t mode)
  49. {
  50.   g_canx_handler.Instance = CAN1;
  51.   g_canx_handler.Init.Prescaler = brp;                /* 分频系数(Fdiv)为brp+1 */
  52.   g_canx_handler.Init.Mode = mode;                    /* 模式设置 */
  53.   g_canx_handler.Init.SyncJumpWidth = tsjw;           /* 重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQ */
  54.   g_canx_handler.Init.TimeSeg1 = tbs1;                /* tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQ */
  55.   g_canx_handler.Init.TimeSeg2 = tbs2;                /* tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQ */
  56.   g_canx_handler.Init.TimeTriggeredMode = DISABLE;    /* 非时间触发通信模式 */
  57.   g_canx_handler.Init.AutoBusOff = DISABLE;           /* 软件自动离线管理 */
  58.   g_canx_handler.Init.AutoWakeUp = DISABLE;           /* 睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) */
  59.   g_canx_handler.Init.AutoRetransmission = ENABLE;    /* 禁止报文自动传送 */
  60.   g_canx_handler.Init.ReceiveFifoLocked = DISABLE;    /* 报文不锁定,新的覆盖旧的 */
  61.   g_canx_handler.Init.TransmitFifoPriority = DISABLE; /* 优先级由报文标识符决定 */
  62.    
  63.   if (HAL_CAN_Init(&g_canx_handler) != HAL_OK)
  64.   {
  65.     return 1;
  66.   }

  67. #if CAN_RX0_INT_ENABLE
  68.   /* 使用中断接收 */
  69.   __HAL_CAN_ENABLE_IT(&g_canx_handler, CAN_IT_RX_FIFO0_MSG_PENDING); /* FIFO0消息挂号中断允许 */
  70.   HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);                          /* 使能CAN中断 */
  71.   HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 1, 0);                  /* 抢占优先级1,子优先级0 */
  72. #endif

  73.   CAN_FilterTypeDef sFilterConfig;

  74.   /*配置CAN过滤器*/
  75.   sFilterConfig.FilterBank = 0;                         /* 过滤器0 */
  76.   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;     /* 标识符屏蔽位模式 */
  77.   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;    /* 长度32位位宽*/
  78.   sFilterConfig.FilterIdHigh = 0x0000;                  /* 32位ID */
  79.   sFilterConfig.FilterIdLow = 0x0000;
  80.   sFilterConfig.FilterMaskIdHigh = 0x0000;              /* 32位MASK */
  81.   sFilterConfig.FilterMaskIdLow = 0x0000;
  82.   sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;    /* 过滤器0关联到FIFO0 */
  83.   sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;       /* 激活滤波器0 */
  84.   sFilterConfig.SlaveStartFilterBank = 14;

  85.   /* 过滤器配置 */
  86.   if (HAL_CAN_ConfigFilter(&g_canx_handler, &sFilterConfig) != HAL_OK)
  87.   {
  88.     return 2;
  89.   }

  90.   /* 启动CAN外围设备 */
  91.   if (HAL_CAN_Start(&g_canx_handler) != HAL_OK)
  92.   {
  93.     return 3;
  94.   }

  95.   return 0;
  96. }

  97. /**
  98. * @brief       CAN底层驱动,引脚配置,时钟配置,中断配置
  99.                 此函数会被HAL_CAN_Init()调用
  100. * @param       hcan:CAN句柄
  101. * @retval      无
  102. */
  103. void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
  104. {
  105.   if (CAN1 == hcan->Instance)
  106.   {
  107.     CAN_RX_GPIO_CLK_ENABLE();       /* CAN_RX脚时钟使能 */
  108.     CAN_TX_GPIO_CLK_ENABLE();       /* CAN_TX脚时钟使能 */
  109.     __HAL_RCC_CAN1_CLK_ENABLE();    /* 使能CAN1时钟 */

  110.     GPIO_InitTypeDef gpio_initure;

  111.     gpio_initure.Pin = CAN_TX_GPIO_PIN;
  112.     gpio_initure.Mode = GPIO_MODE_AF_PP;
  113.     gpio_initure.Pull = GPIO_PULLUP;
  114.     gpio_initure.Speed = GPIO_SPEED_FREQ_HIGH;
  115.     HAL_GPIO_Init(CAN_TX_GPIO_PORT, &gpio_initure); /* CAN_TX脚 模式设置 */

  116.     gpio_initure.Pin = CAN_RX_GPIO_PIN;
  117.     gpio_initure.Mode = GPIO_MODE_AF_INPUT;
  118.     HAL_GPIO_Init(CAN_RX_GPIO_PORT, &gpio_initure); /* CAN_RX脚 必须设置成输入模式 */
  119.   }
  120. }

  121. #if CAN_RX0_INT_ENABLE /* 使能RX0中断 */

  122. /**
  123. * @brief       CAN RX0 中断服务函数
  124. *   @note      处理CAN FIFO0的接收中断
  125. * @param       无
  126. * @retval      无
  127. */
  128. void USB_LP_CAN1_RX0_IRQHandler(void)
  129. {
  130.   uint8_t rxbuf[8];
  131.   uint32_t id;
  132.   uint8_t ide, rtr, len;
  133.    
  134.   can_receive_msg(id, rxbuf);
  135.   printf("id:%d\r\n", g_canx_rxheader.StdId);
  136.   printf("ide:%d\r\n", g_canx_rxheader.IDE);
  137.   printf("rtr:%d\r\n", g_canx_rxheader.RTR);
  138.   printf("len:%d\r\n", g_canx_rxheader.DLC);
  139.   printf("rxbuf[0]:%d\r\n", rxbuf[0]);
  140.   printf("rxbuf[1]:%d\r\n", rxbuf[1]);
  141.   printf("rxbuf[2]:%d\r\n", rxbuf[2]);
  142.   printf("rxbuf[3]:%d\r\n", rxbuf[3]);
  143.   printf("rxbuf[4]:%d\r\n", rxbuf[4]);
  144.   printf("rxbuf[5]:%d\r\n", rxbuf[5]);
  145.   printf("rxbuf[6]:%d\r\n", rxbuf[6]);
  146.   printf("rxbuf[7]:%d\r\n", rxbuf[7]);
  147. }

  148. #endif

  149. /**
  150. * @brief       CAN 发送一组数据
  151. *   @note      发送格式固定为: 标准ID, 数据帧
  152. * @param       id      : 标准ID(11位)
  153. * @retval      发送状态 0, 成功; 1, 失败;
  154. */
  155. uint8_t can_send_msg(uint32_t id, uint8_t *msg, uint8_t len)
  156. {
  157.   uint32_t TxMailbox = CAN_TX_MAILBOX0;
  158.    
  159.   g_canx_txheader.StdId = id;         /* 标准标识符 */
  160.   g_canx_txheader.ExtId = id;         /* 扩展标识符(29位) 标准标识符情况下,该成员无效*/
  161.   g_canx_txheader.IDE = CAN_ID_STD;   /* 使用标准标识符 */
  162.   g_canx_txheader.RTR = CAN_RTR_DATA; /* 数据帧 */
  163.   g_canx_txheader.DLC = len;

  164.   if (HAL_CAN_AddTxMessage(&g_canx_handler, &g_canx_txheader, msg, &TxMailbox) != HAL_OK) /* 发送消息 */
  165.   {
  166.     return 1;
  167.   }
  168.   
  169.   while (HAL_CAN_GetTxMailboxesFreeLevel(&g_canx_handler) != 3); /* 等待发送完成,所有邮箱(有三个邮箱)为空 */
  170.   
  171.   return 0;
  172. }

  173. /**
  174. * @brief       CAN 接收数据查询
  175. *   @note      接收数据格式固定为: 标准ID, 数据帧
  176. * @param       id      : 要查询的 标准ID(11位)
  177. * @param       buf     : 数据缓存区
  178. * @retval      接收结果
  179. *   @arg       0   , 无数据被接收到;
  180. *   @arg       其他, 接收的数据长度
  181. */
  182. uint8_t can_receive_msg(uint32_t id, uint8_t *buf)
  183. {
  184.   if (HAL_CAN_GetRxFifoFillLevel(&g_canx_handler, CAN_RX_FIFO0) == 0)     /* 没有接收到数据 */
  185.   {
  186.     return 0;
  187.   }

  188.   if (HAL_CAN_GetRxMessage(&g_canx_handler, CAN_RX_FIFO0, &g_canx_rxheader, buf) != HAL_OK)  /* 读取数据 */
  189.   {
  190.     return 0;
  191.   }
  192.   
  193.   if (g_canx_rxheader.StdId!= id || g_canx_rxheader.IDE != CAN_ID_STD || g_canx_rxheader.RTR != CAN_RTR_DATA)       /* 接收到的ID不对 / 不是标准帧 / 不是数据帧 */
  194.   {
  195.     return 0;   
  196.   }

  197.   return g_canx_rxheader.DLC;
  198. }


复制代码
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
发表于 2023-3-27 09:38:44 | 显示全部楼层
lghcall 发表于 2023-3-24 17:39
我尝试过用周立功的usb转can,正常模式发送也是不成功

硬件问题吧  看看接线之类的
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2023-3-13
在线时间
11 小时
 楼主| 发表于 2023-3-27 09:57:16 | 显示全部楼层
chenyuan 发表于 2023-3-27 09:38
硬件问题吧  看看接线之类的

回环模式都正常,而且我有两个开发板,都是精英的,还有一块是新买的,我觉得硬件出问题的情况不大,而且接线,can就两根线,H接H,L接L
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 12:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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