STM32基础工程生成
* u8 B$ [1 m% g- x6 P首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到72M主频:
, R. v+ c% i) b9 ]; W2 ~) H' Z9 m
* m! n: O, j* E: P$ b2 i, X
2 k) l6 {3 d* N5 i7 A0 \) O& K
6 |; a( F8 ]( `1 C配置SPI前,首先查看WK2124的芯片手册,手册里面说明了WK2124的SPI最高支持到10M并且使用SPI模式0,SPI的模式0就是时钟空闲电平为低电平且在第一个时钟延采样:# X0 |7 |/ A# W' X# }
2 x4 T6 Q2 N+ ?' g9 w1 D
# L2 M0 L6 v, {7 O; Z
* v( v# N- O4 Q* a6 ~
所以STM32CUBEMX需要这样配置:8 |2 t, d: N' J( r. b0 P( K
6 N/ t" H! B, d4 C r
& O' P3 c- ~+ s$ F& B
p' \/ O* F* JIO配置:* n8 y* a* B& p0 l: z% U* b
WK2124的硬件复位引脚,这个引脚最好接上,使用STM32的IO进行控制
% n5 z) c Q& G& R5 \# E6 ZWK2124的片选引脚
! j+ A$ `, K& {9 F, x8 \/ N4 q如果用WK2124的中断,那么还需要配置一个IO为外部中断
+ ?8 h/ B+ _0 }( w- r, X2 x, hWK2124驱动代码
* V( n: i% w0 h* l; [- X8 y' w$ |代码已经测试通过无问题,贴一下:
* J/ h7 ~) W) E; E7 R4 j3 w6 V, M+ v0 v- K. h* G7 _8 L
头文件0 F6 ]( E+ C9 N1 H2 I+ Y) l
- /*3 L4 f" W9 d* ~
- * wk2xxx.h
# i$ P( D7 D" H( Y- W5 R( @ - *
7 Y+ C V& X+ V$ Q - * Created on: Jun 17, 2021
6 C% |! {& _1 N: K/ t3 f1 g4 t/ y - * Author: hello
. k- @7 J+ r, W& H- D0 v A - */! x8 n9 e8 `& b8 E7 e/ e9 K9 j
/ O5 }' R# P2 N- #ifndef SRC_WK2XXX_H_& [2 I- w8 \& ~# `
- #define SRC_WK2XXX_H_
, k6 y& K1 h: g* ^$ @* Q - / `1 A" p5 M F2 G2 \! {1 e* c
- #include "main.h"
4 b5 M3 o3 W/ u$ c, y: h" Q' b3 M& K
% z6 Q% a ]/ }7 p- & e! ?5 |- ~: A: b" ~
- #define WK2XXX_GENA 0X00
$ f: J% q& T; }& u! ]; i8 T3 J! z/ \ - #define WK2XXX_GRST 0X01% s' w( d; a0 u. @5 f% Z
- #define WK2XXX_GMUT 0X02! {/ ~7 [) f- D) f( t8 ?4 T. l, ?
- #define WK2XXX_GIER 0X10
, H+ |+ d Q9 M - #define WK2XXX_GIFR 0X11* K4 K2 Y$ O8 L2 b; _
- #define WK2XXX_GPDIR 0X21
, j" P. T4 n& X* X. [ - #define WK2XXX_GPDAT 0X313 G: r! Z( @" L9 z% N! k. m: |
- //wkxxxx slave uarts rigister address defines
6 N+ J6 J Z0 {6 C; S
# P0 A Z% H6 `# l+ V! O# l- #define WK2XXX_SPAGE 0X03
* [; ^) f) z# F" p& X6 q4 Z4 c - //PAGE0
! u5 f! v, V, w/ [8 I5 S) t - #define WK2XXX_SCR 0X04- A) D4 V$ D4 k- B
- #define WK2XXX_LCR 0X05
- Y/ \: ~/ F: L$ D. L8 u. c1 @ - #define WK2XXX_FCR 0X06) b1 T/ r) z# w3 o
- #define WK2XXX_SIER 0X07* ^7 W# B0 n/ h: i+ }2 c8 [
- #define WK2XXX_SIFR 0X088 U m: D8 b1 L% _
- #define WK2XXX_TFCNT 0X09
+ g2 K* v/ S. e; U ` - #define WK2XXX_RFCNT 0X0A2 L& R2 s/ ^3 n5 _# W6 a
- #define WK2XXX_FSR 0X0B! E1 K/ T" J. b( x
- #define WK2XXX_LSR 0X0C
. R/ w X! F ^# Y; X - #define WK2XXX_FDAT 0X0D
3 ^* ^/ r9 d5 [0 p1 Q5 E - #define WK2XXX_FWCR 0X0E
9 S3 P% l% ?: M3 U7 M7 Q - #define WK2XXX_RS485 0X0F/ D5 p s6 z# p, i* q
- //PAGE1
) I) ]/ P5 d; p1 j5 x( J - #define WK2XXX_BAUD1 0X041 {: l: y) X |1 l& ^: R/ ~
- #define WK2XXX_BAUD0 0X05) Z1 k$ m5 C" E
- #define WK2XXX_PRES 0X064 q) _& q* j, z9 d$ b" p* t
- #define WK2XXX_RFTL 0X07
8 q) H7 ?5 n' p - #define WK2XXX_TFTL 0X08 u" o8 L' M0 p0 i$ I$ h0 h2 i' C
- #define WK2XXX_FWTH 0X09
! _/ t: J$ _4 Y4 p1 J - #define WK2XXX_FWTL 0X0A1 q% p5 @# M& i" u) z7 X, s
- #define WK2XXX_XON1 0X0B l4 v, q- F0 T5 H" K1 A4 ?
- #define WK2XXX_XOFF1 0X0C
9 c+ d& ?8 I2 F% L - #define WK2XXX_SADR 0X0D
+ g9 h7 B5 q- c1 v( x - #define WK2XXX_SAEN 0X0E
l) n8 k. ]* S u; K4 ? - #define WK2XXX_RTSDLY 0X0F( O N+ u3 d4 r. t0 Y( L4 J
- # v Y z' E% m
- //WK串口扩展芯片的寄存器的位定义
6 b* D$ a& M& [/ ]: ?7 d - //wkxxx register bit defines' B8 D" A& B( h4 h
- // GENA0 z( F' _# z( d: H
- #define WK2XXX_UT4EN 0x08
, I G, U/ `1 k+ r7 k, h9 z - #define WK2XXX_UT3EN 0x04
, Q5 \) }2 a* S6 V3 r8 j( Z5 O - #define WK2XXX_UT2EN 0x02
+ Y' V( @: y: A5 ^9 G% Y - #define WK2XXX_UT1EN 0x01
% o. k' r9 e* N# q: D" F4 |* D - //GRST
4 X7 S( L# F* \1 {% j: D - #define WK2XXX_UT4SLEEP 0x80. h) h: S8 [0 y0 [- n8 E
- #define WK2XXX_UT3SLEEP 0x40
7 A0 M: Q3 S8 _; r/ A2 ` - #define WK2XXX_UT2SLEEP 0x20/ j1 T1 _% ^/ H7 c$ X
- #define WK2XXX_UT1SLEEP 0x105 k3 |+ c5 e1 F6 w; C; f$ X
- #define WK2XXX_UT4RST 0x08
& j5 W, @' Z: J& _7 U3 X - #define WK2XXX_UT3RST 0x047 u- y( t; {, Y& u0 C. x+ J x+ M$ E
- #define WK2XXX_UT2RST 0x02' i2 k+ p! k. B' Y% o
- #define WK2XXX_UT1RST 0x01
$ s4 _4 T: A; M N6 J - //GIER3 _3 X5 j3 A& Q' y& h9 j# y# k, X/ k
- #define WK2XXX_UT4IE 0x08
! W! s1 P7 ~4 E1 H; V; f - #define WK2XXX_UT3IE 0x04) P0 P8 a& ~1 w
- #define WK2XXX_UT2IE 0x02
) r3 t" N& |2 T - #define WK2XXX_UT1IE 0x01! p8 K3 O) @3 A4 s! P2 F
- //GIFR
0 K. p- Q8 K2 v( T! G5 h: | - #define WK2XXX_UT4INT 0x08
% V2 E4 ~9 Z+ G5 a# e# M - #define WK2XXX_UT3INT 0x04/ c1 d, y' C& _4 f1 N8 f* t( Q6 _
- #define WK2XXX_UT2INT 0x02
( z& n5 @1 O0 O; G" M - #define WK2XXX_UT1INT 0x01; o5 ]# k! u9 N1 g& P: d5 S2 q; T* P
- //SPAGE
& _! H `/ q \ - #define WK2XXX_SPAGE0 0x00
2 V8 Z7 d8 u+ L- ?2 d - #define WK2XXX_SPAGE1 0x01
& t H, [1 W9 z# ]% \ - //SCR5 k) f3 q! \1 N8 j
- #define WK2XXX_SLEEPEN 0x04
2 ^5 f' t5 N6 O6 F2 E1 @7 e# z - #define WK2XXX_TXEN 0x02/ _8 R4 }) U' Q. d) T9 F
- #define WK2XXX_RXEN 0x01
7 f6 J5 s4 q: _8 h4 @ - //LCR
B' Z/ n# c5 x' C$ {. x - #define WK2XXX_BREAK 0x207 J% g7 y' \, @+ _/ r1 Y$ ^7 N% t
- #define WK2XXX_IREN 0x10+ X) W* `( c' J' d5 a, s; k
- #define WK2XXX_PAEN 0x08, [3 J; i- E2 K2 n& v- I( L# ]+ ^
- #define WK2XXX_PAM1 0x046 [& b- k. t3 I3 L; E" D
- #define WK2XXX_PAM0 0x023 n8 \, ^" @: X O$ w2 K
- #define WK2XXX_STPL 0x01
0 P9 b- J9 R6 L - //FCR& q/ W* h) i' ?% R$ m9 a1 ]
- //SIER9 T# u% R! B& I) W
- #define WK2XXX_FERR_IEN 0x80
+ c6 r. C& w0 h4 B! H - #define WK2XXX_CTS_IEN 0x40
# L) z+ @6 o% P4 q/ C! J+ o) Z9 p - #define WK2XXX_RTS_IEN 0x202 ~; t; @. ]* v( p, e9 C8 _
- #define WK2XXX_XOFF_IEN 0x108 t' D0 y% r! p! z
- #define WK2XXX_TFEMPTY_IEN 0x08& E$ P8 v; M$ ~4 c1 B- U; n1 ~
- #define WK2XXX_TFTRIG_IEN 0x04$ f1 @: D M* e
- #define WK2XXX_RXOUT_IEN 0x02. m- M7 K: k1 ]$ U1 H7 ^2 d; I% V
- #define WK2XXX_RFTRIG_IEN 0x01
/ N" N( y. p4 q( i1 b; m4 b - //SIFR& y o$ A# a1 p) t9 w
- #define WK2XXX_FERR_INT 0x80
3 W& ` V! Y* t9 ? - #define WK2XXX_CTS_INT 0x40# H! x& @) O3 n7 Q
- #define WK2XXX_RTS_INT 0x20
( r! B; Z w$ M+ h! h- {3 l- v - #define WK2XXX_XOFF_INT 0x107 N. n: p; J) u! u# [$ Y
- #define WK2XXX_TFEMPTY_INT 0x080 [6 T0 I7 V$ q: X
- #define WK2XXX_TFTRIG_INT 0x04" r# |; C" ^3 d" m$ z4 ?
- #define WK2XXX_RXOVT_INT 0x02/ _7 X- }; C' m5 F4 W% ^. _' @
- #define WK2XXX_RFTRIG_INT 0x013 R: Q! ~* g; \* {. ?* w) Z
- $ s2 Y9 N6 t- w9 C
- , E- `% I& `; b, C
- //TFCNT
7 u2 g% T1 w7 q - //RFCNT
$ D9 w6 Y. j W' n - //FSR
1 }% r) z+ C; q2 G - #define WK2XXX_RFOE 0x80
; f$ l0 @# g6 a X - #define WK2XXX_RFBI 0x40
' q, Q4 z/ a( C$ d G - #define WK2XXX_RFFE 0x20& w' v, \5 A3 p% e6 ~
- #define WK2XXX_RFPE 0x10% x/ K" w+ ]/ ?: |" A. F
- #define WK2XXX_RDAT 0x08
/ K/ c& ]! ^' d0 M. b y - #define WK2XXX_TDAT 0x046 U0 r4 q0 Q0 w+ j) Q
- #define WK2XXX_TFULL 0x02
- B, P2 S1 Z1 w. Q - #define WK2XXX_TBUSY 0x01
/ d1 h, M; e: l& Y- [ - //LSR
* l% }" _6 ~, j% }# c - #define WK2XXX_OE 0x08
; t$ f/ a$ x' M% e - #define WK2XXX_BI 0x04
. D$ P- C. P0 K% j7 x% f - #define WK2XXX_FE 0x02
) U* C3 k' b2 Q2 [ - #define WK2XXX_PE 0x01
. a: u& o) G' Y& @' d - //FWCR3 \2 Q/ L" K% H3 ]
4 [: T- s" I, V9 z+ C6 X! |- uint16_t WK_PortSendData(uint8_t port, const void* buf, uint16_t len);
. m7 X, O. s( @+ h: W# M3 ? - uint16_t WK_PortRecvData(uint8_t port, void* buf, uint16_t len);
3 S2 \9 l- b# X6 y - void WK_PortInit(uint8_t port, uint32_t fosc, uint32_t baudrate);
1 Q9 x! v2 B+ [, o - void WK_IRQHandler(void);7 }. X5 T. D& g; ^3 B. i z
- void WK_Rst(void);& C# F8 L- p5 F" N, p) R
8 k/ _9 o0 {$ r* x- F5 M- #endif /* SRC_WK2XXX_H_ */
复制代码
8 a+ N0 ~- r, Q5 V7 B" Y源文件
% T7 m `+ [% h/ B( u$ j# B [8 q- /*9 H8 ?! G6 p$ N0 I9 T
- * wk2xxx.c% F% l/ \$ ?' N* Y1 [
- *
& P/ @$ P, h4 G0 T. { - * Created on: Jun 17, 2021
0 m4 p4 E# ]6 b K* u - * Author: hello3 l. p' @7 s6 b$ P% Z
- */
+ d$ `2 o) ^+ k0 x; g- S! R
; M; _( \ G' P9 J5 Z: o/ L- #include "wk2xxx.h"
o; {! h5 }# n8 a# x - #include "spi.h"3 x3 @- A1 @) B6 ^# {% ^
- 1 S/ m+ b, }& M u6 i9 t
% C, p4 I- p; }' v/ f# p! [# A- //
% i' Q8 [; A4 }- W4 b - ///
* H. V" v2 j( S- q [ - /// 移植修改区域2 \7 R/ d. [) e( ?' \% Y: y! H
- ///4 e7 I4 g. M3 }+ l8 h6 t* H
- /// h5 P5 P7 \% m
" B" t; `" }4 h: V- /// HAL库SPI句柄6 |+ W' i0 z/ x
- #define WK_SPI_Handle (&hspi2)
$ C1 z- m) m q; m
* _4 [- [% ]+ ~) }# K0 u# \- // 拉低RST引脚
* x2 u) d8 n, z - #define WK_GPIO_RST_L() HAL_GPIO_WritePin(WK2124_RST1_GPIO_Port, WK2124_RST1_Pin, GPIO_PIN_RESET)
t: T! B7 U6 n ` - + A+ y3 M. r* Z. k/ c* c1 Y4 W/ M
- // 拉高RST引脚& U5 N9 b% x& {+ V# X. E
- #define WK_GPIO_RST_H() HAL_GPIO_WritePin(WK2124_RST1_GPIO_Port, WK2124_RST1_Pin, GPIO_PIN_SET)6 h, E" s. B' I, i% J# @
2 b; d! H' l1 o" u9 B- // 片选引脚拉低
, r* W" k6 x2 T. L, I - #define WK_GPIO_SEL_L() HAL_GPIO_WritePin(WK2124_CS1_GPIO_Port, WK2124_CS1_Pin, GPIO_PIN_RESET)
7 J2 A7 w9 r, f5 ~ I; V - 5 `! Y% z& A3 z' u5 S
- // 片选引脚拉高/ N8 A1 _7 C- O7 B
- #define WK_GPIO_SEL_H() HAL_GPIO_WritePin(WK2124_CS1_GPIO_Port, WK2124_CS1_Pin, GPIO_PIN_SET)5 x3 u2 z2 W4 [/ d
- ( Z& x0 [3 s, r% D* Z# i% @
) m( a& v2 h2 q9 X" j- static void wk_delay_ms(uint32_t nms)" U# w3 z4 F5 }, M
- {! ~! J& [- I* w2 g
- HAL_Delay(nms);4 ?& b" ]) S& b8 E4 h% ^. V
- }! \( x' y/ |/ F+ C
5 S- P0 V0 n7 d6 R" x; X$ W) O& C- static uint8_t WK_SPI_ReadWriteByte(uint8_t TxData)- Z" H2 F, s: x4 w
- {
9 w, }( A! [! k4 g, i - uint8_t RxData = 0X00;% G7 [5 Z5 o \, X: R; q
- if (HAL_SPI_TransmitReceive(WK_SPI_Handle, &TxData, &RxData, 1, 10) != HAL_OK)( e5 l, \, }" f: V
- {
2 L. \) B/ X3 {8 { - RxData = 0XFF;* y7 Y( x1 T7 C+ F
- }
' u) D. ~& S( n6 H - return RxData;
! V9 U6 }- y9 A. `7 ~ - }
% R2 g F" d+ S; S6 A$ x2 x4 |* a - ' U! d; J$ [2 @1 y8 C
/ \8 l: D( R* d+ J7 L, B
% U! P2 @, B$ f, w
( b/ E8 |1 G# b: N7 x- //
- {8 V+ g; J% Z7 O, y( S7 U - //// R9 {& }1 r" N# n G' g
- /// 驱动程序代码/ L* a' F) L9 r* z
- ///; {7 N3 ^" _: m4 y
- //2 ]) U: _; V9 ]/ u0 B& }# B& X
7 L) o* P* ?0 Z4 ^0 N1 {5 i
% ^2 W+ }* t) T0 M. r- 7 D3 d7 G" K0 f' V
- /// 硬件复位(拉低复位引脚最低10毫秒进行复位)7 r8 W" H& Q; c; @1 O
- void WK_Rst(void)! c+ w& T& i& f# Y9 k4 m: g
- {3 T; O0 @# q6 y: b
- WK_GPIO_RST_L();
1 W- k2 }" b1 G0 g - wk_delay_ms(50);7 \5 d( E/ i& l: C* ^ M
- WK_GPIO_RST_H();1 v9 z* I5 D& o% n( D
- wk_delay_ms(50);, g4 W! c$ E# T8 N8 @# H. w
- }: h( g" D; v" R9 m8 D D& v
! A/ C3 @7 U5 g l) c! p- void WK_WriteGReg(uint8_t reg, uint8_t value)
& P- K( \2 {( C: r8 P* e - {, z) n l; N w
- WK_GPIO_SEL_L();6 M) n' D7 [* a L7 z8 H" ~9 V
- WK_SPI_ReadWriteByte(reg);
: o+ B9 B! @. o, q - WK_SPI_ReadWriteByte(value);0 u3 F+ ]# Y; }
- WK_GPIO_SEL_H();
$ w; k E9 b6 W - }
8 S O; G) d8 T8 B0 b - & q" h0 k5 |" a2 q' a5 u: `, z
- uint8_t WK_ReadGReg(uint8_t reg)
' r+ ^( F4 g' v( p6 i - {
- s1 p) I9 O$ v R0 z8 r5 w - uint8_t value = 0X00;
( x! o: H |8 a+ `, ] - WK_GPIO_SEL_L();4 Z6 J# R- h S# C( q% `. z
- WK_SPI_ReadWriteByte(0X40 | reg);
( I, M, O' l' j6 o% \ - value = WK_SPI_ReadWriteByte(0X00);
! e+ U4 K" `4 d1 p5 i - WK_GPIO_SEL_H();" x ]2 I9 |. i6 p7 ]
- return value;' ^ C9 E; P7 e
- }
# [; j, j- r; V, E7 F: U
5 `6 z9 i5 K; I' `+ J4 T: v; b- void WK_WriteSReg(uint8_t port, uint8_t reg, uint8_t value)
: _' g5 R$ x6 W( B/ _. W - {
; z9 r; Y/ X0 E - WK_GPIO_SEL_L();
( f- x2 S! f J4 B }- R - WK_SPI_ReadWriteByte(((port - 1) << 4) | reg);
& v; D5 ~: I @+ j! m8 v - WK_SPI_ReadWriteByte(value);
5 ?' U e6 l: Y) t9 ]% ]7 @ - WK_GPIO_SEL_H();
) C5 x5 }0 g+ H* w" W& ^ C - }
* J ]8 l, v. l- v( E - a+ X! v% z: d% b h
- uint8_t WK_ReadSReg(uint8_t port, uint8_t reg)
3 z& o1 Z/ P2 h3 g) g - {; _3 v. `9 j: a8 S/ L D5 x: E4 h
- uint8_t value = 0X00;
8 V* O# \* Y* d' C7 E8 W - WK_GPIO_SEL_L();
6 z$ m* W3 n! h6 @& v - WK_SPI_ReadWriteByte(0X40 | ((port - 1) << 4) | reg);% B6 { X4 M, a) I: e
- value = WK_SPI_ReadWriteByte(0X00);+ A/ P. m, O! {- n
- WK_GPIO_SEL_H();
( ^9 u4 }0 r* }- U - return value;7 y9 J$ j* {8 c6 M" _/ n3 u
- }
" O! f% i7 O; w( l - # y3 ]& V0 ?+ S- K2 ?' L
- void WK_WriteFIFO(uint8_t port, const void* buf, uint16_t len)
' K( l# F/ [ T, m( t - {
. g3 e2 f; p4 e: h. @+ [- ]9 R" g% ] - const uint8_t* p = (const uint8_t *)buf;8 g& A! v, L" e
- WK_GPIO_SEL_L();
! E6 B! C3 T5 |. J8 S5 U - WK_SPI_ReadWriteByte(0X80 | ((port - 1) << 4));
% b% r1 j* |, w - while (len--)- x! W( l5 j: m$ M" N
- {
* J; }8 p& Z$ W& d6 |! `! Q4 u, E - WK_SPI_ReadWriteByte(*p++);. b( S9 r/ E# e7 j* q5 [3 E
- }
, F. K5 V9 Y0 y; K3 M - WK_GPIO_SEL_H();
# L: K u. g" J/ M* U) E7 J - }" [6 W- t8 }4 v2 s1 q# b
3 u' s' k9 Y8 R! V! d! E- void WK_ReadFIFO(uint8_t port, void* buf, uint16_t len)0 i2 L u! U4 G) i* G b- ~5 g
- {
5 s: v0 T+ n+ m" b: `6 g1 v - uint8_t* p = (uint8_t *)buf;( q M8 o# @" |" G* @9 R9 z
- WK_GPIO_SEL_L();
1 v, \0 f5 N% I - WK_SPI_ReadWriteByte(0XC0 | ((port - 1) << 4));$ X& F) x0 D3 O4 T0 p* T0 r3 H
- while (len--)
6 G w. N0 b; i - {
1 A5 Q$ z/ b8 y9 M/ d6 n - *p++ = WK_SPI_ReadWriteByte(0X00);6 o6 ?) B# j! a( u" r! @
- }
- G$ _+ A" Y' e1 ~: m1 y - WK_GPIO_SEL_H();6 J) t9 n& c+ }$ l: w" o
- } }9 |+ U; ^9 z/ ~! j
6 V5 v) ?& y; C, _( R- void WK_PortCalcBaudrate(uint32_t fosc, uint32_t baudrate, uint8_t* BAUD0, uint8_t* BAUD1, uint8_t* PRES)' v$ G% X* f7 x1 x% \7 a
- {
2 l" V3 j, c! I" t3 ? - float value = (float)fosc / (float)(baudrate << 4);
) K+ w5 @# E3 l3 M# G3 c( f - *BAUD0 = (((uint32_t)value) - 1) & 0XFF;: W9 Y3 w9 w/ O4 o5 ]
- *BAUD1 = ((((uint32_t)value) - 1) >> 8) & 0XFF;
% @" Q* ~- [) T& e \0 Y - *PRES = ((uint32_t)(value * 10)) % 10;( A% V1 P) ^2 q% ]2 h
- }4 I: |6 h! ~6 C. Q5 l5 N! n
- $ J/ h! ]% L! A$ A8 w$ A
- uint16_t WK_PortSendData(uint8_t port, const void* buf, uint16_t len) {9 V' m/ O4 C# M* a
- {
% P6 L# A$ I p Q9 j- s - uint8_t state = 0;
, w( g7 ?% {: ^4 |) t: Z - uint16_t nsend = 0;! y8 N* S6 a! M7 d
- state = WK_ReadSReg(port, WK2XXX_FSR);
% T! d' e8 @. u% d" L - if (state & WK2XXX_TFULL) // 发送FIFO满0 @# n1 Y1 O) F! `9 l5 D: p# f7 ^
- {" G. N* ?+ O( k
- nsend = 0;
, m! l7 t9 |9 t - } else
% H$ J# ^& |6 n% g - {5 E8 n# S+ ]) m' |
- state = WK_ReadSReg(port, WK2XXX_TFCNT); // 读取发送FIFO已用空间
) K5 u! s$ L2 O0 E4 y - nsend = 256 - state;3 s5 Y+ F" K2 M' W; D
- nsend = nsend >= len ? len : nsend;+ f$ H3 e9 k. S( | J
- WK_WriteFIFO(port, buf, nsend); // 将待发送的数据写入FIFO( |; [# w! B9 H7 [* ~
- }5 q+ H1 f5 u+ z- k6 d
- return nsend; // 返回实际发送成功的数据量( _% s0 L8 O9 K6 y$ t
- }
! a: @( K; W' x1 {0 O, J3 Q
" g4 x; b; J7 S4 v- uint16_t WK_PortRecvData(uint8_t port, void* buf, uint16_t len)+ L7 f8 V3 B- q' _/ w( A0 A
- {
4 _# V/ d4 Y& a N: n4 K - uint8_t state = 0;
3 U! j4 l. R. k5 m. S, ~/ E' W- e - uint8_t nread = 0;( b$ V1 X3 @+ c: t, s: `" b, k n
- state = WK_ReadSReg(port, WK2XXX_FSR);
/ I0 g- n" Y7 h, w5 k$ H - if (state & WK2XXX_RDAT) // 接收FIFO非空
( ]; k" y$ p/ h" n& k }, e - {
$ k8 J6 F; `) R0 @, i7 q - nread = WK_ReadSReg(port, WK2XXX_RFCNT); // 查询FIFO中的数据量
7 O$ h" h. c$ F4 c - nread = len >= nread ? nread : len;
1 c; t: t- O. a6 S1 } - WK_ReadFIFO(port, buf, nread); // 读取FIFO中的数据" O0 g- F; a1 L7 h8 f) \
- }
2 b f+ N4 _9 n, L - return nread; // 返回实际读取到的数据量
; E; v9 H8 d* g8 @2 } - }. b0 Z$ C& v/ t8 A2 k* \
" T, O$ t1 r& m; q1 i- void WK_PortInit(uint8_t port, uint32_t fosc, uint32_t baudrate)+ r( u: c5 U+ K+ H
- {
( D% x2 Z% P: |5 B' W - uint8_t BAUD0 = 0, BAUD1 = 0, PRES = 0, value = 0, ret = 0;
5 N% E$ z& ` r6 n } - / s6 Z: b; X$ |( p+ U. ]
- //* I1 Y0 S, ^/ [: h4 | P, o
- // 使能子串口时钟( y4 v* g' k7 M8 l9 s! N7 J
- //( [6 v% }8 T |8 W8 l E
- value = WK_ReadGReg(WK2XXX_GENA); D9 t* d1 t' w( }& S
- value |= (1 << (port - 1));" ~! Y& B0 ^) K6 n$ j6 z7 J, C* l1 V, J
- WK_WriteGReg(WK2XXX_GENA, value);1 o: K1 ^ W9 h+ m7 O, r9 U6 o1 u8 H% T
- ret = WK_ReadGReg(WK2XXX_GENA);
( Q$ T% K: n# m7 L
. {" @$ r6 {) t- /// f2 ]! ]" J: u B
- // 软件复位子串口9 L- U2 L/ U$ B# I/ \1 I
- //. {3 t4 k: _6 w3 U
- value = WK_ReadGReg(WK2XXX_GRST);6 O- K* a6 S( @) k: r$ _
- value |= (1 << (port - 1));
8 _$ s$ W4 E0 z0 |- p - WK_WriteGReg(WK2XXX_GRST, value); ~$ I6 q- w# }4 b) v: U( L
- ret = WK_ReadGReg(WK2XXX_GRST);$ v7 z; t' l; Q8 j0 p) H: P4 Y
( X8 V1 E- g7 Y1 v- //; P; t0 z+ c1 X7 F" m5 r; w
- // 使能子串口总中断
. u' E- ]# q4 S6 I8 R3 F/ ~ - //! a$ g. x# H2 S( ]& a
- value = WK_ReadGReg(WK2XXX_GIER);
* A4 |" N7 d ?& N2 I - value |= (1 << (port - 1));
& s/ V/ i0 W* {( A1 W6 k$ m$ h- p - WK_WriteGReg(WK2XXX_GIER, value);
: j4 A% C/ e+ l& I9 [ - ret = WK_ReadGReg(WK2XXX_GIER);1 v& R0 [) R7 v) n2 M T" p r% H
- # G- E3 i3 _! g1 a! U! M5 B: X+ k
- // j3 B* K; w% R2 M
- // 使能子串口FIFO相关中断
( W* U; h( r4 k1 k. w. V, @ - //
2 ?" _6 R0 ^5 X3 ` z. c - value = WK_ReadSReg(port, WK2XXX_SIER);
. x; l$ @) x) R/ M6 R7 P" e3 k - value |= WK2XXX_RFTRIG_IEN; // 接收FIFO触点中断
& ^3 F2 D7 i! J/ [$ Y# v A# L - // value |= WK2XXX_TFTRIG_IEN; // 发送FIFO触点中断. |, ?' o# l2 \0 ^2 Z
- // value |= WK2XXX_RXOUT_IEN; // 接收FIFO超时中断* q0 [. E0 E7 z6 m7 w
- WK_WriteSReg(port, WK2XXX_SIER, value);. }9 b5 Z( D; L8 C# w/ e
- ret = WK_ReadSReg(port, WK2XXX_SIER);) k, y; D3 G) t4 ~ T3 C5 E
- 7 ^7 R5 T3 l4 d! x+ D$ t
- //2 D! R9 i* ~6 @ y' a8 B
- // 设置FCR寄存器
8 y* s- ?/ @& c( f" d3 s2 S3 P - //
7 ` s5 t4 g' |# b4 u, t5 r0 `* w - value = 0;) B1 ^5 V% J x+ [9 x1 u1 _
- value |= (1 << 0); // 复位接收FIFO
, N0 m" z! g# p" n4 ?( e - value |= (1 << 1); // 复位发送FIFO( J2 g# G+ l! f0 d1 N
- value |= (1 << 2); // 使能接收FIFO(这一步必须)
# E7 B! i1 P0 g) g8 F8 ^5 \ - value |= (1 << 3); // 使能发送FIFO(这一步必须)
p$ c% F- S( s* N! D5 B& f - value |= (0 << 4); // 设置接收FIFO触点固定为8字节7 |2 @. \8 H+ N! t4 }
- value |= (0 << 6); // 设置发送FIFO触点固定为8字节
6 k: q9 f, d! O - WK_WriteSReg(port, WK2XXX_FCR, value);" B7 _$ T. W' f1 e
- ret = WK_ReadSReg(port, WK2XXX_FCR);
0 [9 X1 v8 l) I# q4 ]+ h
# E8 Q0 ]4 f' L7 {: e P- //
3 [' Q- A \$ R9 O/ W* `2 Y - // 切换到page1设置中断触点和波特率
, j' Q6 {& ~; j0 \ - //
6 F# k: S. Z; J x - WK_WriteSReg(port, WK2XXX_SPAGE, 1);6 {* [/ q. h: |1 g T
- ret = WK_ReadSReg(port, WK2XXX_SPAGE);
: E6 E y3 D( |7 b6 \5 l! b
2 K0 d5 S+ t6 r/ C4 {- WK_WriteSReg(port, WK2XXX_RFTL, 10); // 设置接收触点为10个字节
+ F3 L/ r4 [3 W - ret = WK_ReadSReg(port, WK2XXX_RFTL);6 m- Q" `- I0 z6 H( e
- 1 `+ l* o0 d( k( E: N8 c
- WK_WriteSReg(port, WK2XXX_TFTL, 10); // 设置发送触点为10个字节+ M% J: d1 w/ L! w9 ?
- ret = WK_ReadSReg(port, WK2XXX_TFTL);
4 n! A4 E+ Q9 V: m) m% Y - / L1 t+ \+ F( u9 l% m- n. X1 \) ~
- WK_PortCalcBaudrate(fosc, baudrate, &BAUD0, &BAUD1, &PRES); // 计算波特率
- x% e9 ^! B( _) M; ~. N
% `! m* o/ t, k; X: p% S, @" F2 r- WK_WriteSReg(port, WK2XXX_BAUD1, BAUD1); // 设置BAUD1
1 ]8 C/ Y0 X* N4 B$ W+ p/ c - ret = WK_ReadSReg(port, WK2XXX_BAUD1);% u$ r/ X: H2 H* | S; X
" {6 F# e v/ \9 K3 N- WK_WriteSReg(port, WK2XXX_BAUD0, BAUD0); // 设置BAUD0
5 J% b5 h3 I" D6 T3 H: k- t. d3 O - ret = WK_ReadSReg(port, WK2XXX_BAUD0);
/ p% n9 g2 \0 y- w( w
1 e2 j: l+ C) P/ l& V' c* @" @+ M8 v- WK_WriteSReg(port, WK2XXX_PRES, PRES); // 设置PRES: |1 Q0 W7 R5 l& C* S- S( l+ D; T
- ret = WK_ReadSReg(port, WK2XXX_PRES);
. V, f! B4 g3 U. b1 J9 ^) c
r6 e2 {/ H' Y! ], I+ p9 v- //
' o. D% v* U$ G7 s: k' @ - // 切换回page0
8 q- T3 }; c D! k6 r$ n - //0 D3 j: E8 g5 y5 N- X+ ~
- WK_WriteSReg(port, WK2XXX_SPAGE, 0);) v7 P9 M+ Q) ~( Y8 f' ]1 H
- ret = WK_ReadSReg(port, WK2XXX_SPAGE);. S* l% J+ d6 }# Z- b3 X7 c" s0 j
- 8 @) a$ m1 b9 Z7 b, @3 b8 C
- //% r/ E6 f* Z0 k
- // 使能子串口收发7 i8 |2 |" N8 r& m* s
- //
8 d3 E! O6 Q6 N9 K- F. J - value = WK_ReadSReg(port, WK2XXX_SCR);
# {. e5 N6 n$ [3 I' l - value |= WK2XXX_TXEN;
! O; Z, i: ]+ \5 G - value |= WK2XXX_RXEN;
* d4 G% n6 g. f5 Y; o( g - WK_WriteSReg(port, WK2XXX_SCR, value); p# g# G- G! B ]9 |% g |6 W
- ret = WK_ReadSReg(port, WK2XXX_SCR);
! @- v4 i/ r8 ~* w - }3 J0 u$ G" `* x, U; T8 j
- . @% h9 j6 `2 n3 S6 |0 [7 d
6 u; W1 }0 G+ i9 r+ B- // 如果irq引脚接入了单片机的外部中断引脚,将该函数放入外部中断处理函数内。+ R' o$ k" N6 g
- // 对于WK2124所开启的中断可以这么处理:1 r3 w! E1 `* D( c" `" ?0 w
- void WK_IRQHandler(void)
9 [: `# ^8 E4 L - {
( _( g. f# u$ o8 }! ~, `* b - int i = 0;
/ t+ u k" i' I - uint8_t GIFR = 0, SIFR = 0;" w! M. S0 C5 X: y Q' l0 d
- ) D$ E" W; X$ `# F
- // 读取子串口全局中断寄存器) u6 J8 _9 u! r% [6 C% l# y4 y0 u
- GIFR = WK_ReadGReg(WK2XXX_GIFR);' w, u! m$ k( S! _
6 ?! ^; b: J: |- // 查询4个子串口是否发生中断
\( O6 B# G' T& q, \ - for (i = 0; i < 4; i++)! i) q7 A/ X5 p! X
- {
* @* i# y$ m o# } o) \) ~! i - if ((GIFR >> i) & 0X01)6 b$ u! \. i. N7 z# E
- {
3 C- n7 K5 v/ x6 r- m1 C7 C - SIFR = WK_ReadSReg((i + 1), WK2XXX_SIFR);! n# H: `2 {% N$ C. Z' E, c3 _) Y T
% o Y- Q$ V9 g8 a- // 有接收FIFO触点中断1 ]6 l8 ~* R' S" l
- if (SIFR & WK2XXX_RFTRIG_INT)
) p; ~5 [2 x) D8 v( g9 Z - {5 ]6 S' Z2 F) p9 D9 c, _
- // 调用WK_PortRecvData接收数据
8 `5 {& L4 x k6 t) r - }2 m0 F9 E! Z( W8 s0 S' I
- + g0 D3 M9 V0 {* j. [8 \
- // 有接收FIFO超时中断# |& {. T+ X0 A6 h
- if (SIFR & WK2XXX_RXOVT_INT)( K9 x/ O7 u7 B+ X# A3 c
- {
; e& E1 v }, K, T8 Y - ' A5 C- e& Z. s( n& L3 m
- }% O$ G* n3 d! m4 N6 N, B
) M! s4 b7 b. P. o: Q, B& ^$ m: R- // 有发送FIFO触点中断$ y$ V8 e0 @4 P2 M1 H# {
- if (SIFR & WK2XXX_TFTRIG_INT)7 a' T% Q4 x& q* z
- {- N. G7 f2 j" s- g
_9 u& v$ f; B% {- }
1 e6 R/ r1 z4 S
* ?) S, N, K7 e: o0 n- // 有发送FIFO空中断5 H6 {5 R+ J$ C0 m
- if (SIFR & WK2XXX_TFEMPTY_INT); W. L; ~' i) g$ a; W
- {
( y }0 g* ~ r6 p: M
" m `- J. ^9 e' | i6 O- }
! m+ N; C: j9 L# n! x) \ - . H5 O3 z |: }9 [& J. b$ J+ O
- // 有接收FIFO数据错误中断
1 l) U' O @# Q- o& S- ?3 p$ n; G - if (SIFR & WK2XXX_FERR_INT)
5 Q2 Z, I9 N( P - {2 e9 ?9 P6 g% m: {/ H3 O
4 T2 F, u" i. O' J1 y0 A4 f- }* N6 T! `* v: y6 M# M i) w5 a8 q( `
- }
4 v" `- l. A9 ?& L3 k, s3 b! P: } - }
3 }7 y. I+ x+ _0 z; p$ @# i* L; C3 c - }
4 e3 E6 Q* F1 \ - 6 |/ G8 s1 o, U% y" q/ b
- /*
& B" E. R( ~ N2 I2 P - 1 d# u% Y/ s* ^+ ~: d
- int main()9 K, g+ V2 l! W' R4 e2 H! v
- {
( F$ P' V8 t+ N. H2 ?/ y' b2 d - int nrecv = 0;
. J+ j8 {! J, \. R+ C - uint8_t buffer[256];
7 s- S, M4 l; S/ L1 ^3 K! m) ^, B -
0 x" W% r: H; }7 B6 p" p$ G" ~" j - // 硬件复位一下
# \: ? x0 U8 W# w! J; t" g - WK_Rst();0 @3 u& z$ f/ q' u7 t$ s- m# g4 d
-
. f9 j, i5 ^ t, W. n - // 初始化四个端口
3 a! N8 [7 V5 Z7 f4 n& `( X - WK_PortInit(1, 11059200, 9600); // WK2124晶振我用的是11.0592MHz的,这个值根据实际进行修改% o5 E5 ?/ H: ]) \; f% I: ~
- WK_PortInit(2, 11059200, 9600);- K6 T. U k. O, q {. _5 H4 K' ^
- WK_PortInit(3, 11059200, 9600);
* P2 N0 }6 t O+ H) q - WK_PortInit(4, 11059200, 9600);' Q; S- D6 I! n, R: I
-
6 Q0 o P* |$ l2 W2 A B - // 发送数据
/ y. \6 w7 p; o3 W: d9 V - WK_PortSendData(1, "helloworld\r\n", 12);, D) [' }7 I, w( j( O
- WK_PortSendData(2, "helloworld\r\n", 12);
! {$ c" a' z% W5 w# O - WK_PortSendData(3, "helloworld\r\n", 12);
, x# d/ m% S( I8 b8 h4 j! f1 Q; i: O6 T - WK_PortSendData(4, "helloworld\r\n", 12);$ _$ p$ a& l7 _( S3 ?
- 3 L% B% v0 `$ h0 L6 G- g
- // 接收数据,轮训方式; p+ X# V: J$ |5 \* G
- nrecv = WK_PortRecvData(1, buffer, sizeof(buffer));. s/ G% P7 Z E1 u
- & l0 N8 W T1 ?
- if(nrecv != 0)) B' h1 M6 v2 N2 M$ A! w9 f
- {# k. a3 s8 a+ i. a% o
- // 处理数据
1 l+ j. D7 Y: P( S5 g1 x! Z* ^' _ - }
- s3 p& Z# M- T7 d: l6 o- g -
1 K3 {3 ` I. F9 A+ y1 w- o& P+ |, F - }# H. B' @ g8 H8 T' J" J- x
- 1 [$ M& m2 a$ a% e' r7 _7 b2 y
- *// U5 |, Q' R M- V# f( }' q x" K7 v
- a+ n6 b7 Y* o6 c) q5 w3 ?- ! T% _. X& o7 ?/ }6 b
- 1 J9 v( N& k7 p! T X. ?
6 `; B- M) U$ j' x- 1 Z0 x7 j# G5 W! Q# k8 V' E
- % j; i1 { w9 l5 _
复制代码 5 [3 t/ ?0 M3 d, H4 w
, T( X2 G# v/ ]) T$ f- X6 i7 F/ Z |