特别注意NSS引脚的配置,见代码。3 t6 x/ d& ?3 ]. x% q: G$ _. _
1.GPIO的配置与103系列的不同;+ p8 `+ W9 R' y8 {
2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;; T" X* Y: p4 v- i
其他特性请参考datasheet.
8 _4 U+ n( C4 M. K' {/ q* M% m5 j- /*******************************************************************************
) q* O3 Z3 H: z) O* _ - //STM32F207VGT6 FOR ENC28J60
4 ]( R; S- I4 M7 c - //SPI2初始化/IO初始化等
8 p* [% E+ [0 ~' Z - //SPI configuration# P- G0 a, o# \
- @@ JUST FOR STM32F2XX
# I* h0 N: b4 j' W, B* m5 f - *******************************************************************************/
/ L b4 D% |. s- o2 g9 z- W - void ENC28J60_SPI2_Init(void). P) A, l9 M+ S1 f8 q; C
- {5 U) e. b: }% |8 m9 s& W
- SPI_InitTypeDef SPI_InitStructure;8 X8 L% N! h0 Z8 I X- m) F" w. O
- GPIO_InitTypeDef GPIO_InitStructure;; c0 s9 ~! u; ~1 a
" a7 {6 D+ Z, ?, \- /*!< Enable the SPI2 clock */
4 F( t5 ]: m/ u; K - RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
, M8 ~4 |% F2 a7 d7 m+ q4 G+ Z -
6 S7 _8 ?" p- w+ q S, L+ G1 v; \/ B - /*!< Enable GPIO clocks */
" G C0 j9 E) c& W. m - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);1 I: P3 @5 x' Y I7 S6 H6 Z
- /*!< SPI2 pins configuration */" G# [, S6 T; C8 [& ^8 S4 H
-
4 }( e* \/ b- l5 i) `, y0 ` - /* Configure SPI2 pins as alternate function (No need to ! |. C" N: q/ |8 a
- configure PB12 since NSS will be managed by software) */
) L" C# l# e6 V9 x& J/ l - GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
1 S0 l+ r7 Q2 G I4 i' h* [ - GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
& v1 N0 U, V% L$ P9 ], r/ B6 K7 y - GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso
# S7 k3 p! Q" z - GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
8 X* R: [. |% e* D$ U8 z -
! q3 e1 W# G8 A+ M' ^: V - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
6 z0 ~8 |. Y- k9 Z1 {" _ - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz
( s" W% H6 P! {8 z* A6 P - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;$ D4 Q2 y5 G: t% p
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
2 A; o$ r9 c* Q8 m ~$ S" T - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;) N6 Q# l' p$ e9 m/ e" ~: ~' O" f
- GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
, Q2 e" F/ k" x o0 k - , d$ R6 o) H) b6 G5 ~: V4 s& `2 a2 y
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; & O. l& \0 a0 b8 ^( P2 D
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
/ B/ f. a8 W: B! G& z" e - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
* ~, P: s* @6 x% V - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
q! T+ N, ~3 X F - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j601 a: F1 a5 i* b! N3 m
- GPIO_Init(GPIOB, &GPIO_InitStructure);
: o! S( H0 P y4 j3 F -
. d3 S* |9 ?( U3 p - /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
9 w/ y/ y' M. I+ z! t - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;+ G* V) J, k& k1 U( J% T
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
2 l1 K. H6 d8 K2 o! ~ Z5 U - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
( r7 o2 M4 V& B* i- }5 r6 | - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;" I1 V4 a/ O+ }( W- V- ], `6 h
- /*!< SPI2 pin configuration *// K$ l" e& g' O0 q" p
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT4 J$ G+ e2 `: K( I+ ?2 e8 I& \2 X
- GPIO_Init(GPIOB, &GPIO_InitStructure);
! r" j) p# n+ E2 K% l) p7 C
+ m5 b1 Z z# w8 V- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
) E( m& ]5 b% F! S. j$ Z - SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
* V3 w! M7 d% K( f - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构 _' q9 N+ n& B! w
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高5 o1 I" x; n& z! O
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
8 |! }+ A1 ^3 v3 t6 X b - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备9 |% M" Z5 q9 _- ^
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/25 A n( L0 }% J3 z8 P7 x, F
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */9 }7 @0 L8 L3 r. Q& U: }6 w
- SPI_InitStructure.SPI_CRCPolynomial=7;7 y) }9 o& z0 c2 R! B: p4 G" g0 @
- SPI_Init(SPI2, &SPI_InitStructure);0 C4 D5 T, K6 C8 H! g
- SPI_Cmd(SPI2, ENABLE);9 L* g1 c$ y$ T$ |$ T+ I
-
2 I i4 [0 Q# n$ u* f- E( J* f - }6 F& o3 R9 S; [7 p0 X6 @/ W
- ; X" f1 \6 \: a8 f5 j
- /*******************************************************************************
# e5 X! X- M! i. D% `% H* m/ o - * Function Name : SPI_ReadWriteByte- O0 K0 f- }5 U& C& S3 b# ]% \
- * Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
2 v3 @, S; h% Z1 D% A i - * Input : unsigned char TxData
& d7 @+ T: _; Y5 B2 ?3 Q7 a - * Output : None
5 G( _% _5 @4 w - * Return : unsigned char RxData3 i' f' }: B3 G0 H9 Q" ^
- *******************************************************************************/
& t% } @% X! ?" P - unsigned char SPI2_ReadWriteByte(unsigned char TxData): P# V+ }5 S/ h1 d0 g& Y3 j
- {2 T' V7 b: `; y$ h5 q; `
- unsigned char RxData = 0;
+ M" U0 i( G( m/ U; ^2 X - /* Wait till Transmit buffer is empty */
& {4 |( z3 z7 ^ - while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);( Z3 ~ O( ?3 E! Q2 U" ^$ M
- /* Send A data */ 9 i/ |% l4 S7 x5 ~5 v7 k1 S
- SPI_I2S_SendData(SPI2, TxData);
7 R% o1 T8 v4 M4 X# s* L& U: o2 h - // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);4 E! z1 N' R8 I
- //等待数据接收
+ V9 g0 ~4 l' O - while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);0 m% x# r3 u7 A. N3 p
- //取数据/ {% z: d5 o L
- RxData = SPI_I2S_ReceiveData(SPI2);
- d e+ J- ]5 u5 [6 p4 j0 t - return (unsigned char)RxData;! J- V; m1 `( M# E) X0 b
- }
0 X2 V% |( _1 l3 p
- O! f! y q! z6 q$ ]8 g/ D- T- + [: m1 W7 i- u# _
复制代码
3 Y8 K0 P/ S7 s2 s' y4 }8 j k2 c: S; O% g! ]
|