[STM32C0] STM32C092RC测评 | 板载外设 — SPI与CAN的回环测试

[复制链接]
 楼主| 发表于 2025-7-6 01:25 | 显示全部楼层 |阅读模式
来源:21ic论坛网友孤独的单行者,版权归原作者所有

通常SPI测试采用LCD驱动,但液晶屏的SPI接口基本上只能测试发送是否可行,接收无法测到。为达到更好效果,本次SPI测试采用回环测试;同时,对于串行接口来说基本通用,因此这里将SPI和CAN都放入回环测试。
SPI(串行外设接口)是一种广泛应用于嵌入式系统及电子设备的高速、全双工、同步通信总线,其核心包含四个关键信号引脚:SCK(串行时钟)、MOSI(主出从入)、MISO(主入从出)及CS(从设备选择)。SCK负责生成时钟信号,以调控数据传输流程;MOSI负责由主设备向从设备传输数据;MISO则实现数据的反向回传功能;CS引脚用于选定参与通信的从设备。Loopback测试的核心机制在于构建一个自环通路,通过直接将主设备的MOSI与MISO引脚短接,实现数据在无外部设备连接的情况下的闭环传输,从而迅速且有效地验证SPI接口的基本功能完整性。
CAN作为专为实时应用量身打造的串行通讯协议,在工业及自动化领域扮演着至关重要的角色。仅需简单的双绞线,它便能实现信号的高效、稳定传输。本次测试中的C092型号支持FDCAN,即CAN FD(CAN with Flexible Data Rate),作为传统CAN协议的升级版,其核心升级聚焦于协议层面,物理层维持原状。我们主要关注的点在于传输速率、长度、帧格式、ID等内容。
首先看一下SPI的回环测试。为此我们需要找到SPI的MOSI(主出从入)、MISO(主入从出)引脚,我们看一下C092支持的SPI模块,并选择SPI1作为基础测试配置:




接下来编写一下SPI测试程序:
<p>void SPI_LoopbackTest(void) </p>
<p>
{
</p>
<p>  uint8_t SPItx_buffer[10] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,</p>
<p> 0x09,0x0A};</p>
<p>  uint8_t SPIrx_buffer[10] = {0};</p>
<p>  HAL_SPI_TransmitReceive(&hspi1, SPItx_buffer, SPIrx_buffer, 10, 100);</p>
<p>  if(memcmp(SPItx_buffer, SPIrx_buffer, 8) == 0)
{</p>
<p>    HAL_UART_Transmit(&huart2, (uint8_t *)&SPIrx_buffer, 10, 0xFFFF);</p>
<p>
  }
</p>
<p>
}
</p>

[color=rgba(0, 0, 0, 0.9)]效果如下:
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]主要不要连接错了,有三个引脚,有一个是地:



我们看一下FDCAN的配置:
\
注意一下,我们开启了FIFO进行数据接收,传输速率可以通过时钟分频、预分频 、Seg1、Seg2这几个参数进行配置。
CAN的一个特色就是其需要ID进行过滤,可以通过添加过滤器的方式将无用信号剔除,我们创建一个标准过滤器以及一个扩展滤波器:
<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>
然后创建三个带ID的数据发送,其中两个是在ID滤波器中间的:
<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          = 0x2111113;</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>staticconst uint8_t  txData0[] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21};</p>
<p>staticconst uint8_t  txData1[] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};</p>
<p>staticconst uint8_t  txData2[] = {0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};</p>
通过比对后发现,只有牵连组数据发送出来了,不在这个区间的直接过滤了:


[color=rgba(0, 0, 0, 0.9)]


本帖子中包含更多资源

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

×
发表于 2025-7-29 23:44 | 显示全部楼层
SPI与CAN的回环测试非常不错的测试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1345

主题

1614

帖子

23

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