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

STM32实现SPI通信1

[复制链接]
STMCU小助手 发布时间:2022-12-25 13:10
SPI
+ t; ~: e2 D$ t- B$ Q
Serial Peripheral Interface6 L- Q1 ?& s# `& K, h& `$ V' G9 E

; z0 d, F: Y8 ~4 `9 T) P串行外围设备接口6 B  m- F* L0 V+ X: A6 j! N7 `

& |! B/ n: Z3 i  n5 F是一种告诉,全双工,同步的通信总线4 @4 C7 A+ m; Y3 \# O
MISO  h2 H+ H5 O- W, e* c  G/ @
MOSI: c$ @4 b7 R& H: P
SCL
1 r" E5 c  k* U5 p8 H  jCS
3 p% M# j$ }' f) j! E$ `
+ K# r# {- S6 {
$ [" [4 O, t2 g, k
+ ?6 s& m2 k/ N1 T, b3 u3 h* v
SPI的结构框图
. N6 |4 M1 R+ ?2 a0 Y7 [( g8 A$ ?9 x2 g& U& ^5 V
a40d5805a658444faf82826ab784c13d.png 0 E. p9 |- V0 W6 O4 A+ n2 A

* k3 i7 `' s/ X6 P% @. [+ z
% 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 [/ O( t8 `! r' }5 a外设的读写操作同时完成。若写操作,只需要忽略收到的字节,若读操作,则主机发送8位空字节即可
1 j# e& x  T) [$ D9 U' O/ M/ [. x# E4 ^0 t1 A
' i2 u4 V5 t* m& v$ ^9 E3 {

, D5 q! V8 P3 U3 M" F: |  w  X) @* e
STM32的SPI模块: h: I2 T% |9 e" v, s1 v' B# E
3线全双工同步传输0 a" _1 V# e6 l, S# }+ z
8位或16位帧格式
! j- l$ Y1 @9 R/ `主或从
9 I! V+ |1 y' i6 Q$ V可编程的时钟极性和相位
' b2 ?% v( P9 ?8 x4 g主机和从机均可通过硬件进行NSS管理
- a1 R- [7 C- M4 x! k- T' ~可编程的数据顺序,MSB在前或LSB在前) e/ p+ i# Z* W/ S  w
可触发中断的专用发送和接收标志2 R5 H2 q* c- u% h3 k

" f6 ?* u: c, s3 v) k0 x- z
1 ?9 [' T: t# A! V* k" c
& j* Y% M0 G0 Z! E6 W- [0 F  X6 a
从选择NSS管理
9 B1 K! Z; U( o" R+ m1 {) m两种NSS模式:
. b7 O# f7 n2 v. n, `8 b软件NSS4 Q! g$ S8 g1 f
硬件NSS
; U; ^9 d2 U7 H' k9 q& b
1 ?# X; {% Y" o$ G软件NSS
+ d4 j. V9 x6 Z, |通过设置SPI_CR1寄存器的SSM位来使能这种模式
% A# E$ o! @0 q+ T8 b
3 Y& I+ V0 P8 p
这种模式下NSS引脚可以另作他用。内部的NSS电平可以通过SPI_CR1寄存器进行驱动
* m3 q/ ~0 \- N1 T; \2 T. L& W% c, c9 q
( e- t: G" Y$ t% W) \
硬件NSS

& G" ^) ^( k) `0 Y) t) v$ i若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
. N* J2 I, g% X3 W9 O
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
时钟信号的相位与极性
% a0 g+ {9 h  q9 x- o) c8 p4 y1 I6 i% Y通过SPI_CR寄存器的CPOL和CPHA位进行控制
3 z! v* X' p  R  \& J4 w/ h) s! S+ ~3 O/ x& |/ ^
共有4种可能性# U7 P) r2 L8 M! c! R; i

  q" m0 p. m( g' {, x+ v9 C9 FCPOL即时钟极性,控制在没有数据传输时的是中能够空闲状态电平,对于主模式和从模式下的设备都是有效的( w* G8 s" Y8 D! K6 \4 o- }
CPOL为0,表示SCK在空闲时为低电平
/ `8 I0 r% `5 H9 x; b" ACPOL为1,表示SCK在空闲时为高电平
2 ?: G# N3 B; {+ A2 h
# A( }; j/ }3 ^) w
CPHA即数据在上升沿还是下降沿被采集
/ |+ G- N: e4 D3 Q2 v/ \/ P: p2 xCPHA为0,表示数据在下降沿被采集9 l6 C0 y1 s% L& \
CPHA为1,表示数据在上升沿被采集
! H: w4 c* W( C7 {$ w: q # r- r7 x+ v( V  p+ ?  Z  r
8a05b468380544f8b6f3f6f48070f377.png
0 ~  A1 n# p3 t: ~  |  B( v

1 e& Y- E  ?3 R4 Q8 D fa1860f1505949bf9c3cfadf2e08c254.png
& y  \2 a% M8 x; l
2 O+ r: [8 q' ?- r+ |7 ^8 j. a
使用时,根据对应芯片的Datasheet选择时钟的相位和极性
& h* }: Y0 Y  g& X. B/ J. G9 g7 R
3 D) e, C% v9 M2 u: h( ~
数据帧格式
  Z, H/ w5 M7 {由SPI_CR1寄存器的LSBFIRST位进行配置
+ E0 R1 H' Q9 I3 f0 L( n; w4 G+ ]# _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位
+ C* x+ D, z4 N# E; i' }) k
8 w5 R" n% r( l4 X0 E5 Z& p状态标志
% p9 s! X! @& s, ]9 [* }
3个状态标志
1 U4 K4 T2 ~" g% t* B发送缓冲器空闲标志TXE$ l' [" s& p- k! V8 H
接收缓冲器非空RXNE
4 b  g$ \5 P$ ^$ l忙标志Busy
3 y- F: O# z9 ]; m
# z! s# I, G% z9 f9 O
SPI中断
0 c0 G- b0 Q; `) I
+ e$ O' Y0 E  F+ m
61e27191868f4624aa8d7541eb016b02.png
* n# X5 {8 O, J( I
1 ^1 j7 ^# v" N" a% G* e
STM32F103RCT6的SPI1引脚. a; c" Z  J2 X, w8 H" `' X- O

; [$ D2 w: m  y9 X# x, b" I' {
2e56ba1221404db9be0cc1efd178328c.png ) ?! P) Z8 K6 c2 V, S
4 n# a: S& J+ m
SPI模块引脚配置的GPIO模式

2 Y) h" @8 d" _$ ?
: H8 h' L% s8 ^7 N7 v: P
67f15dded2474d6d9d57140affe65202.png
% y; J+ v* H0 N+ |: ?* V* Q/ r& F" j+ k' U5 W: J
SPI的常用寄存器
$ y6 _5 ?8 }& c1 a: D9 \SPI控制寄存器1 SPI_CR14 m, K. u1 g3 u# A3 D
, O3 [, V' z  w* _5 {7 p, T
SPI控制寄存器2 SPI_CR2
* |, f3 U1 r( A) l
8 y5 F" |. {9 q: ]+ C7 f5 ySPI状态寄存器 SPI_SR
7 I+ S4 X% d$ W! g- o
& _; 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
# ?4 _1 Q3 C1 b8 Y0 m
$ s5 c  t/ T' _, P( n
SPI_I2S预分频寄存器 SPI_I2SPR' k- \2 |0 H! r: a1 m: _

9 Y( c9 _, o! A0 r% J1 o7 [注意:STM32的SPI接口可以配置为支持SPI协议或支持I2S音频协议,默认是SPI模式,可以通过软件切换到I2S模式
& U5 f8 K+ D2 t9 I. z5 O
, ]; @* U6 Z5 B) M3 O# L& w

0 Q2 o; w% p" T* _' Y3 KSTM32的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
5f7784572d884227a3007578e182fefb.png
/ ?8 y6 a' b8 d* x. k, l( ~9 f8 F5 a( `
SPI_Init# j: e& }4 l" E; |
% p# C8 l1 n, U/ B: C$ `: {$ A" P
307646167616444dbb56a13fd1419970.png ( u! D! I6 U& n; A: Q, u
* Q8 L7 [2 g* O8 n
SPI_Cmd % T$ n4 P7 N& b) o

. {1 R9 J  V- H( ?5 s% R# b

1 g! x' X+ \, \* o* b% m5 j# i& C 2cd57fe8c62f4fad9e1d3db1ed6c0d93.png 3 c& n) c$ ]# O
% K9 G$ d8 @! D1 B; P' Y3 I; q
SPI_I2S_ITConfig7 N% ^- T" l- {' F) \3 l$ R1 U

' s# C8 @5 Y6 h" k
51fe886ab7aa4b9f8a7d23569fd22621.png
) w  e5 B) ~7 q$ [  b0 }+ h
! c  @) B4 O- x% O3 E8 E8 h
SPI_I2S_DMACmd
8 J5 N2 {& ~/ ]  C0 k( n; H
; H4 U1 P: J' m& k5 l3 Y! g6 x
. ~$ l/ o, \! X( q0 e( g" @1 G
a5be3c19f560413db16dfef09f78a954.png 6 ^7 W; o: K" e; v. m

7 w- r$ V7 J6 w* c2 J# i
SPI_I2S_SendData: Y# u5 x  r  k2 R8 X/ I
7 h) v% B7 U) x  j; {

1 n" h% l% |. Y4 X% }/ q 61a0204a6c1149daaeb1ce7f636e6678.png 7 T! q9 z# z/ O! i

3 u9 `, C) s% n# g5 V
SPI_I2S_ReceiveData7 c$ i; [. n# h9 k

: y) H+ B% ]/ R: e6 y3 Y4 F
4b37ef56b6b741938204d5415a8c4250.png
- ^0 F2 K' @' F7 e; P% g' Y' _

, X; L) X$ @$ H, B: ?) U SPI_DataSizeConfig
/ a3 I! v! P4 T7 @' W1 |( j; i) |, W8 M) j, m9 E) w4 U
d6982c430216409eae89c840cfdfca01.png
1 p% v4 c# t. d# Y; a2 [7 `9 \; X  p, _, P7 U2 V- [
SPI_I2S_GetFlagStatus
, O* M, m. D% z9 U0 M
5 }- E4 H/ W7 A$ l& O
% s  n2 y5 `! ]/ J  `( M
7965d79a42b14d6f873295613edb88cd.png
$ K1 v; J8 [! U) H7 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

; `# @7 B% O7 p5 s9 F
98a4115cf3ed43948539b053ff0313d9.png
# L- h7 v# [7 t. q) b1 d  I0 k
+ p# w6 Z+ v, ?7 ?- I SPI_I2S_GetITStatus
) @# P) C$ }) D9 e4 I! _
9 t, k7 A: _; d  v: S: v: c
f2a03da213554f6e82fefcd193a62f66.png
/ o$ Q6 w+ d# _' X  I9 S: O( u  l% d/ h* X% g1 ?6 K# M
SPI_I2S_ClearITPendingBit! S( m+ r9 \- ]) j

# z$ s+ ?& N8 M) ~ b8f7d7549a534f8b96a9b7dbe6dec7b2.png
, `1 C8 d% X7 |7 E& o! A4 x7 u: Y& G" [

% p3 Y% [5 M; m0 R+ S! A————————————————7 C' J3 @  M, o: G  l+ ~9 s
版权声明:CodeForCoffee
6 _  S2 }& d7 d0 T2 f2 l; G% A( o! f7 q/ F
, a( B! |* [- P) s* T: U
赞 收藏 评论0 发布时间:2022-12-25 13:10

举报

0个回答

所属标签

相似技术帖

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