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

STM32F103标准库开发---SPI实验---底层驱动程序

[复制链接]
STMCU小助手 发布时间:2022-9-6 22:54
一、SPI 实验----I/O端口配置
9 Z  }- Y! S2 M" B% Q; {2 d+ |在本次 SPI 实验中,STM32芯片做主控,主要使用 SPI1 功能。
: S6 \  z( C" c% M$ r+ ?. _% p2 G2 _/ ^5 e5 L5 `" ~4 K
具体引脚配置如下:
1 @; c( V# L4 l6 |' n% e- J' F KY~`2R~Q0BL~898TK5%(T%0.png & d3 s, b9 A% X/ B( W3 ?9 d* S4 B* t
  ~& v% w. U4 R6 F3 G& w
具体引脚初始化程序如下:
" R% @* Y) V, y3 O
' w, \6 |8 t" G" _# w# f
  1. /*
    + J- ~7 D  k# @# R: v; T0 Y% i8 M
  2.         SPI引脚初始化配置5 J0 _+ {; L. v) q, a7 o4 L
  3.         **PA4------CS
    7 R. p8 X3 }& n4 Q. ?% d. k
  4.         **PA5------SCLK
    ' j3 r2 S2 {6 [4 E. p! J
  5.         **PA6------MISO
    . n" {* e1 p/ e# M9 F
  6.         **PA7------MOSI. l: k9 j5 N0 u) Z& f! ?
  7. *// U% }( t- @, V! ]  ]6 L

  8.   L& T1 @/ W; Z3 u
  9. void SPI1_GPIO_Config(void)        
    1 |/ V- L% I! U# E; C5 ^
  10. {0 L4 V8 l/ C2 O6 U! c
  11.         GPIO_InitTypeDef GPIO_InitStructure;
    $ b5 a  }( g/ `0 |
  12.         
    ! g. k* U; S( x, f; v- `3 T  v
  13.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能
    7 ^' f' l. V5 M% j8 f9 O
  14. % S+ m; P4 Z( ~' b4 N8 G
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6|GPIO_Pin_7;
    9 _! X! C+ w, L) V7 k# ]0 v6 h0 k9 p
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA5/6/7复用推挽输出
    , \; w2 [  S. b, d6 D2 J
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 w" W0 M/ F, @& \" z
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化GPIOA$ e. X1 q" i- D5 z4 J
  19.         
    2 ]$ S$ i2 q; N1 y
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;4 p9 D2 r  F1 R
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PA4推挽输出/ F. U2 u/ X- z. ?; p- a: o2 u
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    3 ^% o( P. g0 [6 o! T
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);                          //初始化GPIOA2 f8 Q& L8 X' @0 \( V8 g
  24. 8 |5 i. F, H: M# z
  25.         GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //初始上拉输出
    ; s$ ?  u9 t0 l+ }5 d
  26. }
复制代码
. d) |/ ^  W  Q
二、SPI 实验----SPI初始化配置
8 ^/ [/ N2 P2 y# Q7 }1. SPIC初始化句柄
! U. V+ J4 o% ~2 D/ m4 \具体结构体如下:
( L6 |$ Q( }9 a: j
+ m2 l! v' I! e, {
  1. typedef struct# W0 F0 b) S2 a8 P
  2. {! n6 m4 s0 J. `" l
  3.   uint16_t SPI_Direction;  //设置SPI通信方式:半双工,全双工,串行发送和串行接收。       8 T7 J$ k1 o, v/ M& T

  4. 8 b5 E* s5 A+ h0 n
  5.   uint16_t SPI_Mode;      //设置SPI主从模式:主机模式,从机模式。& }! W! F9 ]  c2 d1 r0 Y9 o

  6. 3 J0 _5 L8 L/ |  H/ ^0 \
  7.   uint16_t SPI_DataSize;  //设置数据帧结构:8位,16位。7 F+ _+ [$ U, q

  8. ( r4 K) d) B# X
  9.   uint16_t SPI_CPOL;      //设置时钟极性CPOL:空闲状态低电平或者高电平。
    1 m& G& S, M9 U. X! M  m3 r
  10. / @7 x- c* I% u0 o0 @$ ^
  11.   uint16_t SPI_CPHA;      //设置时钟相位CPHA:第一个或者第二个跳边沿采样。; J7 ]! a) Z- k8 B' O

  12. - Q: ]  l% g$ u  y; e
  13.   uint16_t SPI_NSS;       //片选信号由硬件控制还是软件控制。
    - p- B6 }# |& T+ R" I  ~6 p

  14. " E3 e! ^2 P2 Y$ E
  15.   uint16_t SPI_BaudRatePrescaler;  //设置波特率预分频值:2、4、8、16、32、64、128和256。
    0 w6 u8 Z4 r1 q: M& h( g- E

  16. & a: C$ q* j4 [* q
  17.   uint16_t SPI_FirstBit;          //设置数据传输顺序:MSB高位在前、LSB低位在前。
    & k% @8 q- h  N1 e  y; j' I' N
  18.   t7 Q: X' s5 }! `, g$ @" |; B
  19.   uint16_t SPI_CRCPolynomial;     //设置CRC校验多项式,提高通信可靠性,大于1即可。
    , e( R- r/ U/ o6 n& {% S5 I: }# v
  20. 6 a' y" v2 ^' J" Z" g/ v
  21. }SPI_InitTypeDef;
复制代码

7 H  r) Z3 F: T. e2. SPI初始化配置
! E4 u! @  o0 ?8 X( v+ [6 [具体如下:) V! v& l4 I% [& u5 J0 X1 \
9 g2 d9 a5 _6 I% o. d
  1. void SPI1_Init(void)
    - f4 T0 w$ |& i& D. A0 b# i$ t
  2. {. V: o# Z4 Z7 X
  3.         SPI1_GPIO_Config();//SPI引脚初始化配置        , @, A1 h1 G& A' _, b

  4. % \% U+ d  Y8 U# t' o2 {7 c
  5.         SPI_InitTypeDef  SPI_InitStructure;$ F/ ]0 I. S5 B5 P
  6.         
    5 H, b) i5 s. @/ v0 D+ S
  7.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,  ENABLE );//SPI1时钟使能         8 r5 P  Q$ ^4 d( K6 K
  8.         
    ; H; C5 z; g9 G7 k) E! q
  9.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    % K& p" u( V7 ?  l. L
  10.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI设置为主机模式
    & w! w7 Z, n5 I! B/ a) x
  11.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI为8位帧数据结构/ Q  p& ^3 ^9 d
  12.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //串行同步时钟的空闲状态为高电平
    5 [( c2 U6 E7 s, g  |/ A+ Q
  13.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    " e7 d6 Q: ^  \* T$ h
  14.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//片选信号由软件控制  x7 ^# P3 {$ Q
  15.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//定义波特率预分频的值:波特率预分频值为256) O/ d/ Z( o) t9 @% i
  16.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    " B7 o4 S& x. X. m5 Q' }# ~
  17.           SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式为7
    " _3 }/ u$ B# w$ `* c& L
  18.         SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器4 u/ H0 I) Y' A% S5 l) J9 z) k
  19.         # Q4 O" L' W1 h' F" L
  20.           SPI_Cmd(SPI1, ENABLE); //使能SPI外设9 o9 x( H5 [# ?# H. l& r
  21.           SPI1_ReadWriteByte(0xFF);//启动传输
    8 I5 x0 k7 R, P
  22. }
复制代码

$ b  q& s1 w  H0 U) N* a% a4 g
- R% M2 z5 \9 Z8 U, b, ]6 j三、SPI 实验----SPI 读写操作
4 }. `5 m' H" z  A具体程序如下:
; L/ s: e: t# t: F6 x2 M
& W5 W  v; W' ?3 r8 J1 h
  1. /*; O: F% z% `8 w5 q2 [
  2.         SPI的读写操作7 \+ R7 r1 M3 i& Q3 W8 D4 Y+ t
  3.         **TxData:要写入的字节( [, U9 V0 G5 S6 a8 R1 T9 c
  4.         **返回值:读取到的字节6 S3 Y" d- a$ w
  5. */6 x3 X0 S( H* z5 Q% {. Q- }* W
  6. # O' X5 l9 u4 T# s5 J& q! |
  7. uint8_t SPI1_ReadWriteByte(uint8_t TxData)
    & X/ r' c. p, g6 v2 d
  8. {                                 
    % h' L( Q* U6 p- c& y
  9.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位4 {" D5 h" J) K9 L6 o! n& y8 P0 ~
  10.         {
    ; v5 L  B: p! b  n0 a; W
  11.                 //等待发送完成' `  ~* W9 n: B- R7 ]
  12.         }                          & }* t7 y6 T# }5 e% W0 L6 o
  13.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
    " Y9 E9 b# m3 N) D( T- Q+ J
  14.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位! h" x* l) ?3 G! _6 C, R. R; c
  15.         {
    3 j0 T9 n: B8 M
  16.                 //等待接收完成
    + [4 u& Q; b" }2 R* e$ @) }4 Q
  17.         }                                                              
    + w! U3 y: d3 J! \2 n
  18.         return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据                                            
    5 e+ B. `1 p( p$ \; P9 d; f! E
  19. }
复制代码

  e  S. M' h7 }2 @* h- H
2 B9 D3 I, p. {' V" `
+ G! y4 _9 [& Q1 H% |5 g3 a4 y$ z————————————————
$ k9 m+ D: [! I4 z$ S% e版权声明:根号五% A5 B/ g1 t. J( A3 T5 g
4 L1 c1 o" Y& H# b2 T( o5 D' Z' g2 p

4 \3 w8 R3 w8 d, u0 w
收藏 评论0 发布时间:2022-9-6 22:54

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版