你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】6、SPI回环测试

[复制链接]
qintian0303 发布时间:2025-5-4 00:00
       这一次我们探索另一种常见的串行通讯方式——SPI(串行外设接口)。SPI 作为一种高速、全双工、同步的通信总线,在众多嵌入式系统和电子设备中都有着广泛的应用。而为了对 SPI 接口的功能进行全面且有效的测试,我们本次将采用一种独特且实用的测试方法——Loopback(回环)测试。       在 SPI 通信架构中,主要涉及到四个关键的信号引脚:SCK(串行时钟)、MOSI(主设备输出/从设备输入)、MISO(主设备输入/从设备输出)以及 CS(从设备选择)。主设备通过 SCK 引脚提供时钟信号,控制数据的传输节奏;MOSI 引脚用于主设备向从设备发送数据;MISO 引脚则负责从设备向主设备回传数据;CS 引脚用于主设备选择与之通信的从设备。
7 g3 l0 U7 h7 g: g& B- L; c       而 Loopback 测试方法,其核心精髓在于构建一个自环通路,让 SPI 通信在不依赖外部从设备的情况下,也能快速验证 SPI 接口的基本功能是否正常运作。具体实现方式是将 SPI 主设备的 MOSI 引脚与 MISO 引脚进行短接。这样一来,主设备发送出去的数据,无需经过外部设备的中转,直接通过短接的线路被自身接收,从而形成一个完整的闭环验证系统。这种方式有这一些显著优势:& V3 l( U5 V3 y6 z
高效排除硬件连接问题
- ?! D2 b* R! ~1 B5 {       在实际的复杂电子系统中,硬件连接问题往往是导致通信故障的常见因素之一。外部设备可能由于接触不良、线路受到电磁干扰、引脚虚焊等多种原因,使得 SPI 通信无法正常进行。而通过 Loopback 测试,我们可以将问题范围迅速缩小到 SPI 控制器本身。因为在这种测试模式下,数据传输完全在主设备内部完成,无需考虑外部设备的连接状态。如果测试能够顺利通过,就说明 SPI 控制器的硬件部分基本工作正常,从而排除了因硬件连接问题导致的通信失败的可能性,为后续的故障排查提供了明确的方向。
& i; K9 T' `, {1 [. c全面验证协议配置6 d" N$ h' x1 C  E. w' q2 g) _
       SPI 通信协议具有多种可配置的参数,这些参数的正确设置对于通信的成功至关重要。例如,时钟极性(CPOL)决定了串行时钟信号在空闲状态时的电平高低;时钟相位(CPHA)则规定了数据采样和变化的时刻与时钟信号边沿的关系;数据位宽可以是 8 位、16 位甚至更宽,影响着每次传输的数据量;传输方向也有全双工和半双工之分,决定了数据是否可以同时进行双向传输。Loopback 测试为验证这些关键参数配置是否正确提供了一个绝佳的平台。在测试过程中,我们可以按照预定的协议配置发送特定格式的数据,然后检查主设备接收到的数据是否与发送的数据一致。如果数据能够准确无误地被接收,就说明当前的协议配置是正确的;反之,如果出现数据错误或通信异常,我们就可以根据测试结果有针对性地调整协议参数,直到找到正确的配置组合。
6 z* y) ~, u$ {9 U2 b7 b, P显著简化调试流程
, ?! {7 [0 \7 a' h1 K) g4 q1 w       在开发初期,准备外部从设备往往需要花费大量的时间和精力。不仅要确保从设备的硬件连接正确无误,还需要对从设备进行相应的编程和配置,以使其能够与主设备进行正常的通信。而 Loopback 测试则完全摒弃了这一繁琐的过程,无需准备外部从设备,大大节省了测试准备时间。开发人员可以在开发环境搭建完成后,立即进行 SPI 接口的基本功能测试,快速验证硬件基础功能是否正常。这使得开发人员能够更加专注于 SPI 控制器本身的功能实现和优化,提高了开发效率,缩短了产品的开发周期。6 I* |1 ^3 B/ e
       要实现Loopback测试最主要的硬件部分就是引脚短接,本开发板上连接了很多的外设器件,那么我们想要短接只能找一下能用的外接接口:: |7 P. p  h$ w  I2 m
1.png
4 S- @5 J$ g! P, y+ s* v
5 B" L0 [- d* k0 B, l, X
      最有效的就是使用arduino接口,CN5对应的就有SPI对应的是D11和D12,注意这个不是MCU的引脚,对应的引脚是PA6和PA7, j' }' `/ x* u& h( w# B5 ?4 ]4 K$ |
      进一步查看STM32CubeMX可以看到,这里我们选择SPI1:0 {. }) G% Y& H+ W
2.png
+ L2 K* E  |4 Q- m$ p( a
; N- R9 P8 s' |0 D* E+ J/ h
      实物连接如下:
: \* d/ N! b9 d% j# b
3.png / g5 p) J" P1 k9 L4 J/ _

4 ]: O( {) T7 K# x+ b2 a6 [( \      接下来我们进行SPI的配置,
0 a  z) E; b, k/ {# f9 C6 ^
4.png 7 g+ E: J6 p; F% Z! E

8 }5 k7 M* n7 C      接下来编写一下SPI测试程序:
2 W$ R( U' ^9 v" v6 R' k
  1. void SPI_Loopback_Test(void) 7 Y/ Q, [* z" Y2 z
  2. {. ]$ H2 X# T6 a
  3.   uint8_t tx_buffer[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,9 x6 H8 [- P/ q- b
  4.                            0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};. u, _3 a$ Z' D& v6 j9 b8 {" E- X4 c, o
  5.   uint8_t rx_buffer[16] = {0};
    $ T2 H4 r7 V) T, ?( ]
  6.     z$ u& s7 i7 m; W8 p9 x
  7.   // 发送并接收数据
    6 P2 Y- F% {7 H" n6 ^
  8.   HAL_SPI_TransmitReceive(&hspi3, tx_buffer, rx_buffer, 16, 100);, {6 H+ c  J0 M1 x5 B
  9.   
    + R' O- K8 ?: _- ~/ u
  10.   // 验证数据一致性
    2 X+ R: ]; U8 s' l: b7 G2 U* Z: V
  11.   if(memcmp(tx_buffer, rx_buffer, 16) == 0) {
    . B7 H8 p8 y5 \  g1 W* H
  12.     // 数据匹配,测试通过
    9 C0 D2 E* x1 M5 U" S2 [
  13.     HAL_UART_Transmit(&huart1, (uint8_t *)&rx_buffer, 16, 0xFFFF);
    & q8 h4 B( I' k
  14.   }
    6 h6 N0 E2 H8 L# m5 r. g! ]6 B8 T
  15. }
复制代码
     效果如下:* R/ G5 m8 g) n6 N( u$ D
5.png 2 V* P, R2 B; Y4 X0 E

* w' w( \0 t' f1 E$ Z5 F$ V' o1 p      可以看到数据收到后通过串口发送了出来,和传输的数据是一样的(后16个),其实SPI还有很多用处,很多外设模块使用的都是SPI接口,有时候只发送(比如一些TFT的控制),更多的是传感器,不过需要注意很多从机的传感器是需要主机提供时钟的,也就是说在读取的时候也需要主机给时钟驱动,还有一点就是SPI的频率不能太高,本次我使用2分频(SPI频率24MHz)就SPI通信失败了,没有收到数据,将分频提高到32(1.5MHz)就通信成功了。
  k0 Z6 j, j% B* \$ v
# a2 q7 g8 y7 E8 E" y; r- {2 j, @: A$ H# t% _( m3 V
% ~6 j- G0 M2 v7 l1 W" C4 U! J

' F1 L; q) y( D, P! Z8 Y$ |  g; s. I! d' t& c6 b

5 v# g5 D( g- i" {$ i( W) J2 U" J. D7 h+ y  g# D" F9 J# }- t2 e1 `
赞 收藏 评论0 发布时间:2025-5-4 00:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版