特别注意NSS引脚的配置,见代码。
H0 N: _2 H1 _2 |* C" \* U1.GPIO的配置与103系列的不同;
: ~# J2 F* Y: m5 u" f( l/ \2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;6 [( T2 X; O$ T& \. F/ _5 _
其他特性请参考datasheet.: [5 O6 J) S& g4 W
- /*******************************************************************************, Z. F, x) G4 z' z# w
- //STM32F207VGT6 FOR ENC28J60# \+ O) J z( D: J4 H1 `/ w5 M, E
- //SPI2初始化/IO初始化等
7 V) S8 i3 B4 ~0 E- t - //SPI configuration
0 k+ @9 ~2 O& B+ _& D! y, B) x - @@ JUST FOR STM32F2XX& K6 @' R6 u) v1 B" b* D
- *******************************************************************************/- W% w0 m. v" S5 F. I6 n9 k
- void ENC28J60_SPI2_Init(void)
; g x: ?# o/ c! l - {0 M: ~7 v( t( |% L {. q
- SPI_InitTypeDef SPI_InitStructure;
% j; X: S$ m8 T, A/ d8 n' G- t - GPIO_InitTypeDef GPIO_InitStructure;
4 u0 n) G% h" B' G+ g7 q. b
/ A' n1 K0 ^& y1 j& r* w- t1 z& @- /*!< Enable the SPI2 clock */ : Z9 @) \" [7 C- s8 J- `
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);' u( J. U' b4 Y* X
- 5 h1 }" v$ }$ ^
- /*!< Enable GPIO clocks */; Y$ |8 k% _& z4 [' j) k, ]1 U
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
& ?. v% d4 I: K- y+ N4 N: x" p2 e - /*!< SPI2 pins configuration */2 _ B/ q) X/ {' ?5 f, {1 W
- ; `- C/ e8 m: r i
- /* Configure SPI2 pins as alternate function (No need to
* O" @( W# w7 m0 c s8 Q. Q+ k - configure PB12 since NSS will be managed by software) */ 1 _+ X' \. ^) M! z' G: f6 U
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
4 _) Q& P2 I7 n8 T6 b - GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck( E% @) u& Z) A. K4 b1 v" L
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso
8 l* g h; b2 \2 u/ L - GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
; _& k5 B3 v( Q. K9 `6 a - a+ |$ F% G1 ~$ Y" Z F, p) c X4 O
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
) F3 w1 n! i8 J4 T3 l6 M - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz/ j& w- e" k" u; _: M7 Y" Y
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; B, F" r' s# z8 z/ T" a3 q
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
; }% I0 ]( W2 D$ C4 @. F - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
' \8 c, ?' L M- f - GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI8 F9 X& C1 x+ c8 f# E! H
- / d: g! X6 ?& V2 Q; G2 z- a. E
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
# Q5 o x3 R% ]/ L% y3 r - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;1 L; w& s/ W0 {
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
2 [+ y6 \2 [' c5 S0 l3 @5 v - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; ' B# o% h6 @3 I0 }4 R6 \- N1 a
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
: ^9 v$ F. O: _0 G5 g - GPIO_Init(GPIOB, &GPIO_InitStructure);
+ M3 z+ N5 Y" a+ P& i -
0 h/ H3 ?' L% w8 h! I - /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
9 a7 E/ z+ m2 x$ R1 m - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
. `) }% U% X2 V: G! H - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
# t, m& }; z% d; ] - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
4 `3 x0 j8 T# u5 N( I% _ - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;6 x4 |7 }$ `3 I8 U. ]
- /*!< SPI2 pin configuration */& ]) j+ V( t7 v* Q# Z* v' W/ |! `
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT: p8 y6 ~" |6 w; L4 \
- GPIO_Init(GPIOB, &GPIO_InitStructure);
$ D, n; e) T( c& i/ E+ f2 W4 ? - ! q7 U* `/ k5 d1 [4 c1 D2 K& h3 J
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
$ k2 ^/ R( D( s+ @1 n0 L - SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
7 c4 C3 L$ t% |3 ?. [ - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构! @6 |$ W9 K0 h6 {& }* A4 _
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
( |6 E7 g" c/ O) `. A - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿- k' e1 v( h1 B% Y; @
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备
! r( p$ F5 n" ^3 q5 ? - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2# W8 Q( r) |) d" L/ U
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
, e; r0 O: f# N+ B4 J4 h - SPI_InitStructure.SPI_CRCPolynomial=7;
) j6 w& E, a5 c6 N9 E) X4 _9 S - SPI_Init(SPI2, &SPI_InitStructure);
* S* O- Z& q" t3 J+ _6 J/ e - SPI_Cmd(SPI2, ENABLE);4 i3 ^) }5 g/ o7 y. R" d4 i3 R
-
" l, K/ B4 l8 M( ] - }$ H' C" J3 E0 v# x/ U
- * _, q7 Z, m8 I
- /*******************************************************************************
& V3 o6 ~+ r6 }* Z3 K - * Function Name : SPI_ReadWriteByte
2 R6 b$ ^8 X* u' J! `1 _ - * Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)7 i* G( ?, i) r, \+ N ?& n
- * Input : unsigned char TxData
7 I1 p* @4 e: @+ _ - * Output : None" a A @% P& V
- * Return : unsigned char RxData( ^0 {- U& M3 k0 N
- *******************************************************************************// Z' F/ D6 G3 ?0 R/ [/ X v
- unsigned char SPI2_ReadWriteByte(unsigned char TxData); l' ^% O4 \0 D, s# j
- {
& L; @0 O6 n( s- J6 b U# u - unsigned char RxData = 0;
' N+ D3 W( T c# m& k - /* Wait till Transmit buffer is empty */
L& J: h4 J4 P4 e$ J - while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
: d& W( C+ D" F$ Y' B2 c' N ? - /* Send A data */ * z" a/ C" U2 v# S. n
- SPI_I2S_SendData(SPI2, TxData);5 e& s" \0 i6 V- j
- // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);7 m$ q# b, x' d% h# p# I) e: X5 g
- //等待数据接收
. w# a& o1 c2 v+ h - while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);' n' z1 E8 b& ]' C
- //取数据# \, v" k. V- N- P
- RxData = SPI_I2S_ReceiveData(SPI2);
+ M: @5 O K, K2 j - return (unsigned char)RxData;2 s/ G; m) n* F" b3 Q
- }
. x4 N# _- X- ^. I$ T+ O3 K - Y# f8 @4 @1 m) d" p4 Y+ A+ O
- [) b3 j2 N0 H0 m& M" `- g# b
复制代码
9 \3 E! n% y# a+ d* r; i0 } }
5 ^* g8 i* v% B4 [3 I |