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

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

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。
  H0 N: _2 H1 _2 |* C" \* U1.GPIO的配置与103系列的不同;
: ~# J2 F* Y: m5 u" f( l/ \2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;6 [( T2 X; O$ T& \. F/ _5 _
其他特性请参考datasheet.: [5 O6 J) S& g4 W
  1. /*******************************************************************************, Z. F, x) G4 z' z# w
  2. //STM32F207VGT6 FOR ENC28J60# \+ O) J  z( D: J4 H1 `/ w5 M, E
  3. //SPI2初始化/IO初始化等
    7 V) S8 i3 B4 ~0 E- t
  4. //SPI configuration
    0 k+ @9 ~2 O& B+ _& D! y, B) x
  5. @@ JUST FOR STM32F2XX& K6 @' R6 u) v1 B" b* D
  6. *******************************************************************************/- W% w0 m. v" S5 F. I6 n9 k
  7. void ENC28J60_SPI2_Init(void)
    ; g  x: ?# o/ c! l
  8. {0 M: ~7 v( t( |% L  {. q
  9.     SPI_InitTypeDef  SPI_InitStructure;
    % j; X: S$ m8 T, A/ d8 n' G- t
  10.     GPIO_InitTypeDef  GPIO_InitStructure;
    4 u0 n) G% h" B' G+ g7 q. b

  11. / A' n1 K0 ^& y1 j& r* w- t1 z& @
  12.      /*!< Enable the SPI2 clock */        : Z9 @) \" [7 C- s8 J- `
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);' u( J. U' b4 Y* X
  14. 5 h1 }" v$ }$ ^
  15.     /*!< Enable GPIO clocks */; Y$ |8 k% _& z4 [' j) k, ]1 U
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    & ?. v% d4 I: K- y+ N4 N: x" p2 e
  17.     /*!< SPI2 pins configuration */2 _  B/ q) X/ {' ?5 f, {1 W
  18.     ; `- C/ e8 m: r  i
  19.      /* Configure SPI2 pins as alternate function (No need to
    * O" @( W# w7 m0 c  s8 Q. Q+ k
  20.      configure PB12 since NSS will be managed by software) */  1 _+ X' \. ^) M! z' G: f6 U
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
    4 _) Q& P2 I7 n8 T6 b
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck( E% @) u& Z) A. K4 b1 v" L
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso
    8 l* g  h; b2 \2 u/ L
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
    ; _& k5 B3 v( Q. K9 `6 a
  25.       a+ |$ F% G1 ~$ Y" Z  F, p) c  X4 O
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    ) F3 w1 n! i8 J4 T3 l6 M
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz/ j& w- e" k" u; _: M7 Y" Y
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  B, F" r' s# z8 z/ T" a3 q
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
    ; }% I0 ]( W2 D$ C4 @. F
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    ' \8 c, ?' L  M- f
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI8 F9 X& C1 x+ c8 f# E! H
  32.       / d: g! X6 ?& V2 Q; G2 z- a. E
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    # Q5 o  x3 R% ]/ L% y3 r
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;1 L; w& s/ W0 {
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    2 [+ y6 \2 [' c5 S0 l3 @5 v
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; ' B# o% h6 @3 I0 }4 R6 \- N1 a
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
    : ^9 v$ F. O: _0 G5 g
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    + M3 z+ N5 Y" a+ P& i
  39.   
    0 h/ H3 ?' L% w8 h! I
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
    9 a7 E/ z+ m2 x$ R1 m
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    . `) }% U% X2 V: G! H
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    # t, m& }; z% d; ]
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    4 `3 x0 j8 T# u5 N( I% _
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;6 x4 |7 }$ `3 I8 U. ]
  45.     /*!< SPI2 pin configuration */& ]) j+ V( t7 v* Q# Z* v' W/ |! `
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT: p8 y6 ~" |6 w; L4 \
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    $ D, n; e) T( c& i/ E+ f2 W4 ?
  48. ! q7 U* `/ k5 d1 [4 c1 D2 K& h3 J
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    $ k2 ^/ R( D( s+ @1 n0 L
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
    7 c4 C3 L$ t% |3 ?. [
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构! @6 |$ W9 K0 h6 {& }* A4 _
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
    ( |6 E7 g" c/ O) `. A
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿- k' e1 v( h1 B% Y; @
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备
    ! r( p$ F5 n" ^3 q5 ?
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2# W8 Q( r) |) d" L/ U
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
    , e; r0 O: f# N+ B4 J4 h
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;
    ) j6 w& E, a5 c6 N9 E) X4 _9 S
  58.     SPI_Init(SPI2, &SPI_InitStructure);
    * S* O- Z& q" t3 J+ _6 J/ e
  59.     SPI_Cmd(SPI2, ENABLE);4 i3 ^) }5 g/ o7 y. R" d4 i3 R

  60. " l, K/ B4 l8 M( ]
  61. }$ H' C" J3 E0 v# x/ U
  62. * _, q7 Z, m8 I
  63. /*******************************************************************************
    & V3 o6 ~+ r6 }* Z3 K
  64. * Function Name  : SPI_ReadWriteByte
    2 R6 b$ ^8 X* u' J! `1 _
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)7 i* G( ?, i) r, \+ N  ?& n
  66. * Input          : unsigned char TxData
    7 I1 p* @4 e: @+ _
  67. * Output         : None" a  A  @% P& V
  68. * Return         : unsigned char RxData( ^0 {- U& M3 k0 N
  69. *******************************************************************************// Z' F/ D6 G3 ?0 R/ [/ X  v
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData); l' ^% O4 \0 D, s# j
  71. {
    & L; @0 O6 n( s- J6 b  U# u
  72.     unsigned char RxData = 0;
    ' N+ D3 W( T  c# m& k
  73.     /* Wait till Transmit buffer is empty */
      L& J: h4 J4 P4 e$ J
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    : d& W( C+ D" F$ Y' B2 c' N  ?
  75.     /* Send A data */        * z" a/ C" U2 v# S. n
  76.     SPI_I2S_SendData(SPI2, TxData);5 e& s" \0 i6 V- j
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);7 m$ q# b, x' d% h# p# I) e: X5 g
  78.     //等待数据接收
    . w# a& o1 c2 v+ h
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);' n' z1 E8 b& ]' C
  80.     //取数据# \, v" k. V- N- P
  81.     RxData = SPI_I2S_ReceiveData(SPI2);
    + M: @5 O  K, K2 j
  82.     return (unsigned char)RxData;2 s/ G; m) n* F" b3 Q
  83. }
    . x4 N# _- X- ^. I$ T+ O3 K
  84.   Y# f8 @4 @1 m) d" p4 Y+ A+ O
  85.   [) b3 j2 N0 H0 m& M" `- g# b
复制代码

9 \3 E! n% y# a+ d* r; i0 }  }
5 ^* g8 i* v% B4 [3 I
收藏 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版