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

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

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。
! S& ~- H8 ~5 c, |9 N3 c5 L, L1.GPIO的配置与103系列的不同;  F; {6 K2 d7 a, _2 O, [4 m% R* o7 _
2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;8 W1 W. C. s0 _0 B
其他特性请参考datasheet.
9 R1 S) P7 s+ b7 b. v+ ?
  1. /*******************************************************************************
    9 m, D! _9 p: @4 a+ G3 x
  2. //STM32F207VGT6 FOR ENC28J60
    8 d9 R, C: \' c( E. g
  3. //SPI2初始化/IO初始化等
    . `0 S5 L: J5 l5 H/ a0 p, ^& w7 q
  4. //SPI configuration2 `) \. @* x! c" i: q$ w5 G
  5. @@ JUST FOR STM32F2XX% ~+ @: e+ Q2 W8 F
  6. *******************************************************************************/
    ; ^7 `' t' d( ?7 Y1 }
  7. void ENC28J60_SPI2_Init(void)
    ' S- N1 M% p" ~/ f
  8. {( p/ o% D; H+ O- O# }
  9.     SPI_InitTypeDef  SPI_InitStructure;
    8 h: J. e" U  f
  10.     GPIO_InitTypeDef  GPIO_InitStructure;
    , f# b/ `$ y# I* m" k8 T
  11. * r& q9 X/ n) c/ N. F: x& n
  12.      /*!< Enable the SPI2 clock */       
    $ ^- @1 d, l6 R# a
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);1 x& C6 u( I/ M- h
  14. 5 r7 h/ w: R$ l9 v+ }. E
  15.     /*!< Enable GPIO clocks */" v- t4 Z3 v) m4 T  N2 u
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);- N5 N; ~& ]: u; ^
  17.     /*!< SPI2 pins configuration */  \  b3 Z( ?" f$ X; ?- z3 [& |
  18.    
    ) |* Q& b$ z0 }. c) m4 d. F. ~* x( n
  19.      /* Configure SPI2 pins as alternate function (No need to 2 w6 v6 b' s! H; d  j6 c2 b
  20.      configure PB12 since NSS will be managed by software) */  0 F: t9 L4 c" g( K
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
    + ^1 ]2 t+ j' Q4 N
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
    ; F  z1 e$ ^  [3 x
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso& s3 Q9 j1 ]% Y! i
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
    ) }: |: I% q5 z) }$ p
  25.     8 _! Q7 U) `0 _0 h3 z3 d
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    2 }* }9 w  C( P- B* z) w  r
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz: {5 D8 M- l2 ^) C' o. Z' B4 y% Y5 P
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;2 i% M! e8 ^4 v$ k3 L. ^
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN9 \" E  i; M! z: \# r& s
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;9 s. U4 U3 @4 w, e
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI. v$ }. F+ V# S  k& X& a. E
  32.       
    ( H" t. e! O" J4 c. q
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    + }, v+ z1 {, X$ u
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    & z4 }( A0 ?. Q1 v& m) b
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    + c7 c4 b1 \0 H& L
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; " G! c3 @$ w' f! v+ o3 j$ o
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60% B3 K  h' j$ P
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    " Y8 n! T: {; `+ s
  39.   
    ! t4 B6 b. X9 E7 _: T# m
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
    ' t7 ?, t0 ?. V: G8 L& S& }
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;" J$ X5 L3 k# U
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" w( _$ D5 Q- q* F* `
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;8 f- h/ A) e8 I! |: q0 ?
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;9 A: \! M4 A* D: T5 d8 m) k! x
  45.     /*!< SPI2 pin configuration */' p5 W; C$ B: i$ P- z. ~
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT- b& M7 h4 h) Y
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);1 ~' H# `( g9 z/ l& c, ^* @5 v* y1 j0 p

  48. 2 B) W  z* b% q8 \+ N
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工# F$ S; W7 s0 }9 N( n; A% U
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI1 d4 i3 l* p4 x7 `8 A) c0 u
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构! @- T1 g, ]( _  S$ y. g. W
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高* E6 m, i' M9 i. u) j( o4 F1 N
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿& R6 S: c, R- }4 N% O% S0 M
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备6 X0 M0 C) M0 j( K
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2& ?' |) A1 M: J6 T
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
    5 Z0 o& z9 b- T- {9 o1 l" a# V" ^8 m
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;* h! y5 w5 W/ Q4 h5 S
  58.     SPI_Init(SPI2, &SPI_InitStructure);6 o5 s3 r0 }- W8 i3 {& e
  59.     SPI_Cmd(SPI2, ENABLE);4 B, P/ s8 J9 i  N2 Q7 k$ y- {

  60. 6 `9 M" n8 ]: X7 N. ]$ V
  61. }$ x0 V0 l; }8 W; [' F

  62. 1 @3 z% f. c4 f( P/ N) q, }
  63. /*******************************************************************************
    - V( \, o9 u1 d4 Z4 Y
  64. * Function Name  : SPI_ReadWriteByte
    - a/ O! ^; R% S1 l2 k
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
    7 P0 v- V  s! K7 p
  66. * Input          : unsigned char TxData
    * F& P  Z9 D) T( h! }; E% D
  67. * Output         : None9 c( J- C- R- s9 [& V
  68. * Return         : unsigned char RxData
    / t7 t+ B/ j; o2 j
  69. *******************************************************************************/% J& i0 @0 U8 E8 I0 j  x6 G" y- _
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData)
    : E  r( n9 F  c1 D7 b& P
  71. {! U# E* H6 \' C1 Y; h2 d% w  r
  72.     unsigned char RxData = 0;
      z3 k+ ~) [- V" Q8 a/ I
  73.     /* Wait till Transmit buffer is empty */
    4 q1 L/ z7 V) ?4 M$ `, \# n% z: \
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    & I+ n& D6 l7 ^' g0 j4 f$ ^  x6 \
  75.     /* Send A data */       
    1 v1 j& P3 z+ R4 {0 s0 X, A; ^6 ?
  76.     SPI_I2S_SendData(SPI2, TxData);
    , }# S5 z6 q: z, ^7 E5 P5 l! p1 h. w
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);$ P1 q) B" b% v
  78.     //等待数据接收' F1 z3 g1 ^  f; R1 F
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);9 v* L8 |0 E) z7 j. I6 A  b
  80.     //取数据
    ( B! w( e. u& R9 r' x
  81.     RxData = SPI_I2S_ReceiveData(SPI2);
    ' p4 Q9 A9 z/ X5 Q6 I
  82.     return (unsigned char)RxData;
    0 A# \1 k4 I4 N+ E" y$ r
  83. }! h( x+ P& U  H$ P/ G
  84. 0 h4 u$ U5 q+ I

  85. 6 V8 K  {- T; I: N" T  v9 r
复制代码
4 Q) j3 M4 l, F
1 U5 m% `6 v- ~6 f+ F. O) z
收藏 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 手机版