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

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

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。
& ^  s9 j$ ~  [- y& K2 U4 a1.GPIO的配置与103系列的不同;
/ X$ D5 Q' t; i3 A# H* j2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;
* o7 @/ w+ b6 s# e; P& F* y其他特性请参考datasheet.. q- S& g7 b, {9 Q* B8 H
  1. /*******************************************************************************
      z7 ?* f8 ?9 c. _! S$ s% W9 [
  2. //STM32F207VGT6 FOR ENC28J60
    - E4 E8 h' d7 A1 @2 |- Q
  3. //SPI2初始化/IO初始化等
    9 `# F% @& @; ~3 H" N8 N# z5 a1 Y
  4. //SPI configuration
    / D' e% Z- _* P: V( s, }6 `
  5. @@ JUST FOR STM32F2XX* {- P$ k: @# h
  6. *******************************************************************************/
    ! Y1 a7 n! e7 {' V8 p0 y7 S
  7. void ENC28J60_SPI2_Init(void)
    ( c! H  S; |" X% J) |" ~+ s: y3 a
  8. {* B3 R$ P( U6 n
  9.     SPI_InitTypeDef  SPI_InitStructure;
    / J. u. K  z: r+ h7 r, p
  10.     GPIO_InitTypeDef  GPIO_InitStructure;
    9 `) \+ j: I: {7 x

  11. 0 n1 V  l, T7 u4 {/ `
  12.      /*!< Enable the SPI2 clock */       
    ! \' v( V7 h/ r7 b3 W/ O3 e
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);6 ?& |  @) d1 m: g8 f% A

  14. : T0 d: K6 I( ?( `
  15.     /*!< Enable GPIO clocks */" |/ }2 S. K: W
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    ; [" K+ V4 |, U& N' j# i5 t
  17.     /*!< SPI2 pins configuration *// M- O. d4 `3 [- H; q# o
  18.    
    1 N! {2 k8 v3 X5 f& V$ [2 t
  19.      /* Configure SPI2 pins as alternate function (No need to
    / M  W* z+ A) L8 C! H6 u) M. I4 D
  20.      configure PB12 since NSS will be managed by software) */  
    9 s: A& G+ T3 b' |) X
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss   w4 d: w6 K1 |6 B4 L, P
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck1 C+ l: H* D* @& [7 o
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso7 c1 n8 ^! b/ c
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi; v# V: H: b/ E
  25.    
    8 D- ^9 k  I( Q6 M1 T) G# L
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;' q; j+ }8 x& k) m2 g
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz9 A2 s0 `3 V8 a* |# I' i
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;" E) \7 @8 s3 x& c$ p% z8 P
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN9 ^3 e  S' b6 H4 v* j) a  o& ~
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    , @+ s; g5 N# {7 n" i7 Z
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
    ! T2 H$ n% [- e; K1 o# b- l" o1 A
  32.       
    5 \/ }% ?" p& Y( h1 _* W! i
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 5 T0 h2 X/ D( h; W" e2 d
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;- V% f) u, I4 Z4 `5 k( M
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    / T+ @2 [# m% b  {* B
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    ' c7 }: x7 }) j% v1 g$ ~/ U9 o" Z
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
    8 ]( T% J2 F8 Q% Y1 ?5 r7 u
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    ' w) Y0 e- L2 q9 u. ?
  39.   
    6 f  X  {0 O5 T( J: i
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/9 B. R3 I* I. X: E
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;7 D6 T$ \3 g) o0 z/ F$ M8 _
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    + [6 y% T1 Z2 f5 z4 _
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;" ?3 q- B% ^6 p' E, L  n- ^2 @
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    - H- a7 y& l! R, r
  45.     /*!< SPI2 pin configuration */, D. I/ ?. I: `4 ~# q
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT. ^  r& B+ x: b
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);- \6 V) ?3 w( j# Z
  48. & G, j2 I' r; i& z5 [
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工: Q( x, y/ M+ Q& O% v2 Z
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
    6 G. f. R5 _) ~
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
    ( l; A# A6 q0 n( w; ~7 D
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高: j/ c% O* i: {/ ?- r: o' Z/ B
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿! g# j+ q& S, s" C& j
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备
    ! Y9 Z/ E5 A# ]+ H9 \5 }9 a
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
    : @% [$ Y$ U) C4 L7 [' V: H
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */5 v' f: ^/ i$ i1 m1 B: F
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;: L' N+ }& T- G+ e9 ^* ]. f" }
  58.     SPI_Init(SPI2, &SPI_InitStructure);
    ) ]" U( d& k( i) v
  59.     SPI_Cmd(SPI2, ENABLE);1 Z5 A5 D% o* O" |# [

  60. 4 A6 @. U7 `% i% c! D
  61. }
    & v$ |  ]7 r8 X7 g% i; r  T% P8 v

  62. ( T0 U. C# D, t) g9 E
  63. /*******************************************************************************, `0 O1 T6 ~. n; H
  64. * Function Name  : SPI_ReadWriteByte9 ~. S- W* F& l; f) T; {
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
    + X* o! u6 I- a7 w) G
  66. * Input          : unsigned char TxData
    + c, p7 Y: v) r6 j2 y
  67. * Output         : None& g2 f- n9 D. x' t1 Z0 b& B
  68. * Return         : unsigned char RxData
    # e7 h' d; P+ E6 e; k
  69. *******************************************************************************/4 e3 ?- F8 O6 m0 n+ B
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData)" V- M3 S  B7 h- P7 ~% o
  71. {4 |/ x& p3 _4 j2 w; A4 ?
  72.     unsigned char RxData = 0;
    7 ^- {, Y7 ]8 X4 L3 y8 O
  73.     /* Wait till Transmit buffer is empty */ + I) y, n% {) P2 q  O7 l
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);( X/ J. P% ~" a$ I
  75.     /* Send A data */        * B3 o+ L! I: H8 K# ^( L
  76.     SPI_I2S_SendData(SPI2, TxData);* c6 s/ F8 J: m( C
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);4 ?+ F( q" c+ O) d
  78.     //等待数据接收( D! v' z& d, x! ~$ M8 u0 N. E- }
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    8 L6 p3 S/ E% E5 m
  80.     //取数据
    3 F) v5 e6 Z4 U/ U7 D9 h
  81.     RxData = SPI_I2S_ReceiveData(SPI2);
    - H" S0 \# z; _7 Q9 x1 |
  82.     return (unsigned char)RxData;0 q; u4 O% x+ _$ o% Y
  83. }: b; u. u: M. L6 |
  84. ; L8 y( ], j  v$ Z) l0 \2 B
  85. . b# u& U: }* Q4 T$ H0 A
复制代码

* m) {; [8 I( A* }2 y9 V( y
, \: @5 C% I' h6 f
收藏 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 手机版