特别注意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- /*******************************************************************************
, |) {7 v: J1 Q w& v: s - //STM32F207VGT6 FOR ENC28J60" ^6 t! y# _+ n+ z8 J
- //SPI2初始化/IO初始化等
% S s S% N: [( {, g - //SPI configuration
. {( k) Q2 E* U - @@ JUST FOR STM32F2XX
. k9 f5 H1 U( L3 i - *******************************************************************************/
; `$ k1 p; `- J0 a' }! n - void ENC28J60_SPI2_Init(void)( R" [4 ?/ I( j, e( q5 t
- {
* f- s3 Z0 m2 c) i. m* i; Q - SPI_InitTypeDef SPI_InitStructure;: O& Z% ]; P5 E+ \. M4 F4 D
- GPIO_InitTypeDef GPIO_InitStructure;
5 h/ \1 a2 r- B9 n- h - 3 e3 i8 T) h5 V v& i2 [$ u H1 i. R# B
- /*!< Enable the SPI2 clock */ 6 `9 G6 b8 n; M, P. q
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);" |/ |' P* A0 J' U
- L2 O# o, j9 Y0 U/ v1 E& {
- /*!< Enable GPIO clocks */
+ r; v5 l' R/ E* h+ Q5 X - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);" I8 s5 u& ?! J1 ] l. h; B
- /*!< SPI2 pins configuration */ p8 f7 S% g1 p: U" K
- 2 f& ?' F+ A, G% l
- /* Configure SPI2 pins as alternate function (No need to
3 p& Q( W/ K- h) z: @) P - configure PB12 since NSS will be managed by software) */
3 ?) D9 H) N! M* A* K8 Y - GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss 2 P4 o0 n8 X6 J) ^
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck4 i, @* R% v h8 V
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso$ ^& e" x2 H0 K- j7 W: M
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi1 ]# ]* R9 u: v! O
- ; R3 m) Y- N ?4 S% S* G2 S
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;0 E: T/ w" w9 q. S' ?
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz6 n' `* j' D3 s2 |
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;1 P: [6 \- k, u! U+ v. j p6 s I
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_PuPd_DOWN+ p2 m9 B8 r/ U; w' l
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
+ m! s5 m/ W) R2 i - GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI( G# |5 G+ @& M$ J2 G
- # J. s2 Y% W# o/ i) Z
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; " q( @# l# B- L7 ~; p' E
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;5 U0 M% f' D- y% q P( h
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;- P0 x; z7 p1 ^* q, V
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
4 H6 H$ x! @6 l - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j605 |8 G+ D$ a& d4 F1 \
- GPIO_Init(GPIOB, &GPIO_InitStructure);
# O8 h7 g A% ]+ x2 }; x -
$ V$ H1 p1 t3 Y: W - /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
4 P' h7 O9 L# y( y* B; h5 F' `2 b - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
3 H9 q7 h. x5 W' u1 I+ v - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
. A+ \ ^( a$ r) @; R: O - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
; A" O3 n) f( F6 d& {& W- K - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;8 \0 o, _! ]9 B# ?1 I6 ~
- /*!< SPI2 pin configuration */4 ?6 o3 s$ f& e1 V# C" j
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT, N2 b, k: t, g2 M$ ~
- GPIO_Init(GPIOB, &GPIO_InitStructure);& s2 v8 c: o1 a( @: o8 a
( f" C+ R% d% I2 `( s7 Z- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
6 F+ |$ O3 z, T Z - SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI* v1 l/ a+ A' K
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构9 r6 T; W* n6 o
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高) M- A- ]% X( n" _* V4 @; f9 @9 m
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
% u+ @) E" @% d2 j6 `- _3 _ - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备3 d8 ]. i, o/ B; A4 m }' x9 C# V
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
) T: s- N+ i% P5 K1 j6 N - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
# s% H/ V+ j d. B: N# z - SPI_InitStructure.SPI_CRCPolynomial=7;8 ] ?- O& C9 Q
- SPI_Init(SPI2, &SPI_InitStructure);8 f7 v1 o& p# S* F) |1 L
- SPI_Cmd(SPI2, ENABLE);
; Y% n/ S z: m+ F -
. C8 n' Q3 ~( h$ l4 `1 | - }
+ W m; A! y9 U6 q2 W6 l: I8 `+ q - , y0 h0 L" E' @9 T8 d; o: Q
- /*******************************************************************************
' e1 x0 h: p# }# G8 n - * Function Name : SPI_ReadWriteByte. O1 `* x: A2 p: `. `
- * Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
, S& M- C5 T7 I# W+ N& b9 y) z - * Input : unsigned char TxData
; U! b3 h- [, m" [# y& M - * Output : None
4 d& U' c5 g8 ]. t7 X' H - * Return : unsigned char RxData) N( O; @) X# a( N; e9 m
- *******************************************************************************/
) r% W- H5 v4 ] - unsigned char SPI2_ReadWriteByte(unsigned char TxData)1 O; n( J0 d+ t2 x( M" A3 z
- {
2 x7 F! \1 y# [7 Z J - unsigned char RxData = 0;8 C; C8 Z/ U. u4 y: t' ?
- /* Wait till Transmit buffer is empty */ 7 v: \1 w9 W6 m: t5 X
- while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
" @5 ]- x# d' i/ x" S0 F& r' l. Z - /* Send A data */
9 m/ o* }. g7 U, x6 b$ q - SPI_I2S_SendData(SPI2, TxData);
+ ?+ V8 x3 A7 A- I+ B: B2 Q% d( {- q2 H - // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);! k3 Q. N3 S2 }- {/ `& s" Y
- //等待数据接收
( g. t8 f. A; c; o - while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);+ h* r v* k2 I! O" M6 n# q
- //取数据) Q2 U0 A& z$ X: W2 G1 c
- RxData = SPI_I2S_ReceiveData(SPI2);
6 g# d- P! K l7 p/ H - return (unsigned char)RxData;
3 }3 j; h7 k5 @$ B: l' Z - }) j; c& ^. W1 H* q/ K0 k* N2 S
2 m/ W3 A8 U. A$ a1 l8 S
* z0 q. l2 `( T1 U
复制代码 k7 @ P7 q) g" n: J g1 M
`. l8 s0 A: ~9 c# n& x: G4 a$ M |