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

分享一个STM32F2的SPI2主模式驱动OK

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。  B, \# y+ _+ H" c, F
1.GPIO的配置与103系列的不同;
6 y, g1 A* ]  I1 [' I$ s' a  C8 t2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;6 g# N% }9 v2 {+ w
其他特性请参考datasheet.
8 J5 j) x& c: }- ~9 o: s
  1. /*******************************************************************************
    , K  K0 S9 E! e- `, D
  2. //STM32F207VGT6 FOR ENC28J60
    1 a. p/ f3 i' e6 k6 F0 m
  3. //SPI2初始化/IO初始化等
    ; g9 d. F7 `* R# C5 K2 S4 a6 o& R
  4. //SPI configuration
    ) r$ ?) J. x2 q
  5. @@ JUST FOR STM32F2XX1 b/ z1 o5 r4 A# a
  6. *******************************************************************************/2 V0 z: d/ s- n  ]
  7. void ENC28J60_SPI2_Init(void)
    # s) L* C3 z2 t4 {6 V
  8. {) Q$ W' F9 K1 j. L
  9.     SPI_InitTypeDef  SPI_InitStructure;
    ' Q9 m, j/ b4 s& T. |% t
  10.     GPIO_InitTypeDef  GPIO_InitStructure;
    " I' n4 p  f# B. F% K4 H

  11. 6 b. d$ D3 F7 F6 U; ]3 W7 Q- c+ G
  12.      /*!< Enable the SPI2 clock */        6 [6 W, j" @9 J2 {
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
      B9 _" @. {- x3 ]0 P$ H  S5 m$ d6 |/ O
  14. ) I0 \5 S5 g- O! D0 f
  15.     /*!< Enable GPIO clocks */2 z  n5 j; K$ F7 M3 ~$ w" m
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);& |0 P+ }& L9 R$ o) |
  17.     /*!< SPI2 pins configuration */
    5 w6 x4 s$ _! f# U6 W+ ?% |  J
  18.    
    / J* G# p# e  F6 i; Q
  19.      /* Configure SPI2 pins as alternate function (No need to
    . B8 ~  k; f3 `- {
  20.      configure PB12 since NSS will be managed by software) */  
    / j- h4 E0 g0 ~, j
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss 4 c* P- ]% v) r# C& [$ e$ j8 C
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck( K9 K* n( H+ y& L7 s
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso
    - H1 A& [2 b. w+ I! d- c
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
    4 T. ?( E0 ~# V
  25.    
    * S9 D0 K8 A, k3 m' I
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    " \- f( k; F' u' K. ^" G5 H9 I! i6 f: K
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz) k0 j/ C' F2 \* H
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    " s/ j5 ?2 @( [7 ]# y
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
    ( i6 h8 X7 o) i% U* Z
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;% T6 M( I2 E+ }- C6 u( a
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
    & {" J+ e2 |. i* q) W" v
  32.       : F) l# p5 |9 M, c  L1 T- s
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; , q/ c! k% Y( r5 P
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;' e3 f4 l/ }9 }3 K9 x( w9 w' d
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;: g4 Z7 j+ D, a8 X
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; 3 N5 j+ z' \5 e) T0 I6 X" o
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
    4 |* J+ H; Y3 w) O# b9 A8 j/ y
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    / f. O% |7 p1 Y5 T6 @1 r
  39.   
    . [. h3 X; j- h1 }" _4 S% j  L: H
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/% i5 K# ~# Q3 c- \" {- O
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;' G4 @9 w5 g! g. A9 Q# ^) `6 ^
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! E3 o1 l( B) v; w% c3 E
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    4 \, b; K! F* V9 K
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;2 V  v: z* r, H; w  Y/ d9 y; x+ B) r3 R
  45.     /*!< SPI2 pin configuration */
    3 o7 o; |- g9 T* O9 d" o
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT
    ! W% R. ^. p. P7 j8 r; S
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);4 K# g: F8 D& p- b" g

  48. + u) n5 O8 z3 s( e4 z
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    ' s+ I& L9 e  X1 g5 a
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI, p, q; {1 d" M$ e& r* S" {  T
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构1 B  ]8 S4 |. T( r8 b8 r$ Y
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
    3 S; A4 R8 F: N, `
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿% j2 `; ^% ?3 F  _" ]
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备
    ( g  d& \! n* b# h( P8 B1 t" E! m
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
    % k& D  i3 [- K' _  G6 H; e
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */" b, T8 W2 o$ `
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;
    4 A! U$ f% n; Z2 Y" m
  58.     SPI_Init(SPI2, &SPI_InitStructure);9 H; C  P# P' [; a* v
  59.     SPI_Cmd(SPI2, ENABLE);
    - y$ x3 G: b+ ]7 D- d1 V; Y
  60. 2 K; E; H. u1 ?/ P4 i
  61. }
    , C; A0 r* @8 g1 J* b) t6 A

  62. / A. r# O; f; x! E
  63. /*******************************************************************************
    ( v' G1 L* G" s* ?4 W
  64. * Function Name  : SPI_ReadWriteByte. J3 @+ E& [$ I$ _1 @
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
    ( D6 I* E  t# A; I5 b* Q& l
  66. * Input          : unsigned char TxData
    . o: F7 P1 K6 ~. i) c: p$ Y
  67. * Output         : None/ N  D0 U# k# w. U7 S# Q
  68. * Return         : unsigned char RxData  |  L0 f# e2 d1 e0 x- n/ E' I2 D  ?
  69. *******************************************************************************// Z  W! }9 K! o" K2 s8 r
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData)
    / {4 v  p% G9 r
  71. {
    / G) C2 a- P/ C- S$ |! D
  72.     unsigned char RxData = 0;, v) \" H% X1 [( F$ d0 w, C
  73.     /* Wait till Transmit buffer is empty */ 1 D- n8 h" a0 V$ G' u. _' e
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    ) |# p6 |$ L5 T' k6 `
  75.     /* Send A data */        / X% ^% h( }" K7 c5 P
  76.     SPI_I2S_SendData(SPI2, TxData);
    : B/ B7 c% X$ `' f  @% _* Q) c
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
    , B2 M! z0 g" ~9 U
  78.     //等待数据接收- [% U! f9 i3 f
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);; ?$ v$ z' D' l$ E
  80.     //取数据
    # a0 f  n: X- C4 ]
  81.     RxData = SPI_I2S_ReceiveData(SPI2);
    5 z2 E! B0 W, q( M  x* _
  82.     return (unsigned char)RxData;; ~! V8 J5 Y8 s4 s% I1 N
  83. }! i0 N0 N& Z; A! J# J7 L; x
  84. ! |  Z6 C/ R3 e& y
  85. % {" {# H! d- ^6 B
复制代码
) j) `) K1 \9 f3 L: M9 ^$ s4 h

/ @' ~8 A, m) e* L
赞 收藏 1 评论3 发布时间:2015-2-3 16:57

举报

3个回答
北斗光寒 回答时间:2015-2-3 19:14:49
这个用来做什么的?
caizhiwei 回答时间:2015-2-3 19:28:41
驱动你的spi外设~
abb200628 回答时间:2015-2-3 20:40:53
好资料,谢谢分享

所属标签

相似技术帖

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