打印
[STM32L5]

【STM32L562 DK试用】6、SPI Loopback测试

[复制链接]
135|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
       上一章我们体验了串口空闲中断+DMA的方式接收不定长的串口数据,这一次我们体验一下另一种串行通讯——SPI。
我们本次采用Loopback的方式进行测试,在SPI通信中采用Loopback(回环)测试方法,核心目的是在不依赖外部设备的情况下,快速验证SPI接口的基本功能是否正常。通过将SPI主设备的MOSI(主输出从输入)、MISO(主输入从输出)引脚短接,构建自环通路,主设备发送的数据可直接被自身接收,形成闭环验证。
       这样可以有效测试:
              排除硬件连接问题:在复杂系统中,外部设备可能因接触不良、线路干扰等问题导致通信失败。首先通过Loopback测试确认SPI控制器本身工作正常;
              验证协议配置:测试可检查SPI工作模式(如时钟极性CPOL、时钟相位CPHA)、数据位宽(8位或16位)、传输方向(全双工/半双工)等关键参数配置是否正确;
              简化调试流程:无需准备外部从设备,节省测试准备时间,适合开发初期快速验证硬件基础功能。
       要实现Loopback测试最主要的硬件部分就是引脚短接,本开发板上连接了很多的外设器件,那么我们想要短接只能找一下能用的外接接口:
       最有效的就是使用arduino接口,CN11对应的就有SPI对应的是D11和D12,注意这个不是MCU的引脚,下图可以看出对应的引脚是PB4和PB5:
       进一步查看STM32CubeMX可以看到,可以选择是SPI1,也可以选择SPI3,这里我们选择SPI1:
       实物连接如下:
       接下来我们进行SPI的配置,更改为了SPI3,主要是避开调试引脚,
       接下来编写一下SPI测试程序:
<article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;pfSY-1742737651919&quot;,&quot;name&quot;:&quot;code&quot;,&quot;data&quot;:{&quot;wrap&quot;:false,&quot;tokensPerLine&quot;:[],&quot;language&quot;:&quot;&quot;,&quot;theme&quot;:&quot;default&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;YdWK-1742737651918&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;GG3Q-1742737651917&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;void SPI_Loopback_Test(void) \r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;jtJY-1742737679191&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;KKjJ-1742737679190&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;{\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;y66Y-1742737679193&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Q32M-1742737679192&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  uint8_t tx_buffer[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Dpwb-1742737679196&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;LLmz-1742737679194&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;                           0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;f9v0-1742737679198&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;7xI6-1742737679197&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  uint8_t rx_buffer[16] = {0};\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;pfEo-1742737679200&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;MHkJ-1742737679199&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  \r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;p03a-1742737679202&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;UbzP-1742737679201&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  // 发送并接收数据\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;nLed-1742737679204&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;AlHr-1742737679203&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  HAL_SPI_TransmitReceive(&hspi3, tx_buffer, rx_buffer, 16, 100);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;skOr-1742737679206&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;8RHW-1742737679205&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  \r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;3D0m-1742737679208&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;d4rH-1742737679207&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  // 验证数据一致性\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;vnfE-1742737679210&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;h6pq-1742737679209&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  if(memcmp(tx_buffer, rx_buffer, 16) == 0) {\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;X7WW-1742737679212&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;T6a4-1742737679211&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;    // 数据匹配,测试通过\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;ANN1-1742737679214&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Sh10-1742737679213&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;    HAL_UART_Transmit(&huart1, (uint8_t *)&rx_buffer, 16, 0xFFFF);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;gHL0-1742737679216&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;oZGd-1742737679215&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  }\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;jlks-1742737679218&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;WMMt-1742737679217&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;}&quot;,&quot;marks&quot;:[]}]}]}],&quot;state&quot;:{}}]"><div yne-bulb-block="code" data-theme="default" style="white-space-collapse: preserve;" data-language="">void SPI_Loopback_Test(void) 
{
  uint8_t tx_buffer[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
                           0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};
  uint8_t rx_buffer[16] = {0};
  
  // 发送并接收数据
  HAL_SPI_TransmitReceive(&hspi3, tx_buffer, rx_buffer, 16, 100);
  
  // 验证数据一致性
  if(memcmp(tx_buffer, rx_buffer, 16) == 0) {
    // 数据匹配,测试通过
    HAL_UART_Transmit(&huart1, (uint8_t *)&rx_buffer, 16, 0xFFFF);
  }
}</div></article>

       效果如下:
       可以看到数据收到后通过串口发送了出来,和传输的数据是一样的,其实SPI还有很多用处,很多外设模块使用的都是SPI接口,有时候只发送(比如一些TFT的控制),更多的是传感器,不过需要注意很多从机的传感器是需要主机提供时钟的,也就是说在读取的时候也需要主机给时钟驱动。

使用特权

评论回复
沙发
xuanhuanzi| | 2025-3-25 10:39 | 只看该作者
Loopback测试到底是什么个测试?

使用特权

评论回复
板凳
Bymyself|  楼主 | 2025-3-25 12:06 | 只看该作者
xuanhuanzi 发表于 2025-3-25 10:39
Loopback测试到底是什么个测试?

就是回环测试,自己的模块就能自发自收,串口也可以

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

214

帖子

0

粉丝