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

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

[复制链接]
STMCU小助手 发布时间:2022-9-6 22:54
一、SPI 实验----I/O端口配置
, ?; P4 L" I) r7 u# p在本次 SPI 实验中,STM32芯片做主控,主要使用 SPI1 功能。3 a5 ]- y5 n# a+ Z/ I7 ~1 k, P

4 a1 X4 v# U! o' Y% x具体引脚配置如下:
% j/ x9 {( _8 s" b& n KY~`2R~Q0BL~898TK5%(T%0.png
* ~% t$ v) B( y. h' p
, i  I  p1 j7 _3 a7 n& d) O具体引脚初始化程序如下:( q( ]6 |9 L8 T: X1 w& P
0 Y- X8 b3 Z  o: k7 P
  1. /*
    3 p) t) ]% H; S3 e# L% C4 J0 J% T
  2.         SPI引脚初始化配置
    * d; }) P. q! g+ ~
  3.         **PA4------CS0 {% h) V, X( o) S, C
  4.         **PA5------SCLK
    2 w& i6 u! c- A2 c' x" O1 \
  5.         **PA6------MISO
    % m) j7 W0 V0 [) M% r9 h: M
  6.         **PA7------MOSI
    5 ~1 I) Q4 c5 V" G0 [+ \
  7. */
    8 p( O0 w7 E# ]6 D/ o

  8. ! N/ ?- l: F: o* D# l) ]
  9. void SPI1_GPIO_Config(void)        
    , T) P7 D$ M7 L! t- ?
  10. {
    ' L9 T- H3 V- a$ `* ?, t
  11.         GPIO_InitTypeDef GPIO_InitStructure;6 V( V1 _0 V4 S' ?  p" V2 Z! O
  12.         ( e1 |8 U5 \" [
  13.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能
      o3 h) v+ J7 @3 E! M: K) K" w9 I

  14. & v" E# X- k3 J
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6|GPIO_Pin_7;
    7 r, r- ]$ J' j
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA5/6/7复用推挽输出
    2 A) I7 m* T: u8 D" {  O3 X2 n2 J
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;3 {, X- }' [' P: C& g* P
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化GPIOA* I; V$ E, Y: o& ^/ O$ R2 R
  19.         : O( }9 S0 O- A: o3 `
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    6 h  y& n+ k- O. F* Z
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PA4推挽输出( h6 y  B; T) u1 N6 m: N) H
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;% R( x+ R2 Y$ `3 l" Z* i
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);                          //初始化GPIOA  r; Q+ B9 p/ a7 b& S0 K
  24. 6 W7 C6 ^( W. ^7 }1 U
  25.         GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //初始上拉输出
    6 X6 C7 z! L5 j0 J3 L. o
  26. }
复制代码

3 B7 C; e; U& T9 h二、SPI 实验----SPI初始化配置
5 b# i" ?5 Z; {. N8 ?1. SPIC初始化句柄8 M/ L0 k" @. q1 \: @
具体结构体如下:
' m7 j/ `- k+ v% A$ X9 s. r  D) t, \
, b" w$ a7 y7 F! [' c
  1. typedef struct+ X# {6 k" ^  p0 _- w) G" b4 ?
  2. {) h9 A5 D0 u: {9 M
  3.   uint16_t SPI_Direction;  //设置SPI通信方式:半双工,全双工,串行发送和串行接收。      
    ( v; q! U( _8 `, r1 |2 r' R0 _5 e' [
  4. 8 R4 j/ M' I, r) x/ P8 C: {
  5.   uint16_t SPI_Mode;      //设置SPI主从模式:主机模式,从机模式。7 I0 I+ ]8 K& H. o' H3 O

  6. 7 T. [3 U; L" M8 d* }  ]* E2 Y6 S
  7.   uint16_t SPI_DataSize;  //设置数据帧结构:8位,16位。% }. j. X+ f7 N* M
  8. 2 s6 G) L( B4 L% `. k' J; H# l: R
  9.   uint16_t SPI_CPOL;      //设置时钟极性CPOL:空闲状态低电平或者高电平。/ R( e1 E9 b4 ?3 C7 F" ?" ]

  10. 0 R$ d, f0 A+ n; @7 H# l
  11.   uint16_t SPI_CPHA;      //设置时钟相位CPHA:第一个或者第二个跳边沿采样。
    1 g: l- r. [  R; o$ t7 @8 a2 H, n% q
  12. ; b+ u+ B# q" w2 d* z' X$ l
  13.   uint16_t SPI_NSS;       //片选信号由硬件控制还是软件控制。, v; T8 O2 r& L

  14. , p% ]1 T+ D- u! `5 m2 |
  15.   uint16_t SPI_BaudRatePrescaler;  //设置波特率预分频值:2、4、8、16、32、64、128和256。! k! L0 P: K0 q6 N; j8 m

  16. * A7 k7 K0 A+ {0 q/ o' g
  17.   uint16_t SPI_FirstBit;          //设置数据传输顺序:MSB高位在前、LSB低位在前。  G2 V0 F7 N0 x4 G

  18. 9 q' E5 Z2 |' {3 B: m
  19.   uint16_t SPI_CRCPolynomial;     //设置CRC校验多项式,提高通信可靠性,大于1即可。3 T! z2 w3 e- Q8 g4 @. w3 y

  20. ! g5 E" O( N# h- r/ Y* g; m- D
  21. }SPI_InitTypeDef;
复制代码

3 m. @* }6 e1 J+ Z: p2. SPI初始化配置( Y4 e4 p" f2 ^& i1 E
具体如下:, s! s: ]$ y1 q

# ^% ~1 T8 i- \0 j
  1. void SPI1_Init(void)
    * b: J; R. [7 r) M5 n, B: m6 D' b
  2. {* a9 N0 J: M4 |
  3.         SPI1_GPIO_Config();//SPI引脚初始化配置        
    8 w0 Q; x& g9 a; c+ L
  4. 1 K1 M3 d: k; n  g  r$ q
  5.         SPI_InitTypeDef  SPI_InitStructure;
    7 I0 I2 r5 q) e$ O7 [* p
  6.         , [7 @' V! O3 @- ]+ ^: V4 M
  7.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,  ENABLE );//SPI1时钟使能         
    1 P/ f! \! v& C0 T) |9 k7 [
  8.         - z) g/ g/ g+ W! q4 d
  9.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    ! {9 Q' v' l( j) O
  10.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI设置为主机模式
    ' S7 U1 A1 G* X6 n! @8 _
  11.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI为8位帧数据结构+ L& K; d0 Y! v0 o: M- r
  12.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //串行同步时钟的空闲状态为高电平
    8 J! m$ Z3 ?7 |: S3 R
  13.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变沿(上升或下降)数据被采样. _# v' g+ y, k6 y- ]7 |
  14.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//片选信号由软件控制, I1 j# i2 T1 j* C
  15.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//定义波特率预分频的值:波特率预分频值为256+ V/ m+ G, k+ |1 D3 Z* K
  16.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始+ {( q/ ~- c/ q. V8 g
  17.           SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式为7& _6 e9 x& \6 q( ~: |0 w7 N( I
  18.         SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器- G, y7 `/ t# p  S. [( o; w
  19.         
    & Q, N- G0 X7 C& U5 d; ?
  20.           SPI_Cmd(SPI1, ENABLE); //使能SPI外设( y5 F9 f4 E% T
  21.           SPI1_ReadWriteByte(0xFF);//启动传输
    % Z$ l/ C. t* @  s, e" Y1 I% [
  22. }
复制代码
+ i$ ~, e( F: S8 j6 f- _

& R! \, X) R, L% q* U$ I" q三、SPI 实验----SPI 读写操作9 W" h2 W3 g5 r+ W+ p  N2 Q
具体程序如下:' I& q( o8 U+ c" Q8 o9 g

' @# r* C: q' K1 h4 C* w7 q
  1. /*) v4 q# _7 r  m3 R( j
  2.         SPI的读写操作7 E8 R5 U: a: V7 Q
  3.         **TxData:要写入的字节! g( s+ i+ [2 i9 `# s# F, }: I# F
  4.         **返回值:读取到的字节
    6 _* g" f6 q% E9 r
  5. */$ T0 O: E, l8 ?- L

  6. - D2 \9 W- [3 y
  7. uint8_t SPI1_ReadWriteByte(uint8_t TxData)# [* S: R  i% p0 P8 R* {( q
  8. {                                 # U- n& s* g" n- W. g% T1 G
  9.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位' n; J4 f, h/ B7 i  A
  10.         {
    + ~1 x' J8 T3 J5 d* ^% P$ D
  11.                 //等待发送完成( I( O9 w  [4 c# H2 @! D
  12.         }                          
    . d* w. `) o  ~" f7 x- z7 r$ I, G
  13.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据/ y% X8 C% g) b
  14.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位) O$ S7 }4 _1 B: y8 @) a: N
  15.         {, G7 U+ }2 e! @! B4 y) d  K
  16.                 //等待接收完成& ~( k. `) q5 H8 y" l: t
  17.         }                                                              
    . ?# q  l9 F& c- k5 W8 @, y
  18.         return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据                                            7 a+ y) E( \* I$ b; X4 P& V
  19. }
复制代码
5 |$ B1 e7 g' }8 G( ~0 X
; q! T% S" [" q! k! s
. S2 f* h: A) f7 W
————————————————  C* N" i2 Y2 a1 w
版权声明:根号五; U: }. m5 r( g1 X7 t, F) d+ S

& h" `  W3 \2 N, L8 @
0 Y) _2 D3 {6 _
赞 收藏 评论0 发布时间:2022-9-6 22:54

举报

0个回答

所属标签

相似技术帖

官网相关资源

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