硬汉嵌入式论坛

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

[CAN/FDCAN] 注意STM32H7的FDCAN发送是复制到发送缓冲中,所有不用担心用的是全局数组还是局部变量数组

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
发表于 2021-10-31 09:33:38 | 显示全部楼层 |阅读模式


下面的发送函数。

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: can1_SendPacket
  4. *        功能说明: 发送一包数据
  5. *        形    参:_DataBuf 数据缓冲区
  6. *                          _Len 数据长度, 支持8,12,16,20,24,32,48或者64字节
  7. *        返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. void can1_SendPacket(uint8_t *_DataBuf, uint8_t _Len)
  11. {               
  12.         FDCAN_TxHeaderTypeDef TxHeader = {0};

  13.        
  14.         /* 配置发送参数 */
  15.         TxHeader.Identifier = 0x222;                              /* 设置接收帧消息的ID */
  16.         TxHeader.IdType = FDCAN_STANDARD_ID;                      /* 标准ID */
  17.         TxHeader.TxFrameType = FDCAN_DATA_FRAME;                 /* 数据帧 */
  18.         TxHeader.DataLength = (uint32_t)_Len << 16;      /* 发送数据长度 */
  19.         TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /* 设置错误状态指示 */
  20.         TxHeader.BitRateSwitch = FDCAN_BRS_ON;           /* 开启可变波特率 */
  21.         TxHeader.FDFormat = FDCAN_FD_CAN;                /* FDCAN格式 */
  22.         TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;/* 用于发送事件FIFO控制, 不存储 */
  23.         TxHeader.MessageMarker = 0;                      /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
  24.        
  25.     /* 添加数据到TX FIFO */
  26.     HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf);
  27. }
复制代码


回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-11-4 16:32:08 | 显示全部楼层
请教一下,我仿照HAL的方法,将数据写入CAN MESSAGE RAM中,但是我发现我无法写入数据,往我分配好给TX FIFO的RAM区域中写数据,再读出来,返现全是0,这是什么原因导致的呢
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-11-4 16:36:08 | 显示全部楼层
我仿照HAL库的方法往我分配给TX FIFO的RAM区域填充数据的时候,再读出来,发现RAM中的数据都是0,不是我写入的数据,请问是什么原因呢。
  1. uint32_t t_u32PutIndex;
  2.         uint32_t t_u32TxElementW1;
  3.   uint32_t t_u32TxElementW2;
  4.   uint32_t *pTxAddress;
  5.   uint32_t t_u32ByteCounter;
  6.         if((FDCAN1->TXBC & (0x3F << 24)) != 0)
  7.         {
  8.                 if((FDCAN1->TXFQS & (0x01 << 21)) == 0)
  9.                 {
  10.                         t_u32PutIndex = ((FDCAN1->TXFQS & (0x1F << 16)) >> 16);
  11.                         t_u32TxElementW1 = (0x00000000 | 0x00000000 | 0x00000000 | 0x01) << 18;
  12.                         t_u32TxElementW2 = 0 | 0x00000000 | 0x00000000 | 0x00000000 | 8;
  13.                         pTxAddress = (uint32_t *)(CAN_MESSAGE_RAM_BASE + 0x100 + t_u32PutIndex * 4 * 4));
  14.                         *pTxAddress++ = t_u32TxElementW1;
  15.                         rt_kprintf("RAM 0x%x的值为:%d\n",pTxAddress,*pTxAddress);
  16.                         *pTxAddress++ = t_u32TxElementW2;
  17.                         rt_kprintf("RAM 0x%x的值为:%d\n",pTxAddress,*pTxAddress);
  18.                          for(t_u32ByteCounter = 0; t_u32ByteCounter < 8; t_u32ByteCounter += 4)
  19.                          {
  20.                                         *pTxAddress++ = ((0x01 << 24) |
  21.                                                                                                   (0x02 << 16) |
  22.                                                                                                   (0x03 << 8) |
  23.                                                                                                          0x04);
  24.                                  rt_kprintf("RAM 0x%x的值为:%d\n",pTxAddress,*pTxAddress);
  25.                          }
  26.                 }
  27.         }
  28.         (t_
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
 楼主| 发表于 2021-11-4 16:46:03 | 显示全部楼层
醉心客丶 发表于 2021-11-4 16:32
请教一下,我仿照HAL的方法,将数据写入CAN MESSAGE RAM中,但是我发现我无法写入数据,往我分配好给TX FIF ...

你这个不太清楚,方便直接用我这个例子测试下吗

STM32H7的BSP驱动教程发布双FDCAN教程和配套案例,含H7-TOOL的FDCAN助手通信分析
http://www.armbbs.cn/forum.php?m ... d=109371&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-11-6 10:40:22 | 显示全部楼层
eric2013 发表于 2021-11-4 16:46
你这个不太清楚,方便直接用我这个例子测试下吗

STM32H7的BSP驱动教程发布双FDCAN教程和配套案例,含H ...

现在我的FDCAN1调通了,但是我在配置FDCAN2 的时候,我看了你的历程,你的FDCAN2的RAMOFFSET设置为500,你注释说是使用2560字的后1280字的RAM空间,但是500不是偏移了500的32位字空间吗?这里不是很理解,希望可以解答一下万分感谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
 楼主| 发表于 2021-11-6 11:03:35 | 显示全部楼层
醉心客丶 发表于 2021-11-6 10:40
现在我的FDCAN1调通了,但是我在配置FDCAN2 的时候,我看了你的历程,你的FDCAN2的RAMOFFSET设置为500, ...

这个地方忘了修改了,已经修改过来,从网盘重新下载例子看即可。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-11-6 11:18:42 | 显示全部楼层
eric2013 发表于 2021-11-6 11:03
这个地方忘了修改了,已经修改过来,从网盘重新下载例子看即可。

好的,我理解得没错就行,我现在仿照CAN1的方法去使用CAN2进行发送,发现当我往CAN MESSAGE RAM里面填好我的数据,开始发送的时候,CAN2发不出数据,查看寄存器是TXBRP的对应FIFO的索引位置1了,也就是我的发送缓冲区请求挂起了,很奇怪,我同样的方法在CAN1上面就不会挂起。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
 楼主| 发表于 2021-11-6 11:26:37 | 显示全部楼层
醉心客丶 发表于 2021-11-6 11:18
好的,我理解得没错就行,我现在仿照CAN1的方法去使用CAN2进行发送,发现当我往CAN MESSAGE RAM里面填好 ...

完全使用我这个例子的代码,通信是否正常。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-11 03:43 , Processed in 0.231789 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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