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

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

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。3 t6 x/ d& ?3 ]. x% q: G$ _. _
1.GPIO的配置与103系列的不同;+ p8 `+ W9 R' y8 {
2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;; T" X* Y: p4 v- i
其他特性请参考datasheet.
8 _4 U+ n( C4 M. K' {/ q* M% m5 j
  1. /*******************************************************************************
    ) q* O3 Z3 H: z) O* _
  2. //STM32F207VGT6 FOR ENC28J60
    4 ]( R; S- I4 M7 c
  3. //SPI2初始化/IO初始化等
    8 p* [% E+ [0 ~' Z
  4. //SPI configuration# P- G0 a, o# \
  5. @@ JUST FOR STM32F2XX
    # I* h0 N: b4 j' W, B* m5 f
  6. *******************************************************************************/
    / L  b4 D% |. s- o2 g9 z- W
  7. void ENC28J60_SPI2_Init(void). P) A, l9 M+ S1 f8 q; C
  8. {5 U) e. b: }% |8 m9 s& W
  9.     SPI_InitTypeDef  SPI_InitStructure;8 X8 L% N! h0 Z8 I  X- m) F" w. O
  10.     GPIO_InitTypeDef  GPIO_InitStructure;; c0 s9 ~! u; ~1 a

  11. " a7 {6 D+ Z, ?, \
  12.      /*!< Enable the SPI2 clock */       
    4 F( t5 ]: m/ u; K
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    , M8 ~4 |% F2 a7 d7 m+ q4 G+ Z

  14. 6 S7 _8 ?" p- w+ q  S, L+ G1 v; \/ B
  15.     /*!< Enable GPIO clocks */
    " G  C0 j9 E) c& W. m
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);1 I: P3 @5 x' Y  I7 S6 H6 Z
  17.     /*!< SPI2 pins configuration */" G# [, S6 T; C8 [& ^8 S4 H
  18.    
    4 }( e* \/ b- l5 i) `, y0 `
  19.      /* Configure SPI2 pins as alternate function (No need to ! |. C" N: q/ |8 a
  20.      configure PB12 since NSS will be managed by software) */  
    ) L" C# l# e6 V9 x& J/ l
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
    1 S0 l+ r7 Q2 G  I4 i' h* [
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
    & v1 N0 U, V% L$ P9 ], r/ B6 K7 y
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso
    # S7 k3 p! Q" z
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
    8 X* R: [. |% e* D$ U8 z
  25.    
    ! q3 e1 W# G8 A+ M' ^: V
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    6 z0 ~8 |. Y- k9 Z1 {" _
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz
    ( s" W% H6 P! {8 z* A6 P
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;$ D4 Q2 y5 G: t% p
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
    2 A; o$ r9 c* Q8 m  ~$ S" T
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;) N6 Q# l' p$ e9 m/ e" ~: ~' O" f
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
    , Q2 e" F/ k" x  o0 k
  32.       , d$ R6 o) H) b6 G5 ~: V4 s& `2 a2 y
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; & O. l& \0 a0 b8 ^( P2 D
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    / B/ f. a8 W: B! G& z" e
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    * ~, P: s* @6 x% V
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
      q! T+ N, ~3 X  F
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j601 a: F1 a5 i* b! N3 m
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    : o! S( H0 P  y4 j3 F
  39.   
    . d3 S* |9 ?( U3 p
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
    9 w/ y/ y' M. I+ z! t
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;+ G* V) J, k& k1 U( J% T
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    2 l1 K. H6 d8 K2 o! ~  Z5 U
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ( r7 o2 M4 V& B* i- }5 r6 |
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;" I1 V4 a/ O+ }( W- V- ], `6 h
  45.     /*!< SPI2 pin configuration *// K$ l" e& g' O0 q" p
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT4 J$ G+ e2 `: K( I+ ?2 e8 I& \2 X
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    ! r" j) p# n+ E2 K% l) p7 C

  48. + m5 b1 Z  z# w8 V
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    ) E( m& ]5 b% F! S. j$ Z
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
    * V3 w! M7 d% K( f
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构  _' q9 N+ n& B! w
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高5 o1 I" x; n& z! O
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
    8 |! }+ A1 ^3 v3 t6 X  b
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备9 |% M" Z5 q9 _- ^
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/25 A  n( L0 }% J3 z8 P7 x, F
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */9 }7 @0 L8 L3 r. Q& U: }6 w
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;7 y) }9 o& z0 c2 R! B: p4 G" g0 @
  58.     SPI_Init(SPI2, &SPI_InitStructure);0 C4 D5 T, K6 C8 H! g
  59.     SPI_Cmd(SPI2, ENABLE);9 L* g1 c$ y$ T$ |$ T+ I

  60. 2 I  i4 [0 Q# n$ u* f- E( J* f
  61. }6 F& o3 R9 S; [7 p0 X6 @/ W
  62. ; X" f1 \6 \: a8 f5 j
  63. /*******************************************************************************
    # e5 X! X- M! i. D% `% H* m/ o
  64. * Function Name  : SPI_ReadWriteByte- O0 K0 f- }5 U& C& S3 b# ]% \
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
    2 v3 @, S; h% Z1 D% A  i
  66. * Input          : unsigned char TxData
    & d7 @+ T: _; Y5 B2 ?3 Q7 a
  67. * Output         : None
    5 G( _% _5 @4 w
  68. * Return         : unsigned char RxData3 i' f' }: B3 G0 H9 Q" ^
  69. *******************************************************************************/
    & t% }  @% X! ?" P
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData): P# V+ }5 S/ h1 d0 g& Y3 j
  71. {2 T' V7 b: `; y$ h5 q; `
  72.     unsigned char RxData = 0;
    + M" U0 i( G( m/ U; ^2 X
  73.     /* Wait till Transmit buffer is empty */
    & {4 |( z3 z7 ^
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);( Z3 ~  O( ?3 E! Q2 U" ^$ M
  75.     /* Send A data */        9 i/ |% l4 S7 x5 ~5 v7 k1 S
  76.     SPI_I2S_SendData(SPI2, TxData);
    7 R% o1 T8 v4 M4 X# s* L& U: o2 h
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);4 E! z1 N' R8 I
  78.     //等待数据接收
    + V9 g0 ~4 l' O
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);0 m% x# r3 u7 A. N3 p
  80.     //取数据/ {% z: d5 o  L
  81.     RxData = SPI_I2S_ReceiveData(SPI2);
    - d  e+ J- ]5 u5 [6 p4 j0 t
  82.     return (unsigned char)RxData;! J- V; m1 `( M# E) X0 b
  83. }
    0 X2 V% |( _1 l3 p

  84. - O! f! y  q! z6 q$ ]8 g/ D- T
  85. + [: m1 W7 i- u# _
复制代码

3 Y8 K0 P/ S7 s2 s' y4 }8 j  k2 c: S; O% g! ]
收藏 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 手机版