特别注意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
- /*******************************************************************************
z7 ?* f8 ?9 c. _! S$ s% W9 [ - //STM32F207VGT6 FOR ENC28J60
- E4 E8 h' d7 A1 @2 |- Q - //SPI2初始化/IO初始化等
9 `# F% @& @; ~3 H" N8 N# z5 a1 Y - //SPI configuration
/ D' e% Z- _* P: V( s, }6 ` - @@ JUST FOR STM32F2XX* {- P$ k: @# h
- *******************************************************************************/
! Y1 a7 n! e7 {' V8 p0 y7 S - void ENC28J60_SPI2_Init(void)
( c! H S; |" X% J) |" ~+ s: y3 a - {* B3 R$ P( U6 n
- SPI_InitTypeDef SPI_InitStructure;
/ J. u. K z: r+ h7 r, p - GPIO_InitTypeDef GPIO_InitStructure;
9 `) \+ j: I: {7 x
0 n1 V l, T7 u4 {/ `- /*!< Enable the SPI2 clock */
! \' v( V7 h/ r7 b3 W/ O3 e - RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);6 ?& | @) d1 m: g8 f% A
-
: T0 d: K6 I( ?( ` - /*!< Enable GPIO clocks */" |/ }2 S. K: W
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
; [" K+ V4 |, U& N' j# i5 t - /*!< SPI2 pins configuration *// M- O. d4 `3 [- H; q# o
-
1 N! {2 k8 v3 X5 f& V$ [2 t - /* Configure SPI2 pins as alternate function (No need to
/ M W* z+ A) L8 C! H6 u) M. I4 D - configure PB12 since NSS will be managed by software) */
9 s: A& G+ T3 b' |) X - GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss w4 d: w6 K1 |6 B4 L, P
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck1 C+ l: H* D* @& [7 o
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso7 c1 n8 ^! b/ c
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi; v# V: H: b/ E
-
8 D- ^9 k I( Q6 M1 T) G# L - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;' q; j+ }8 x& k) m2 g
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz9 A2 s0 `3 V8 a* |# I' i
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;" E) \7 @8 s3 x& c$ p% z8 P
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_PuPd_DOWN9 ^3 e S' b6 H4 v* j) a o& ~
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
, @+ s; g5 N# {7 n" i7 Z - GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
! T2 H$ n% [- e; K1 o# b- l" o1 A -
5 \/ }% ?" p& Y( h1 _* W! i - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 5 T0 h2 X/ D( h; W" e2 d
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;- V% f) u, I4 Z4 `5 k( M
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
/ T+ @2 [# m% b {* B - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
' c7 }: x7 }) j% v1 g$ ~/ U9 o" Z - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
8 ]( T% J2 F8 Q% Y1 ?5 r7 u - GPIO_Init(GPIOB, &GPIO_InitStructure);
' w) Y0 e- L2 q9 u. ? -
6 f X {0 O5 T( J: i - /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/9 B. R3 I* I. X: E
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;7 D6 T$ \3 g) o0 z/ F$ M8 _
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ [6 y% T1 Z2 f5 z4 _ - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;" ?3 q- B% ^6 p' E, L n- ^2 @
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- H- a7 y& l! R, r - /*!< SPI2 pin configuration */, D. I/ ?. I: `4 ~# q
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT. ^ r& B+ x: b
- GPIO_Init(GPIOB, &GPIO_InitStructure);- \6 V) ?3 w( j# Z
- & G, j2 I' r; i& z5 [
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工: Q( x, y/ M+ Q& O% v2 Z
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
6 G. f. R5 _) ~ - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
( l; A# A6 q0 n( w; ~7 D - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高: j/ c% O* i: {/ ?- r: o' Z/ B
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿! g# j+ q& S, s" C& j
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备
! Y9 Z/ E5 A# ]+ H9 \5 }9 a - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
: @% [$ Y$ U) C4 L7 [' V: H - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */5 v' f: ^/ i$ i1 m1 B: F
- SPI_InitStructure.SPI_CRCPolynomial=7;: L' N+ }& T- G+ e9 ^* ]. f" }
- SPI_Init(SPI2, &SPI_InitStructure);
) ]" U( d& k( i) v - SPI_Cmd(SPI2, ENABLE);1 Z5 A5 D% o* O" |# [
-
4 A6 @. U7 `% i% c! D - }
& v$ | ]7 r8 X7 g% i; r T% P8 v
( T0 U. C# D, t) g9 E- /*******************************************************************************, `0 O1 T6 ~. n; H
- * Function Name : SPI_ReadWriteByte9 ~. S- W* F& l; f) T; {
- * Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
+ X* o! u6 I- a7 w) G - * Input : unsigned char TxData
+ c, p7 Y: v) r6 j2 y - * Output : None& g2 f- n9 D. x' t1 Z0 b& B
- * Return : unsigned char RxData
# e7 h' d; P+ E6 e; k - *******************************************************************************/4 e3 ?- F8 O6 m0 n+ B
- unsigned char SPI2_ReadWriteByte(unsigned char TxData)" V- M3 S B7 h- P7 ~% o
- {4 |/ x& p3 _4 j2 w; A4 ?
- unsigned char RxData = 0;
7 ^- {, Y7 ]8 X4 L3 y8 O - /* Wait till Transmit buffer is empty */ + I) y, n% {) P2 q O7 l
- while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);( X/ J. P% ~" a$ I
- /* Send A data */ * B3 o+ L! I: H8 K# ^( L
- SPI_I2S_SendData(SPI2, TxData);* c6 s/ F8 J: m( C
- // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);4 ?+ F( q" c+ O) d
- //等待数据接收( D! v' z& d, x! ~$ M8 u0 N. E- }
- while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
8 L6 p3 S/ E% E5 m - //取数据
3 F) v5 e6 Z4 U/ U7 D9 h - RxData = SPI_I2S_ReceiveData(SPI2);
- H" S0 \# z; _7 Q9 x1 | - return (unsigned char)RxData;0 q; u4 O% x+ _$ o% Y
- }: b; u. u: M. L6 |
- ; L8 y( ], j v$ Z) l0 \2 B
- . b# u& U: }* Q4 T$ H0 A
复制代码
* m) {; [8 I( A* }2 y9 V( y
, \: @5 C% I' h6 f |