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

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

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。
4 y  k9 a$ n& M: O# F1.GPIO的配置与103系列的不同;  D/ B2 w; S. T3 Q$ }5 y8 s% y! A! n
2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;/ _; k0 u1 X+ b& d* L( p, W6 T3 o
其他特性请参考datasheet.
! e/ R& S  c) K. \2 K* o
  1. /*******************************************************************************
    , |) {7 v: J1 Q  w& v: s
  2. //STM32F207VGT6 FOR ENC28J60" ^6 t! y# _+ n+ z8 J
  3. //SPI2初始化/IO初始化等
    % S  s  S% N: [( {, g
  4. //SPI configuration
    . {( k) Q2 E* U
  5. @@ JUST FOR STM32F2XX
    . k9 f5 H1 U( L3 i
  6. *******************************************************************************/
    ; `$ k1 p; `- J0 a' }! n
  7. void ENC28J60_SPI2_Init(void)( R" [4 ?/ I( j, e( q5 t
  8. {
    * f- s3 Z0 m2 c) i. m* i; Q
  9.     SPI_InitTypeDef  SPI_InitStructure;: O& Z% ]; P5 E+ \. M4 F4 D
  10.     GPIO_InitTypeDef  GPIO_InitStructure;
    5 h/ \1 a2 r- B9 n- h
  11. 3 e3 i8 T) h5 V  v& i2 [$ u  H1 i. R# B
  12.      /*!< Enable the SPI2 clock */        6 `9 G6 b8 n; M, P. q
  13.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);" |/ |' P* A0 J' U
  14.   L2 O# o, j9 Y0 U/ v1 E& {
  15.     /*!< Enable GPIO clocks */
    + r; v5 l' R/ E* h+ Q5 X
  16.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);" I8 s5 u& ?! J1 ]  l. h; B
  17.     /*!< SPI2 pins configuration */  p8 f7 S% g1 p: U" K
  18.     2 f& ?' F+ A, G% l
  19.      /* Configure SPI2 pins as alternate function (No need to
    3 p& Q( W/ K- h) z: @) P
  20.      configure PB12 since NSS will be managed by software) */  
    3 ?) D9 H) N! M* A* K8 Y
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss 2 P4 o0 n8 X6 J) ^
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck4 i, @* R% v  h8 V
  23.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso$ ^& e" x2 H0 K- j7 W: M
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi1 ]# ]* R9 u: v! O
  25.     ; R3 m) Y- N  ?4 S% S* G2 S
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;0 E: T/ w" w9 q. S' ?
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz6 n' `* j' D3 s2 |
  28.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;1 P: [6 \- k, u! U+ v. j  p6 s  I
  29.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN+ p2 m9 B8 r/ U; w' l
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    + m! s5 m/ W) R2 i
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI( G# |5 G+ @& M$ J2 G
  32.       # J. s2 Y% W# o/ i) Z
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; " q( @# l# B- L7 ~; p' E
  34.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;5 U0 M% f' D- y% q  P( h
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;- P0 x; z7 p1 ^* q, V
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    4 H6 H$ x! @6 l
  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j605 |8 G+ D$ a& d4 F1 \
  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    # O8 h7 g  A% ]+ x2 }; x
  39.   
    $ V$ H1 p1 t3 Y: W
  40.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
    4 P' h7 O9 L# y( y* B; h5 F' `2 b
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    3 H9 q7 h. x5 W' u1 I+ v
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    . A+ \  ^( a$ r) @; R: O
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ; A" O3 n) f( F6 d& {& W- K
  44.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;8 \0 o, _! ]9 B# ?1 I6 ~
  45.     /*!< SPI2 pin configuration */4 ?6 o3 s$ f& e1 V# C" j
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT, N2 b, k: t, g2 M$ ~
  47.     GPIO_Init(GPIOB, &GPIO_InitStructure);& s2 v8 c: o1 a( @: o8 a

  48. ( f" C+ R% d% I2 `( s7 Z
  49.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
    6 F+ |$ O3 z, T  Z
  50.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI* v1 l/ a+ A' K
  51.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构9 r6 T; W* n6 o
  52.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高) M- A- ]% X( n" _* V4 @; f9 @9 m
  53.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
    % u+ @) E" @% d2 j6 `- _3 _
  54.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备3 d8 ]. i, o/ B; A4 m  }' x9 C# V
  55.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
    ) T: s- N+ i% P5 K1 j6 N
  56.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
    # s% H/ V+ j  d. B: N# z
  57.     SPI_InitStructure.SPI_CRCPolynomial=7;8 ]  ?- O& C9 Q
  58.     SPI_Init(SPI2, &SPI_InitStructure);8 f7 v1 o& p# S* F) |1 L
  59.     SPI_Cmd(SPI2, ENABLE);
    ; Y% n/ S  z: m+ F

  60. . C8 n' Q3 ~( h$ l4 `1 |
  61. }
    + W  m; A! y9 U6 q2 W6 l: I8 `+ q
  62. , y0 h0 L" E' @9 T8 d; o: Q
  63. /*******************************************************************************
    ' e1 x0 h: p# }# G8 n
  64. * Function Name  : SPI_ReadWriteByte. O1 `* x: A2 p: `. `
  65. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
    , S& M- C5 T7 I# W+ N& b9 y) z
  66. * Input          : unsigned char TxData
    ; U! b3 h- [, m" [# y& M
  67. * Output         : None
    4 d& U' c5 g8 ]. t7 X' H
  68. * Return         : unsigned char RxData) N( O; @) X# a( N; e9 m
  69. *******************************************************************************/
    ) r% W- H5 v4 ]
  70. unsigned char SPI2_ReadWriteByte(unsigned char TxData)1 O; n( J0 d+ t2 x( M" A3 z
  71. {
    2 x7 F! \1 y# [7 Z  J
  72.     unsigned char RxData = 0;8 C; C8 Z/ U. u4 y: t' ?
  73.     /* Wait till Transmit buffer is empty */ 7 v: \1 w9 W6 m: t5 X
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    " @5 ]- x# d' i/ x" S0 F& r' l. Z
  75.     /* Send A data */       
    9 m/ o* }. g7 U, x6 b$ q
  76.     SPI_I2S_SendData(SPI2, TxData);
    + ?+ V8 x3 A7 A- I+ B: B2 Q% d( {- q2 H
  77.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);! k3 Q. N3 S2 }- {/ `& s" Y
  78.     //等待数据接收
    ( g. t8 f. A; c; o
  79.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);+ h* r  v* k2 I! O" M6 n# q
  80.     //取数据) Q2 U0 A& z$ X: W2 G1 c
  81.     RxData = SPI_I2S_ReceiveData(SPI2);
    6 g# d- P! K  l7 p/ H
  82.     return (unsigned char)RxData;
    3 }3 j; h7 k5 @$ B: l' Z
  83. }) j; c& ^. W1 H* q/ K0 k* N2 S

  84. 2 m/ W3 A8 U. A$ a1 l8 S

  85. * z0 q. l2 `( T1 U
复制代码
  k7 @  P7 q) g" n: J  g1 M

  `. l8 s0 A: ~9 c# n& x: G4 a$ M
赞 收藏 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版