news 2026/4/18 9:34:30

[STM32C0] 【STM32C092RC 测评】FDCAN Loopback测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[STM32C0] 【STM32C092RC 测评】FDCAN Loopback测试

CAN同样可以进行Loopback测试,我们首先连接一下CAN的基本概念。
控制器局域网总线(CAN)作为专为实时应用量身打造的串行通讯协议,在工业及自动化领域扮演着至关重要的角色。仅需简单的双绞线,它便能实现信号的高效、稳定传输。凭借卓越的性能与广泛的适用性,CAN总线已成为全球范围内应用最为广泛的现场总线之一。我们将深入探索STM32在CAN总线方面的具体应用之法。
本次测试中的C092型号支持FDCAN,即CAN FD(CAN with Flexible Data Rate),作为传统CAN协议的升级版,其核心升级聚焦于协议层面,物理层维持原状。CAN与CAN FD的关键差异体现在:
传输速率:传统CAN的传输速率较为固定,而CAN FD引入可变速率机制,能根据实际需求灵活调整,尤其在大数据量或高实时性要求的场景下,显著提升数据传输速率。
数据域长度:CAN FD扩展了数据域长度,相较于传统CAN有限的数据域,CAN FD单次通信可传输更多数据,减少通信次数,提高通信效率。
帧格式:为适应可变速率和数据域长度的变化,CAN FD优化了帧格式,不仅支持更高效的变速率与大数据量传输,同时保持与传统CAN协议的兼容性。
ID长度:CAN FD不仅扩展了数据域长度,还增加了标识符(ID)的长度,提供更多寻址空间,支持更多节点,增强系统扩展性和灵活性。
我们看一下C092开发板中对应CAN接口的原理图:

对应的单片机引脚如下:

实物接口如下:

Loopback测试连接如下:

就是这么简单,紧邻常用的USB接口,C0系列设备在USB与FDCAN之间做出了巧妙的设计取舍,二者仅能择其一配备。
接下来进行FDCAN的配置:
先看一下时钟配置,因为C092支持最大的是48MHz,到FDCAN最大也是48MHz:

启动FDCAN:

下面就是具体参数的设置,我们本次主要进行一下回环测试,所以要进行如下配置:

基本参数
Clock Divider时钟分频
Frame FormatCANFD模式
Mode正常工作模式
Auto Retransmission自动重传
Transmit Pause传输暂停
Protocol Exception协议异常处理
Nominal Sync Jump Width裁决段同步跳转段宽度
Data Prescaler数据段分频系数
Data Sync Jump Width数据段同步跳转段宽度
Data Time Seg1数据段时间段1
Data Time Seg2数据段时间段2
Std Filters Nbr标准滤波器数量
Ext Filters Nbr拓展滤波器数量
Tx Fifo Queue Mode发送模式

我们按照例程中的配置参数进行一下配置:

接下来进行比特率的配置,如下图:

上图所示选项中,最小数值设定为1,比特率的计算公式为:比特率 = CAN时钟 / (时钟分频 × 预分频 × (Seg1 + Seg2 + 1))。即便采用此最小配置参数,理论上能达到的最大比特率可高达16MHz。
软件方面主要是配置过滤器,这里我们主要配置过滤ID,前面各开启了一个标准滤波器和一个扩展滤波器:

复制

  1. <p>/* Configure standard ID reception filter to Rx FIFO 0. Only accept ID = FilterID1 */</p><p> FDCAN_FilterTypeDef sFilterConfig;</p><p> sFilterConfig.IdType = FDCAN_STANDARD_ID;</p><p> sFilterConfig.FilterIndex = 0U;</p><p> sFilterConfig.FilterType = FDCAN_FILTER_DUAL;</p><p> sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;</p><p> sFilterConfig.FilterID1 = 0x444;</p><p> sFilterConfig.FilterID2 = 0x444; /* For acceptance, MessageID and FilterID1 must match exactly */</p><p> if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Configure extended ID reception filter to Rx FIFO 1. Only accept ID between FilterID1 and FilterID2. */</p><p> sFilterConfig.IdType = FDCAN_EXTENDED_ID;</p><p> sFilterConfig.FilterIndex = 0U;</p><p> sFilterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;</p><p> sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;</p><p> sFilterConfig.FilterID1 = 0x1111111;</p><p> sFilterConfig.FilterID2 = 0x2222222;</p><p> if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p>


然后是进行数据的发送和接收,这里都是通过FIFO的模式进行缓存的,并在接收节点进行接收数据打印,这里面发送配置中主要就是ID要满足上面过滤器的要求:

复制

  1. <p>FDCAN_TxHeaderTypeDef txHeader;</p><p> /* Add message to Tx FIFO */</p><p> txHeader.Identifier = 0x444;</p><p> txHeader.IdType = FDCAN_STANDARD_ID;</p><p> txHeader.TxFrameType = FDCAN_DATA_FRAME;</p><p> txHeader.DataLength = FDCAN_DLC_BYTES_12;</p><p> txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;</p><p> txHeader.BitRateSwitch = FDCAN_BRS_ON;</p><p> txHeader.FDFormat = FDCAN_FD_CAN;</p><p> txHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;</p><p> txHeader.MessageMarker = 0x52U;</p><p> if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData0) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Add second message to Tx FIFO */</p><p> txHeader.Identifier = 0x1111112;</p><p> txHeader.IdType = FDCAN_EXTENDED_ID;</p><p> txHeader.TxFrameType = FDCAN_DATA_FRAME;</p><p> txHeader.DataLength = FDCAN_DLC_BYTES_12;</p><p> txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;</p><p> txHeader.BitRateSwitch = FDCAN_BRS_ON;</p><p> txHeader.FDFormat = FDCAN_FD_CAN;</p><p> txHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;</p><p> txHeader.MessageMarker = 0xCCU;</p><p> if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData1) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Add third message to Tx FIFO */</p><p> txHeader.Identifier = 0x1111113;</p><p> txHeader.IdType = FDCAN_EXTENDED_ID;</p><p> txHeader.TxFrameType = FDCAN_DATA_FRAME;</p><p> txHeader.DataLength = FDCAN_DLC_BYTES_12;</p><p> txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;</p><p> txHeader.BitRateSwitch = FDCAN_BRS_OFF;</p><p> txHeader.FDFormat = FDCAN_FD_CAN;</p><p> txHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;</p><p> txHeader.MessageMarker = 0xDDU;</p><p> if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData2) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p>/* Get tick */</p><p> uint32_t tickstart = HAL_GetTick();</p><p> /* Wait transmission complete */</p><p> while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != NB_RX_FIFO)</p><p> {</p><p> /* Timeout handling */</p><p> if ((HAL_GetTick() - tickstart) > TX_TIMEOUT)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> }</p><p>/*##-4 Receive messages ###################################################*/</p><p> /* Check one message is received in Rx FIFO 0 */</p><p> if (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) != 1U)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Retrieve message from Rx FIFO 0 */</p><p> if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Compare received RX message to expected data */</p><p> if ((rxHeader.Identifier != 0x444) ||</p><p> (rxHeader.IdType != FDCAN_STANDARD_ID) ||</p><p> (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||</p><p> (BufferCmp8b(txData0, rxData, COUNTOF(rxData)) != 0U))</p><p> {</p><p> Error_Handler();</p><p> }</p><p>HAL_UART_Transmit(&huart2, (uint8_t *)&rxData, 12, 0xFFFF);</p><p> /* Check two messages are received in Rx FIFO 1 */</p><p> if (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO1) != 2U)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Retrieve message from Rx FIFO 1 */</p><p> if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &rxHeader, rxData) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Compare received RX message to expected data */</p><p> if ((rxHeader.Identifier != 0x1111112) ||</p><p> (rxHeader.IdType != FDCAN_EXTENDED_ID) ||</p><p> (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||</p><p> (BufferCmp8b(txData1, rxData, COUNTOF(rxData)) != 0U))</p><p> {</p><p> Error_Handler();</p><p> }</p><p>HAL_UART_Transmit(&huart2, (uint8_t *)&rxData, 12, 0xFFFF);</p><p> /* Retrieve next message from Rx FIFO 1 */</p><p> if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &rxHeader, rxData) != HAL_OK)</p><p> {</p><p> Error_Handler();</p><p> }</p><p> /* Compare received RX message to expected data */</p><p> if ((rxHeader.Identifier != 0x1111113) ||</p><p> (rxHeader.IdType != FDCAN_EXTENDED_ID) ||</p><p> (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||</p><p> (BufferCmp8b(txData2, rxData, COUNTOF(rxData)) != 0U))</p><p> {</p><p> Error_Handler();</p><p> }</p><p>HAL_UART_Transmit(&huart2, (uint8_t *)&rxData, 12, 0xFFFF);</p>


最后在通过在FIFO中查询的数据进行打印,与发送的数据一致:


---------------------
作者:qintian0303
链接:https://bbs.21ic.com/icview-3450544-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 10:03:17

云南内连四省外踏三国,它的位置有多重要?

我国云南就像一个位于十字路口的“超级枢纽”。 在国内&#xff0c;它与西藏、四川、贵州、广西四省区手牵手相连&#xff1b;在国外&#xff0c;它更像是把脚伸向了缅甸、老挝和越南三国。 这种独一无二的内外连通性&#xff0c;让云南的战略地位脱颖而出。 独特的地理位置…

作者头像 李华
网站建设 2026/4/18 5:35:39

在以往工作中遇到的不同 kubernetes 问题总结

前言 本文基于对 Hidden Kubernetes Bad Practices Learned the Hard Way During Incidents 的阅读后&#xff0c;在尊重原文内容的基础上进行了本地化翻译与整理&#xff0c;在语义表达上相较于机翻&#xff0c;更加贴近中文母语者的阅读习惯&#xff0c;提升整体的可读性与理…

作者头像 李华
网站建设 2026/4/15 8:17:37

对声音数字化的一些问题

一、声音转模拟的电信号 一般是麦克风和三极管放大电路组成。 麦克风一般是线圈感应类型或者电容类型。 二、模拟电信号转数字信号 需要模拟转数字信号。 需要一些电压比较器&#xff0c;当模拟电压达到某个电压&#xff0c;就导通输出数字电平。 三、过滤噪音的思路 1、声音数…

作者头像 李华
网站建设 2026/4/18 8:30:40

摄影爱好者必备:afilmory 个人摄影网站服务器搭搭建教程

如果你是摄影爱好者,不管是风光、人像、街拍还是纪实,大概率都会遇到这些情况: 📷 拍了很多照片,却长期躺在硬盘里 😵 社交平台压缩严重,画质失真 🧠 想系统性展示作品,却不知道怎么搭网站 💻 用现成建站平台,风格和控制力都有限 🔒 希望作品只属于自己,不被…

作者头像 李华
网站建设 2026/4/18 8:34:56

技术小白也能用的 Homebrew:WailBrew 服务器部署教程

如果你是 macOS 用户,大概率听说过 Homebrew,但也一定遇到过这些情况: 😵 安装软件要敲一长串命令 🧠 不知道装过什么、删没删干净 💻 看到终端就犯怵 🔁 换电脑后,环境要从头来 📦 只是想装个工具,却感觉像在“学运维” 后来我接触到 WailBrew 这种专门给技术…

作者头像 李华
网站建设 2026/4/18 8:01:41

【学术干货免费领】学术会议海报 | 学术会议必备 | 科研展示 | 科研海报 | 国际学术海报 | 会议参会 | 科研成果展示 | 海报展示 | 90+学术Poster模板0元打包下载,速领!

一句话&#xff1a;只要你的研究需要“被看见”&#xff0c;模板就能让你“被看懂、被记住、被引用”。硕博研究生开题/中期/毕业答辩、学术年会、国内外会议 Poster Session30 min 出图&#xff0c;导师秒过&#xff0c;奖学金加分青年教师/博士后职称评审、基金前期成果墙、校…

作者头像 李华