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

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

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。
- z$ v" S7 k6 G1.GPIO的配置与103系列的不同;7 p3 W+ {0 t. i5 d6 S5 ?
2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;, F7 W# }) }4 |, \) s$ f
其他特性请参考datasheet.3 ~; K- P2 f- B3 h) _: M1 A  H, W
  1. /*******************************************************************************
    9 g7 p5 k" m4 u
  2. //STM32F207VGT6 FOR ENC28J60
    8 X$ H  N0 p6 e- z) C: J5 M# J  Y2 f
  3. //SPI2初始化/IO初始化等3 G  F" c1 z, d
  4. //SPI configuration
    8 l8 ?$ D/ ^. z- o; D) p. L
  5. @@ JUST FOR STM32F2XX9 \6 g: f( [! z9 L0 a
  6. *******************************************************************************/
    / v* ^; n7 F% t; [& p# h
  7. void ENC28J60_SPI2_Init(void)
    * P& R1 a8 o9 b. W$ I, d. t
  8. {
    1 |+ U# e3 l; B9 `- u3 q! J* v% V
  9.     SPI_InitTypeDef  SPI_InitStructure;
    1 i. s: K4 _# u- [) B( P; p) J
  10.     GPIO_InitTypeDef  GPIO_InitStructure;
    : n0 `/ ~  Y5 U6 H1 @
  11. 9 \1 {$ p% \! N( l! l5 W
  12.      /*!< Enable the SPI2 clock */       
    7 B* O. C+ d* a& c+ r, S. ^9 k: E
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    , S3 s. H% d# ?: s
  14. / B' [- R! }1 s
  15.     /*!< Enable GPIO clocks */
    $ B6 d, m: e& @# z; I
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    - ^4 _6 @4 L8 O6 r
  17.     /*!< SPI2 pins configuration */
    : G! F/ k$ a. O; P
  18.     + o* j- R- s7 D& N
  19.      /* Configure SPI2 pins as alternate function (No need to " h9 y7 o0 \+ a. {
  20.      configure PB12 since NSS will be managed by software) */  7 K; j8 L2 c  p2 b# ^1 P
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss   d2 v% k: p  o6 E! o. w
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
    % }& ?. Z6 E9 o( E1 i
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso! [/ ^, Z" K- Y- [2 y+ G' ~
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
    5 C) \8 \0 w' G
  25.    
    7 O3 n* \' Y3 r1 S9 J/ S6 l7 N
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;' o  v! ^7 U) x) C6 q
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz
    6 L6 k, A, {  @6 [, a3 b
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/ s6 ]3 I, `* s0 V  _
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
    : u7 t: ]7 Y! Y
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;! w, ~1 {2 a; h
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
    : z, n' i1 ?/ t
  32.       
    - I9 w& J" ]% F6 I. A
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 4 y5 t0 M: k8 g4 i2 `( `
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ! Y- c1 i3 r4 x+ z
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    ) x% D) P; m4 r* I* v) G3 {' X
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    - a+ n+ t; A2 J
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
    ( d' r- U* A8 h* @0 t8 c( }
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);. g4 }& l& g9 e, Q4 i
  39.   
    5 o) k. u( \8 F  B
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/% ?0 I7 n# j, ^. A1 |2 P- Q& K
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;3 o" g, i9 ^; t' q) I) T
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    8 v4 o0 W) ?+ d8 N
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;: `0 A0 U0 u! e+ a- X
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    - D% ~; U" U  h& N- ~
  45.     /*!< SPI2 pin configuration */2 p) i" C) p* n9 u) V+ x
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT' |$ D/ P! M" J4 r# j
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);
      s; s7 S; ~9 P5 j( s( [
  48. % y0 G5 f; _3 P! b
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工( }' D" G* O! J) c
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
    8 t: B+ [6 L4 }  G
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
    4 H/ j' F5 Q! s7 d. U4 l+ u
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
    ) ~6 h' h& ~' D3 Z  U
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
    1 C; m( R" N! X& H# j
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备1 J" ^2 s9 a8 y% d4 y8 h5 @! U
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
    9 o: x# v9 e' o- I* v0 u6 [
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
      Q6 ]" ~" G. _! C
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;
    4 u# P3 A( M' S+ H* b% E3 S8 I, a
  58.     SPI_Init(SPI2, &SPI_InitStructure);
    + O4 e1 O- m1 ~* a  u8 g+ a) f8 H
  59.     SPI_Cmd(SPI2, ENABLE);
    . ?* _8 @6 I0 a* u
  60. # o/ H! m8 P4 Y% Z, h+ S% Q* ?
  61. }
    5 z# j6 H7 R* K

  62. - L3 m0 q" \- Z7 i  p: G
  63. /*******************************************************************************
    9 i$ V; d2 L  V9 l  I  }+ S
  64. * Function Name  : SPI_ReadWriteByte
    ( k, h) Y4 u+ L$ D+ o
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)# g9 `' F- e. G, W$ M+ y7 X, f2 N
  66. * Input          : unsigned char TxData
    4 ?5 \, ?' E! n" |& [) H
  67. * Output         : None
    9 w0 l& s. N. O/ t2 S. v
  68. * Return         : unsigned char RxData
    " g8 L- q* k. d- S- [! R
  69. *******************************************************************************/$ m+ V1 J  A3 W' T% p7 S' A' t
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData)
    / ~; E1 W% x) W# U
  71. {* [- g1 C$ N% M' ]2 h) {/ _) o
  72.     unsigned char RxData = 0;
    3 A3 J6 _' ]1 Q4 G' F
  73.     /* Wait till Transmit buffer is empty */
    8 }6 _  ]9 b( y1 j$ j' {: t
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);* K9 O% i% l1 ?
  75.     /* Send A data */        + S+ E( J  A- U9 K; O
  76.     SPI_I2S_SendData(SPI2, TxData);
    8 g0 u6 M$ W4 d1 i7 Y
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
    8 H# `; O# S+ {( ^5 M8 I' P
  78.     //等待数据接收$ E$ l5 g( v. N7 }5 |  u
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    ' `7 Y( d1 ?+ `# ]) ?4 [
  80.     //取数据
    # p* m0 _, N  L8 e
  81.     RxData = SPI_I2S_ReceiveData(SPI2);4 X/ H0 G+ T- t  k. Z' ]
  82.     return (unsigned char)RxData;' ?& j6 c+ [% |! \, m. t) g( ]4 ?
  83. }
    8 U- m6 d* Q) Z6 x& g

  84. + S) j) y, r1 y! E" @

  85. 8 b, K5 h- c) N! m6 K+ A
复制代码
" z9 C+ U$ M" M# Z

! D8 L1 J* q, P% a. B: }4 U
收藏 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版