特别注意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+ ?- /*******************************************************************************
9 m, D! _9 p: @4 a+ G3 x - //STM32F207VGT6 FOR ENC28J60
8 d9 R, C: \' c( E. g - //SPI2初始化/IO初始化等
. `0 S5 L: J5 l5 H/ a0 p, ^& w7 q - //SPI configuration2 `) \. @* x! c" i: q$ w5 G
- @@ JUST FOR STM32F2XX% ~+ @: e+ Q2 W8 F
- *******************************************************************************/
; ^7 `' t' d( ?7 Y1 } - void ENC28J60_SPI2_Init(void)
' S- N1 M% p" ~/ f - {( p/ o% D; H+ O- O# }
- SPI_InitTypeDef SPI_InitStructure;
8 h: J. e" U f - GPIO_InitTypeDef GPIO_InitStructure;
, f# b/ `$ y# I* m" k8 T - * r& q9 X/ n) c/ N. F: x& n
- /*!< Enable the SPI2 clock */
$ ^- @1 d, l6 R# a - RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);1 x& C6 u( I/ M- h
- 5 r7 h/ w: R$ l9 v+ }. E
- /*!< Enable GPIO clocks */" v- t4 Z3 v) m4 T N2 u
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);- N5 N; ~& ]: u; ^
- /*!< SPI2 pins configuration */ \ b3 Z( ?" f$ X; ?- z3 [& |
-
) |* Q& b$ z0 }. c) m4 d. F. ~* x( n - /* Configure SPI2 pins as alternate function (No need to 2 w6 v6 b' s! H; d j6 c2 b
- configure PB12 since NSS will be managed by software) */ 0 F: t9 L4 c" g( K
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
+ ^1 ]2 t+ j' Q4 N - GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
; F z1 e$ ^ [3 x - GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso& s3 Q9 j1 ]% Y! i
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
) }: |: I% q5 z) }$ p - 8 _! Q7 U) `0 _0 h3 z3 d
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
2 }* }9 w C( P- B* z) w r - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz: {5 D8 M- l2 ^) C' o. Z' B4 y% Y5 P
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;2 i% M! e8 ^4 v$ k3 L. ^
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_PuPd_DOWN9 \" E i; M! z: \# r& s
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;9 s. U4 U3 @4 w, e
- GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI. v$ }. F+ V# S k& X& a. E
-
( H" t. e! O" J4 c. q - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+ }, v+ z1 {, X$ u - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
& z4 }( A0 ?. Q1 v& m) b - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+ c7 c4 b1 \0 H& L - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; " G! c3 @$ w' f! v+ o3 j$ o
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60% B3 K h' j$ P
- GPIO_Init(GPIOB, &GPIO_InitStructure);
" Y8 n! T: {; `+ s -
! t4 B6 b. X9 E7 _: T# m - /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
' t7 ?, t0 ?. V: G8 L& S& } - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;" J$ X5 L3 k# U
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" w( _$ D5 Q- q* F* `
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;8 f- h/ A) e8 I! |: q0 ?
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;9 A: \! M4 A* D: T5 d8 m) k! x
- /*!< SPI2 pin configuration */' p5 W; C$ B: i$ P- z. ~
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT- b& M7 h4 h) Y
- GPIO_Init(GPIOB, &GPIO_InitStructure);1 ~' H# `( g9 z/ l& c, ^* @5 v* y1 j0 p
2 B) W z* b% q8 \+ N- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工# F$ S; W7 s0 }9 N( n; A% U
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI1 d4 i3 l* p4 x7 `8 A) c0 u
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构! @- T1 g, ]( _ S$ y. g. W
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高* E6 m, i' M9 i. u) j( o4 F1 N
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿& R6 S: c, R- }4 N% O% S0 M
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备6 X0 M0 C) M0 j( K
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2& ?' |) A1 M: J6 T
- 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 - SPI_InitStructure.SPI_CRCPolynomial=7;* h! y5 w5 W/ Q4 h5 S
- SPI_Init(SPI2, &SPI_InitStructure);6 o5 s3 r0 }- W8 i3 {& e
- SPI_Cmd(SPI2, ENABLE);4 B, P/ s8 J9 i N2 Q7 k$ y- {
-
6 `9 M" n8 ]: X7 N. ]$ V - }$ x0 V0 l; }8 W; [' F
1 @3 z% f. c4 f( P/ N) q, }- /*******************************************************************************
- V( \, o9 u1 d4 Z4 Y - * Function Name : SPI_ReadWriteByte
- a/ O! ^; R% S1 l2 k - * Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
7 P0 v- V s! K7 p - * Input : unsigned char TxData
* F& P Z9 D) T( h! }; E% D - * Output : None9 c( J- C- R- s9 [& V
- * Return : unsigned char RxData
/ t7 t+ B/ j; o2 j - *******************************************************************************/% J& i0 @0 U8 E8 I0 j x6 G" y- _
- unsigned char SPI2_ReadWriteByte(unsigned char TxData)
: E r( n9 F c1 D7 b& P - {! U# E* H6 \' C1 Y; h2 d% w r
- unsigned char RxData = 0;
z3 k+ ~) [- V" Q8 a/ I - /* Wait till Transmit buffer is empty */
4 q1 L/ z7 V) ?4 M$ `, \# n% z: \ - while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
& I+ n& D6 l7 ^' g0 j4 f$ ^ x6 \ - /* Send A data */
1 v1 j& P3 z+ R4 {0 s0 X, A; ^6 ? - SPI_I2S_SendData(SPI2, TxData);
, }# S5 z6 q: z, ^7 E5 P5 l! p1 h. w - // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);$ P1 q) B" b% v
- //等待数据接收' F1 z3 g1 ^ f; R1 F
- while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);9 v* L8 |0 E) z7 j. I6 A b
- //取数据
( B! w( e. u& R9 r' x - RxData = SPI_I2S_ReceiveData(SPI2);
' p4 Q9 A9 z/ X5 Q6 I - return (unsigned char)RxData;
0 A# \1 k4 I4 N+ E" y$ r - }! h( x+ P& U H$ P/ G
- 0 h4 u$ U5 q+ I
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
|