STMCU小助手
发布时间:2022-12-25 13:10
|
SPI Serial Peripheral Interface6 L- Q1 ?& s# `& K, h& `$ V' G9 E 串行外围设备接口6 B m- F* L0 V+ X: A6 j! N7 ` 是一种告诉,全双工,同步的通信总线4 @4 C7 A+ m; Y3 \# O MISO h2 H+ H5 O- W, e* c G/ @ MOSI: c$ @4 b7 R& H: P SCL CS $ [" [4 O, t2 g, k + ?6 s& m2 k/ N1 T, b3 u3 h* v SPI的结构框图 $ ?9 x2 g& U& ^5 V
% J2 t0 D7 ~6 v" r* Z& f. _; i ` 8个时钟周期,主机和从机移位寄存器中的数据完全交换3 ~3 q- I Y# K D: P1 e" `$ Q! w2 [& p 硬件上通过4根线连接4 d. ^5 P3 Z2 r% n6 e 主机和从机都有一个串行移位寄存器,主机通过向自己的SPI串行寄存器写入一个字节来发起一次传输* `; \( {% t) N: }: B* p 串行寄存器通过MOSI将主机数据传输给从机,同时从机也将自己的串行移位寄存器数据通过MISO传给主机,两个串行移位寄存器中的内容进行交换 外设的读写操作同时完成。若写操作,只需要忽略收到的字节,若读操作,则主机发送8位空字节即可 . x# E4 ^0 t1 A ' i2 u4 V5 t* m& v$ ^9 E3 { STM32的SPI模块: h: I2 T% |9 e" v, s1 v' B# E 3线全双工同步传输0 a" _1 V# e6 l, S# }+ z 8位或16位帧格式 主或从 可编程的时钟极性和相位 主机和从机均可通过硬件进行NSS管理 可编程的数据顺序,MSB在前或LSB在前) e/ p+ i# Z* W/ S w 可触发中断的专用发送和接收标志2 R5 H2 q* c- u% h3 k 1 ?9 [' T: t# A! V* k" c & j* Y% M0 G0 Z! E6 W- [0 F X6 a 从选择NSS管理 两种NSS模式: 软件NSS4 Q! g$ S8 g1 f 硬件NSS 软件NSS 通过设置SPI_CR1寄存器的SSM位来使能这种模式 3 Y& I+ V0 P8 p 这种模式下NSS引脚可以另作他用。内部的NSS电平可以通过SPI_CR1寄存器进行驱动 . L& W% c, c9 q ( e- t: G" Y$ t% W) \ 硬件NSS 若NSS输出被使能,此时STM32工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,此时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成SPI设备1 X7 I; N4 @6 N# |, ]% S4 l ' s. N6 u2 n) O( p 若一个SPI设备需要发送广播数据,它必须拉低NSS信号,从而通知其他所有的设备,它是主设备;如果它不能拉低NSS,这意味着总线上有另外一个主设备在通信,这是将产生Hard Fault 7 O; g& C) N5 `" Q+ p; T 若NSS输出被关闭,允许操作于多主环境0 J4 V0 ?0 J* X3 l+ P : O3 I9 ~; ]7 g9 W$ u t3 _, V( p! x0 A 时钟信号的相位与极性 通过SPI_CR寄存器的CPOL和CPHA位进行控制 ) s! S+ ~3 O/ x& |/ ^ 共有4种可能性# U7 P) r2 L8 M! c! R; i CPOL即时钟极性,控制在没有数据传输时的是中能够空闲状态电平,对于主模式和从模式下的设备都是有效的( w* G8 s" Y8 D! K6 \4 o- } CPOL为0,表示SCK在空闲时为低电平 CPOL为1,表示SCK在空闲时为高电平 CPHA即数据在上升沿还是下降沿被采集 CPHA为0,表示数据在下降沿被采集9 l6 C0 y1 s% L& \ CPHA为1,表示数据在上升沿被采集 # r- r7 x+ v( V p+ ? Z r
2 O+ r: [8 q' ?- r+ |7 ^8 j. a 使用时,根据对应芯片的Datasheet选择时钟的相位和极性 . B/ J. G9 g7 R 3 D) e, C% v9 M2 u: h( ~ 数据帧格式 由SPI_CR1寄存器的LSBFIRST位进行配置 + ]# _3 j5 a2 `+ r% a 输出数据可以MSB或LSB Y$ M# X7 e% m4 T0 q. D - q6 K( _0 n" H7 M/ w 由SPI_CR1寄存器的DFF位可以配置数据帧为8位或16位 状态标志% p9 s! X! @& s, ]9 [* } 3个状态标志 发送缓冲器空闲标志TXE$ l' [" s& p- k! V8 H 接收缓冲器非空RXNE 忙标志Busy SPI中断
1 ^1 j7 ^# v" N" a% G* e STM32F103RCT6的SPI1引脚. a; c" Z J2 X, w8 H" `' X- O
4 n# a: S& J+ m SPI模块引脚配置的GPIO模式
& F" j+ k' U5 W: J SPI的常用寄存器 SPI控制寄存器1 SPI_CR14 m, K. u1 g3 u# A3 D , O3 [, V' z w* _5 {7 p, T SPI控制寄存器2 SPI_CR2 SPI状态寄存器 SPI_SR & _; n2 [' I4 A$ X( i6 Z SPI数据寄存器 SPI_DR% F' Z; h2 D! z, a1 | C `( f+ e& ]. s7 s, ]& j( B% o SPI_I2S配置寄存器 SPI_I2S_CFGR $ s5 c t/ T' _, P( n SPI_I2S预分频寄存器 SPI_I2SPR' k- \2 |0 H! r: a1 m: _ 注意:STM32的SPI接口可以配置为支持SPI协议或支持I2S音频协议,默认是SPI模式,可以通过软件切换到I2S模式 STM32的SPI相关固件函数 p- W3 y8 t3 Z( ~ SPI_I2S_DeInit, ]+ g8 P* D; u8 G4 G; f : ^5 D5 a. x' I4 Q5 M+ c" P
( ~9 f8 F5 a( ` SPI_Init# j: e& }4 l" E; | % p# C8 l1 n, U/ B: C$ `: {$ A" P
* Q8 L7 [2 g* O8 n SPI_Cmd % T$ n4 P7 N& b) o
% K9 G$ d8 @! D1 B; P' Y3 I; q SPI_I2S_ITConfig7 N% ^- T" l- {' F) \3 l$ R1 U
! c @) B4 O- x% O3 E8 E8 h SPI_I2S_DMACmd . ~$ l/ o, \! X( q0 e( g" @1 G
SPI_I2S_SendData: Y# u5 x r k2 R8 X/ I 7 h) v% B7 U) x j; {
SPI_I2S_ReceiveData7 c$ i; [. n# h9 k
SPI_DataSizeConfig ; i) |, W8 M) j, m9 E) w4 U
2 [7 `9 \; X p, _, P7 U2 V- [ SPI_I2S_GetFlagStatus % s n2 y5 `! ]/ J `( M
7 v* h. P, p* w# F: B D& P! k- _' J , j1 a6 }$ f2 z) g6 [& }1 ~ SPI_I2S_ClearFlag& b$ d, h3 i7 J- m6 w% t6 _) q
SPI_I2S_GetITStatus
l% d/ h* X% g1 ?6 K# M SPI_I2S_ClearITPendingBit! S( m+ r9 \- ]) j
4 x7 u: Y& G" [ ————————————————7 C' J3 @ M, o: G l+ ~9 s 版权声明:CodeForCoffee 2 f2 l; G% A( o! f7 q/ F , a( B! |* [- P) s* T: U |
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
SPI 32位宽DMA方式收发失败问题
SPI 高温读错最后一位?STM32F42xx 官方根治方案
经验分享 | LAT1470 SPI传输长度超过1024时出现异常的问题分析
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
经验分享 | STM32H723 SPI 通讯异常排查:实时观察窗口的 “隐形干扰” 解决方案
【STM32C0评测】4、驱动Lorasx126x,实现透传
经验分享 | STM32 SPI半工单线通信示例
经验分享 | 多个SPI的DMA传输为何仅1个有效?
经验分享 | STM32C0 HAL 库的 SPI 驱动导致的 Hardfault 问题分析
微信公众号
手机版