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

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

[复制链接]
STMCU小助手 发布时间:2022-9-6 22:54
一、SPI 实验----I/O端口配置- T; Y) z- k' S: o, Z+ A. n7 J# s( {
在本次 SPI 实验中,STM32芯片做主控,主要使用 SPI1 功能。' a: d6 S2 W) a/ b* _% ~* m

9 s! W+ u  A2 y! _& w9 U具体引脚配置如下:5 {  L4 o% k/ N& q/ A; Y6 h, e4 g
KY~`2R~Q0BL~898TK5%(T%0.png
% Z' z9 k; f$ K9 W$ B- F1 q' c4 T! i6 b. F' n  Q# H' ~
具体引脚初始化程序如下:
% G, t0 S3 Z, ?6 {
6 d( z9 U# T* K5 n! I! O- D* q/ ^
  1. /*
    5 Q: ~& m  G  S# \4 ]
  2.         SPI引脚初始化配置0 v* Z% N: D; ?, G# c- \( o6 g5 ~
  3.         **PA4------CS7 _1 e) d  j, v+ P9 ?# R9 D$ z) ]; e
  4.         **PA5------SCLK% p6 t+ K: {! N4 l- S
  5.         **PA6------MISO. j7 ?" Q$ ~$ q7 \! D1 u. v4 \
  6.         **PA7------MOSI
    7 |4 R( Q3 _4 m7 T3 Y; J
  7. */
    ; z! z8 E  P. r& r- U
  8. ( {9 ?; z# o* O. S# @
  9. void SPI1_GPIO_Config(void)        
    # D; D6 T3 U1 X: \$ {8 ?& V
  10. {
    3 w6 h0 X4 ^2 q5 G2 t: R
  11.         GPIO_InitTypeDef GPIO_InitStructure;
    * m1 Y$ J: F( V& ~  ~" c: |: N
  12.         % l0 o7 L$ a, |" p' m  B4 E" }
  13.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能
    5 H- e; |2 W4 g% X
  14. - A9 Q- D/ J! g' k) a; V7 O
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6|GPIO_Pin_7;
    2 z  v& c" `( v2 O8 }& }
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA5/6/7复用推挽输出 , H' n; f6 E8 r5 h0 _3 D  z
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" A9 m3 ]+ ~! ]  Q& q* t
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化GPIOA
    1 z& H7 I2 [* N  Q" G1 X: v7 _  k' g
  19.         
    # f/ r% s& d# K, h- U3 {  x) Z
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;8 D# b* c' q/ v& L+ G, R
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PA4推挽输出
    - _7 u5 c2 |/ i9 A  M
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    0 j( O3 z1 K. C
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);                          //初始化GPIOA
    ! s- N1 N" h5 B

  24. , a1 v4 h3 U) p  F$ E
  25.         GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //初始上拉输出
    ' {- L- ?8 K/ [9 G$ v/ E( g5 C2 V
  26. }
复制代码

. e5 E4 }( h; o  V+ Z! \5 L二、SPI 实验----SPI初始化配置
; |% n' s% p9 Q9 R* U1. SPIC初始化句柄- z. |0 K9 ]8 v; T+ Z- N
具体结构体如下:+ S1 y7 r7 v  K" X
! t- A" K* q3 {- s7 o! D1 k! j) J1 q
  1. typedef struct
    ' V- T* `1 A' I7 k- _* h4 X& O, i
  2. {
    , K* ~6 s0 p' C! S$ h2 T! a7 `
  3.   uint16_t SPI_Direction;  //设置SPI通信方式:半双工,全双工,串行发送和串行接收。      
    $ x: h, e2 b: ^! q* c% `

  4. 8 ]( L% Z* Y3 s7 N5 F1 G7 n  H
  5.   uint16_t SPI_Mode;      //设置SPI主从模式:主机模式,从机模式。
    ; {( _) f+ X# c1 |" m2 {: _5 s

  6.   H; U, {: d; F# ]( z% E
  7.   uint16_t SPI_DataSize;  //设置数据帧结构:8位,16位。
    0 o" M2 i1 o, \+ d. @

  8. & e( j5 U6 N0 {; ~: B* h1 B! o
  9.   uint16_t SPI_CPOL;      //设置时钟极性CPOL:空闲状态低电平或者高电平。
    1 @+ A8 ^$ u) a% a, K3 E" p9 J

  10. " w! M* u( V1 b* \
  11.   uint16_t SPI_CPHA;      //设置时钟相位CPHA:第一个或者第二个跳边沿采样。/ G6 P/ C. }- z

  12. 2 T* O7 Y4 h; J% w: m5 N
  13.   uint16_t SPI_NSS;       //片选信号由硬件控制还是软件控制。/ {) P' h1 W9 b2 A4 Y- I0 y' t$ T( c
  14. 9 z5 T9 c+ S  V" y
  15.   uint16_t SPI_BaudRatePrescaler;  //设置波特率预分频值:2、4、8、16、32、64、128和256。
    8 S8 R+ Y4 p7 j3 k; _% i

  16. - v! M+ X# R7 F; j: [
  17.   uint16_t SPI_FirstBit;          //设置数据传输顺序:MSB高位在前、LSB低位在前。+ q; {7 w% a3 D8 j, y1 z8 x  n
  18. ' M7 h; P  q& W* O6 `8 R5 p' m
  19.   uint16_t SPI_CRCPolynomial;     //设置CRC校验多项式,提高通信可靠性,大于1即可。1 m& B1 g' D+ ]* q$ Z- L7 W
  20. # u- K. D3 `6 s- H: i1 F
  21. }SPI_InitTypeDef;
复制代码
8 q$ ~8 m" s; \1 ]4 z2 g
2. SPI初始化配置* E) k6 T3 m0 y) }' w; l% g3 x
具体如下:0 g* D0 ]- D# s- ^, W; V% w

' `# M9 h( C! C/ ?. `9 b
  1. void SPI1_Init(void)
    $ D$ t* P# r$ }  j8 n# W5 A
  2. {3 f/ P( b7 Y3 ^; @# P) ~- d6 m
  3.         SPI1_GPIO_Config();//SPI引脚初始化配置        - o  }, s+ E; f3 t; Y$ `. K

  4. 7 u9 r9 @& q. l& @
  5.         SPI_InitTypeDef  SPI_InitStructure;+ Z2 E/ T) W4 R% D3 L
  6.         , L2 p+ v; [" u& r7 l1 C  |$ c6 m$ G
  7.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,  ENABLE );//SPI1时钟使能         , X. a1 r0 {" }5 W$ y7 F3 O8 r
  8.         - c# B1 K* f2 j5 u9 e6 N
  9.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    3 f, _: O& C. A1 i4 V; k8 i
  10.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI设置为主机模式
    / F6 p, }; s/ ~/ w, Z- r
  11.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI为8位帧数据结构
      ~8 }% B5 i, F/ F' K: n& m1 P( j
  12.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //串行同步时钟的空闲状态为高电平$ {. f- s8 p4 D4 `2 M+ @( q- f
  13.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变沿(上升或下降)数据被采样$ q' q* a; Y5 y
  14.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//片选信号由软件控制
    " f. }' D) b# a: k  P$ B
  15.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//定义波特率预分频的值:波特率预分频值为256
    - D) T. q8 ?( b) R2 ]
  16.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    + z, T8 C* t6 u+ H3 B# ^, J
  17.           SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式为74 L2 @3 k) s  q/ a3 J
  18.         SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
    5 x/ @7 u7 `3 k# u! A, H/ C6 ^: s
  19.         
    3 }) u1 A- D% Q% r- V) r
  20.           SPI_Cmd(SPI1, ENABLE); //使能SPI外设# a+ t8 q. T) d! ]0 ~6 Y6 }1 j- d* p8 [
  21.           SPI1_ReadWriteByte(0xFF);//启动传输
    + d: F) v2 K6 H- q& _
  22. }
复制代码
) h" x( ^- w4 A* `& Z
) b- {( F8 `4 q+ ^, l1 E. `: d
三、SPI 实验----SPI 读写操作5 C" t' `: N/ \$ ^& T- o, [: H
具体程序如下:
% A# y) v* H1 ]  A1 l  S' q7 x) h& E- v0 n
  1. /*  C: v. t5 K  G; f
  2.         SPI的读写操作
    ) ^4 n2 ^: L- v
  3.         **TxData:要写入的字节
    - K) ^- l2 O/ `0 X& i$ N
  4.         **返回值:读取到的字节
    , X# T9 [) G' n( L2 x3 g0 `" Y
  5. */
    3 M% }: I6 ]) [3 P
  6. * l( }6 u* s: O1 }
  7. uint8_t SPI1_ReadWriteByte(uint8_t TxData)
    , j, |* O( R8 P6 ]" k9 \, o0 E
  8. {                                 . c: a5 z6 v( I$ `
  9.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位, V/ |( b8 O# s' P9 c3 ^
  10.         {5 ~6 h* X, @/ T  \" w! c  J
  11.                 //等待发送完成: }! H3 x2 R2 g: {% c
  12.         }                          
    0 w& [( P5 q2 k/ X& @2 a
  13.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
      {( i2 P+ X" A; ^4 t/ O
  14.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
    : x' Z! I) n6 ^) l1 J) J9 N
  15.         {
    + P/ @. ^9 q. F5 z0 m+ L% M
  16.                 //等待接收完成
    . h( e" b& a, n7 Z3 d
  17.         }                                                              
    * ~  d7 Z( |6 M  y
  18.         return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据                                            
    3 @. K& m0 a; q/ P
  19. }
复制代码

9 ]4 T, `6 q+ L
& J0 I# T- o6 M9 a9 q- r8 m6 V
/ C) o+ T, K1 {* A) C# \————————————————
% N# V) Y# o/ n" s) ]版权声明:根号五
6 n  c$ b" p: J0 @& @( S6 t/ I; Y; g  l; |& Q

( I5 V7 O% Z0 W* o
收藏 评论0 发布时间:2022-9-6 22:54

举报

0个回答

所属标签

相似分享

官网相关资源

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