一、WK2168介绍
8 Q R2 `9 C2 H1 Q1 E8 VWK2168是首款具备256级FIFO的低功耗并支持 UART/SPITM/IIC/8位并行总线接口的$ K3 n L* I# R4 b3 o
4通道UART器件。可以通过模式选择使得该芯片工作于以上任何一种主接口模式,将选
6 |$ U6 ~" {3 E0 F6 h4 \) \; k定的主接口扩展为4个增强功能的UART。% f; Z& |( Q9 D! j
扩展的子通道的UART具备如下功能特点:; T- W; I7 j/ b( Z& _( t
1.每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps% m. E5 H0 j! D0 _
的通信速率。
8 V1 M. j6 O. J9 X& W: j z+ H2.每个子通道可以独立设置工作在IrDA红外通信、 RS-485自动收发控制、 9位网络1 Z7 _3 Z( b% s
地址自动识别、软件/硬件自动流量控制等高级工作模式下。( u O' s& |, {" ^, k+ c3 V# N
3.每个子通道具备收/发独立的256 级FIFO, FIFO的中断可按用户需求进行编程触) l: U) @9 T! o5 E
发点且具备超时中断功能。
( l1 q& G( i+ ~WK2168采用LQFP48绿色环保的无铅封装,可以工作在2.5~5.0V的宽工作电压范围,! B3 Z2 ^; t$ D. s) ?% C& B# _
具备可配置自动休眠/唤醒功能
8 _$ P- q' f# j+ z二、硬件连接; p7 b' V5 L. ?; W
; ?: x/ N \. |! b' a
4 G! z4 w* f8 N$ V3 ~0 x
9 \) E4 T# Y* ?9 P
' [( j, ~! `& l% T3 D
8 f. @/ t; w+ n% P三、驱动代码/ ~; B9 o$ q- `5 }' Q0 s% e! m
main.c& x% n. q8 [" S4 F, I+ E& X
; C0 d# K" L7 p8 a- @- a- #include "sys.h"
9 q- V3 b$ ~, _0 A, _! T- A9 [ - #include "delay.h"
& x' F; M! u: `/ z2 x2 } - #include "usart.h"
$ v/ x T3 W2 l% d# v- n - #include "led.h" # ?/ t1 u, a0 t1 M2 X
- #include "wk2168.h"0 |5 D4 a* P+ o; t# }2 D: ?5 D
- $ T+ m, w C* }( Q: E9 X
- / I8 ^, T4 k8 Q/ t5 ~0 L
. H2 c6 c% \; J6 I- ' U7 s f, @, u2 U) G" V; k5 O! h2 S
- , W% q. o4 v4 X& w: S, T
- int main(void)+ Q- |5 E" i5 M$ L3 r' `4 c* P
- {
# i3 _( _& a2 G1 \, ~8 E4 L6 O - //wk2xxx相关定义+ y& F4 g1 {; c; V0 h- T: V5 s
- u8 sendTimeCnt;6 E4 Y5 e1 z. _5 n) h/ Q: e+ H9 F* \
- u16 ledCnt;" p( K ~5 _1 v2 P6 M, f
- u8 dat1;
1 Q) h* b& D4 j) Y, G+ d3 F( J7 X - u8 sendData[5]={0x01,0x02,0x03,0x04,0x05};9 G: I7 g; f# Q V- S# M+ h+ e
- 4 j; y+ |) Y Q# V
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
6 U' Y$ J( S y9 u/ N6 b0 I5 ^* G { - delay_init();
. H8 r* S; h4 r# h" E& E4 O% B - uart_init(115200);
0 q% f8 w2 T9 L6 ~& P - led_init(); $ |- }: a, d4 C2 W! a
- wk2168_init();
- H8 b8 [0 i. S/ P9 d: w - wk2168_exit_init();; h+ U: M; B+ A4 H7 V: y
- / j/ G& p4 K, n3 x
- /*读写GNEA,测试主接口通信是否成功*/2 w; w- W ]+ w- W
- dat1=wk2168_read_g_reg(WK2XXX_GENA);3 ?6 Y. C1 {, ~ \7 ]' [* W
- printf("gena=0x%x.\r\n",dat1);/ U# t7 i6 [, K {4 J4 e) t A
6 M) O7 K6 h% k$ `+ b. x! x- 3 i1 k) t2 M6 q; a
- /*初始化子串口*/' h5 y' c# |6 I( q( ]1 r. B
- wk2168_sub_uart_init(1);- I. i" A& U, N, {6 y) X0 h
- wk2168_sub_uart_init(2);
! n+ h4 L3 B' f) L: T9 n! ~7 W! ^0 } - wk2168_sub_uart_init(3);
; C6 k" s6 i2 \& U. G2 ]+ H - wk2168_sub_uart_init(4);6 Z/ X0 B/ O/ t/ u
- /*设置子串口波特率*/0 s5 q7 Y% Q9 P% F5 C- ~2 v$ Y
- wk2168_set_baudrate(1,B9600);' \; `/ e6 W6 _$ ^
- wk2168_set_baudrate(2,B9600);, Z9 i* e# E$ n2 n
- wk2168_set_baudrate(3,B9600);9 h! K* M% u+ Y: h& s7 T
- wk2168_set_baudrate(4,B9600);
4 B3 J; ~) D# t b& w, F, K - /*使能485*/0 H! C8 J. F) u% ?: i! a
- wk2168_set_rs485(1);
3 S( b& \: N; \8 p- P0 ] - wk2168_set_rs485(2);3 c, g4 }4 u+ q# G# `$ ]
- wk2168_set_rs485(3);6 C/ T2 }; h+ k
- wk2168_set_rs485(4);& Q$ c' H& M& Z. X1 g/ n) U
B5 N' @& U. t4 h-
) n$ ?! i7 L6 P - while(1)+ _" I4 A/ e; X6 a$ d: D# l* J% y
- {8 ^3 h( @( L9 ]* t5 J$ ~
-
9 o" K6 `, f% e5 ~: ?+ ?4 ]9 U; W - sendTimeCnt++;% E, P9 a. ~6 C. @; b
- if(sendTimeCnt>=100)9 H1 P4 j- @3 d/ @& Y1 G
- {
! p9 l0 ^. w9 l; n9 l$ M3 H1 Y. K - sendTimeCnt=0;/ z& A) |! `1 C2 s1 n; Y
- wk2168_exti_disable();
4 B+ j+ N7 f* d - wk2168_write_s_fifo(1,sendData,sizeof(sendData));
% Y( K; U* W6 L# z3 k - wk2168_write_s_fifo(2,sendData,sizeof(sendData));1 w3 U; p9 g7 N3 [6 c
- wk2168_write_s_fifo(3,sendData,sizeof(sendData));9 y/ ] |7 I/ e9 ]8 f
- wk2168_write_s_fifo(4,sendData,sizeof(sendData));2 t$ ~8 A/ r8 T) R. ~; L/ H9 s& ?" n
- wk2168_exti_enable();
1 q- d; K1 [6 x# z0 I -
# h" _, B3 Q& t0 w - }5 h2 q. P# h4 p: {$ K
- % r8 X) @1 T L# e7 B( u
-
/ |7 i$ o1 Y" Q& a3 h' C& t - ledCnt++;8 S M% m* v+ q( B! I( _4 k1 j
- if(ledCnt>=50)% w# C! l$ h T4 @/ I/ g/ V. C
- {
; o# M3 k% _) v1 \# ~) M2 P8 L7 u% m - ledCnt=0;
6 _3 V" r9 H; { - turn_prog_led();. g! U9 }# D7 J% W
- }* W" Y( c ]' S/ |5 w7 O5 _* L8 e
- ' z; w. q6 `& d; S7 N- y
- delay_ms(10);
; E) u- B6 h4 ~( _& s - }
; J7 Q$ b2 B# ^4 N% d1 M - }
0 s! n4 g0 \0 f+ A
复制代码 , z2 m) M, @* K! n
wk2168.c
- _0 }$ O% C) W8 {$ G
3 f$ d5 u$ _1 x: y' f6 `# p- #include "wk2168.h"+ X6 ?# {* w8 I. p! z( ?$ ~
- #include "delay.h") z: O2 ]7 N& c3 X$ }
- % H) A0 b7 t. M/ T* `' j
- 5 f: H' c5 N T9 k5 m$ X W
- void wk2168_init(void)
+ q7 P( Y0 o3 b, |. F - {$ `' `% \- B) O2 e: ]3 L3 g
- GPIO_InitTypeDef GPIO_InitStructure;
3 T+ u: ]$ M/ R* I, S - SPI_InitTypeDef SPI_InitStructure;2 x# r$ a2 p# L; R: t: U1 v
-
! Y! a3 A, ~+ B' M; p% ]& J5 x - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE );
- t3 H% Q" d9 ?0 k -
) [/ ]: E p, _, a. ?/ f - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA0--INT#2 ~0 U! [+ u6 \) F# e
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
2 [5 }6 a9 K, r3 [8 e& U - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ! o# X! |0 B+ j1 |! J4 c
- GPIO_Init( GPIOB, &GPIO_InitStructure );/ |1 {0 }' c: J7 \/ u/ e
- 9 @1 d/ M V# z5 h9 P
-
/ j* Y. Y1 V2 s: k; P: q2 Q - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//SPI1_RST
% k0 r' b& ~. b' l$ ?% w; [8 B# I1 z- ` - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
$ R- i7 }. q( t% A0 V - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" K! c9 S! T( B) K! S - GPIO_Init( GPIOB, &GPIO_InitStructure );' Y( ]6 E; G7 e) q/ S1 _
- GPIO_SetBits(GPIOB,GPIO_Pin_0);
: j/ J ?. J; ?. F -
6 u9 W8 R6 r8 g/ @% N - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI1_CS
, ^$ U5 z; J; j4 L2 o - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
0 `- m5 b8 u9 H& }* I5 Y7 Z, S; K; a - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 0 {" p6 S5 o5 Y+ g# q( \
- GPIO_Init( GPIOA, &GPIO_InitStructure );
; O) B7 H7 v1 O; n! k) X - GPIO_SetBits(GPIOA,GPIO_Pin_4);
~; y8 i |* V- _2 o5 l -
5 V$ J% h- f# V+ Y& y6 V/ | - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//SPI1_SCK4 X2 e! X0 @" {
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ U H: u. B# p- x6 y - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" w$ {% u9 [; L' s7 O( G
- GPIO_Init( GPIOA, &GPIO_InitStructure );
3 U+ D+ {" d, B
- L A- W. h' Y% o: \% u' u8 n- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//SPI1_MISO
) p- w8 k t$ N4 I# J. p' m - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 5 |! T# }2 r# Q( y" i; M
- GPIO_Init( GPIOA, &GPIO_InitStructure ); ( R' q8 N5 S4 W. J& D2 ]/ G: l
- |0 ~, T& C3 O: `7 ~ @6 O
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//SPI1_MOSI; A% Z( ]+ Y9 b
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 2 |, g3 H* v. y3 O( C( j) P
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
% Y }) _4 y- H7 i$ a - GPIO_Init( GPIOA, &GPIO_InitStructure );
- S* d* u" ]* E% \' I; x - 4 G6 C/ [, ^8 \- X
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; : w4 V3 p) U# x+ w8 J# t
-
" ^$ L b6 G- D - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; , M; f. \* F: b- H& m. S
- + d) V" c [3 V
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
: d! @% ~' w% ^! V% M9 H. J- U6 y/ R/ q - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
3 I' A8 _0 X; p8 [ - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
) Y. o8 N0 J" e$ h6 a; p - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
) [. |" @9 h+ e - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
& p& l- X0 @5 m' T6 w - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
4 X, g) O6 G; i5 D3 M - SPI_InitStructure.SPI_CRCPolynomial = 7;' o0 l+ a: c; o
- SPI_Init( SPI1, &SPI_InitStructure );
) y4 \1 G% w3 I8 A/ T
1 {% ?4 ^5 y ]4 q- SPI_Cmd( SPI1, ENABLE );( a1 L6 {% Z7 E9 }1 d' w+ a
- 2 e! I: s' M' z) }) S7 X' G$ Z
- . F' L. p3 u! S6 ?5 j4 Y$ W. I
- wk2168_rst=0;
1 ]/ y( {% B" j5 V9 @* s; J - delay_ms(50);) }6 C- y9 R- m
- wk2168_rst=1;
& _9 U& E* C, u- a( o$ C; ^ k - delay_ms(10);8 ]$ u; U; O8 c5 B! G
- . w- e- Q) k/ C2 P( z3 i
- }
3 Q4 ~9 C3 j, F/ f1 J4 S4 K8 c$ S - 2 `+ Z) ?# D3 _8 S/ k/ A- ]
- void wk2168_exit_init()
- N# Q7 g, G0 [3 L: D - {
9 c! h I! S- ]- P2 a. {8 D - EXTI_InitTypeDef EXTI_InitStructure;4 z8 ^; T% X* G: G4 S8 m8 \" N
- NVIC_InitTypeDef NVIC_InitStructure;
7 M, r- l& n+ a) h3 C- y( ^
# C. T3 N# G; Q- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
8 Z% x- Y( u7 k7 V9 z% J$ J! ? - 4 I7 W/ Z0 J$ Q$ P* i) }
8 W1 V. C5 u a- P- g, \8 [* }- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//下降沿触发; v1 ~0 z4 W3 v! _ ?6 \1 H4 b: n
2 g6 ~" r2 p. Q3 M2 k- f- EXTI_InitStructure.EXTI_Line=EXTI_Line1;
J+ O2 p' B$ K$ G4 V+ O - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; ) S( p) R5 S @* y1 j
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;% ~$ F4 M5 E/ F; n. }- ~0 L
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
2 B: y& y5 r+ r - EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
, X) U+ ~4 {: _6 E" k# [6 p, g
4 u# ~( N. _4 i* G! V1 N8 \; K3 [- NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键KEY2所在的外部中断通道
! v$ p2 K i9 I* z: G - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级2, " v8 ~/ ~) ]- c4 R7 ^
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级2
0 A6 v5 y/ }6 X - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道0 W7 |. a5 f7 u, I9 K
- NVIC_Init(&NVIC_InitStructure);
. F3 q4 \* [4 P - }
5 a( N) E% e4 y1 s7 q% `4 [" t - void wk2168_exti_enable(void)! y6 K1 A9 P9 H/ m- W1 o' o1 L( M0 p
- {
" B& a! C; E" w4 `, d& w6 i - NVIC_InitTypeDef NVIC_InitStructure;7 [$ A4 E) z0 B. d7 R8 m5 y
- 5 T6 F8 `$ D9 |2 a, {
- NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键KEY2所在的外部中断通道
& @! n; S" r9 |7 J8 Q - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //抢占优先级2,
5 w4 }0 W* E& X8 w - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级2
# v% P, ^. D, d7 t3 P' ] ` - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道* o/ W: d; x1 q8 G. O
- NVIC_Init(&NVIC_InitStructure);
8 M8 H, H9 f* l7 W* X$ y - }% S% S' x1 O9 B9 F; i7 _) n
' ~5 }) f( I T, @+ J* r; l; e! V- void wk2168_exti_disable(void)
: Y! Z, I0 F" @* S v% }$ z - {
5 N9 p1 [/ x, z; b8 y) E5 J - NVIC_InitTypeDef NVIC_InitStructure;: @+ @( }; X. U5 F
- + e( C% [+ }& R$ w
- NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键KEY2所在的外部中断通道
) v/ r; `0 ]/ n3 e# w% _ - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //抢占优先级2,
% l$ d% X6 M2 h: U: w! H - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级2
6 B+ J7 V7 S8 x- x$ D# y - NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; //使能外部中断通道7 s/ f& n7 n, g2 [
- NVIC_Init(&NVIC_InitStructure);
) B& @& x. x( B* N" G* y& H - }
# S' E9 V/ Q' [; ]7 U% ]$ a7 |3 g - //外部中断0服务程序 + f$ w5 i; u) M7 \
- void EXTI1_IRQHandler(void)- A/ S3 x- m3 \1 B, L
- {6 C, ^5 g5 T& w6 R
- u8 gifr,rxbuf[256];
- v: p1 j7 _& E }) e" b2 z - int rxlen; / |! ? L1 C5 t8 H% P
- if(EXTI_GetFlagStatus(EXTI_Line1)!= RESET)) g; `- _2 W* t
- {2 t3 _6 ^0 l% X& A. ^) s) }$ `
- gifr=wk2168_read_g_reg(WK2XXX_GIFR);/**/
- w7 H0 N5 u" c; d- ^$ Y4 j - do{
2 T9 V) S% m+ _; x8 T7 R5 X2 ] - if(gifr&WK2XXX_UT1INT)//判断子串口1是否有中断! x/ n' e6 L) b+ T
- {
' a0 I( l( n# c0 @4 w3 ? - /*数据处理*/ N" m6 f7 A' d1 _, n% P" [8 z v& h
- /*数据接收*/
! [; D2 R; }4 O# F# F - rxlen=wk2168_rec_data(1,rxbuf);//一次接收的数据不会超过256Byte
/ t! G$ N. j. N. W" ?6 O4 v - /*数据发送*/2 H# l& R C/ D; |* z# G. w6 {. \' F
- //把接收的数据发送出去, v0 q' u6 q$ B/ T# r
- wk2168_send_data(1,rxlen,rxbuf);
2 _3 J; b& U: O7 b
9 ~3 T# v2 Q3 R3 G7 X- }
! k8 N6 X. k8 F, J: G* A - : L& }, s1 `/ b6 ^
- if(gifr&WK2XXX_UT2INT)//判断子串口2是否有中断7 `, B0 z" l- v
- {
; Y" i3 D0 R: @8 i3 L - /*数据接收*/
& B2 }3 o" z$ _6 O3 A$ f, @ - rxlen=wk2168_rec_data(2,rxbuf);//一次接收的数据不会超过256Byte; G# |& Z& A- f9 z6 m$ g
- /*数据发送*/& e+ H/ a W: d8 V% q Y
- //把接收的数据发送出去
- p: _: V' a0 M l! T) U, Q - wk2168_send_data(2,rxlen,rxbuf);# Q( R# a; D: N8 c( D2 `2 \# L
-
: s# _% Z7 b- l6 s - }
1 B+ R, W: f+ l+ K9 J6 r: V - if(gifr&WK2XXX_UT3INT)//判断子串口3是否有中断
2 E+ p w' p o' p$ p5 [* d$ h - {
- ?7 [# W1 i% H+ A; h - /*数据接收*/, ~2 K) D8 F/ f! n' D
- rxlen=wk2168_rec_data(3,rxbuf);//一次接收的数据不会超过256Byte
6 W5 `" t! {+ Z0 {) O/ }4 }4 ], N - /*数据发送*/$ u* \- P) `: M" w1 C
- //把接收的数据发送出去
8 @0 o* Q% \' V$ E: _ - wk2168_send_data(3,rxlen,rxbuf);
. o% m( A; e, R) ?5 Z/ k/ ~ - // printf("port!!!!\n");" _7 C/ x# Q0 F# g2 P
- }; D I9 T" r6 u7 P8 {4 { n" g
- if(gifr&WK2XXX_UT4INT)//判断子串口4是否有中断
% c: |8 U; G9 E% E( | - {' a3 y3 A$ o; Y+ \% [
- /*数据接收*/
( C9 T& e$ `3 K, r2 j - rxlen=wk2168_rec_data(4,rxbuf);//一次接收的数据不会超过256Byte ]' [; Q4 o I2 S7 l! H9 D+ `
- /*数据发送*/
1 m9 _" N' q! k, @2 o - //把接收的数据发送出去8 a! o; O4 {3 V2 Y, U2 q8 `
- wk2168_send_data(4,rxlen,rxbuf);
8 k+ m1 @5 C; W4 e" }; F, p - }
! |4 V7 L1 f: q9 Z- ^3 \4 Q - / h3 X/ W4 a5 E: m" o
- gifr=wk2168_read_g_reg(WK2XXX_GIFR);
6 w1 i! d6 u* h( B, }$ G - //printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);
: I- `- T% l* S# D' o; J - }while(gifr&0x0f); 8 z" i& R7 f a7 X0 v- \7 _7 R# Q$ |
- EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE0上的中断标志位 9 h5 D. K2 X% }% }
- }
, ?5 E1 ^! K5 [" K - }9 f7 O( a, b" |% D7 y7 s# @* r
- /* SPI交换一个字节接口 */" m4 q, V1 V2 N' P1 n" y' Q
- u8 wk2168_spi_read_write_byte(u8 TxData)" a! S* O/ B' G. u: U6 X
- {
% Y6 x+ P( E6 f( A8 D( J - u8 retry=0;
# R) ^& e: Q. Y$ u. ]. k' z - while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
0 h6 |9 k! Y% f - {
( s- b6 X o3 [. S9 A& R. E* N - retry++;4 C d- {$ _% n/ G& {1 F
- if(retry>200)return 0;
/ j, {; }9 q/ Q - }
# l9 t+ t" q0 x$ e3 n) L( d - SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
" A* p x2 p3 S6 u7 R+ z - retry=0;
$ t4 U, L" T+ l; H; i1 j - . g5 q# a% p% ]4 W7 q
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位& F* p% i% a% @( v0 M
- {/ q6 V! P& g3 M" t
- retry++;" ? {. N: F4 Z0 z) Y- ]
- if(retry>200)return 0;4 \1 {6 k. l" `+ {* P* r
- }
% N" x9 R8 J2 m( f6 S' P9 \ - return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
1 l5 T7 p9 ?% _, h& D - }
$ l1 b4 p3 l) @- c
3 r( G& p- F. k) P U8 R5 j' g9 a- /*************************************************************************/
- e* {! K+ N9 U+ }% j/ |# I - //函数功能:设置CS信号为高电平
% y# i0 B7 S, E! m/ d6 J: i8 A - /*************************************************************************/
% d5 `) x2 C3 ~# G* ] - void wk2168_cs_high(void)
4 \+ X0 [) B0 W$ {- t - {2 ]- r3 Y8 ~/ o+ b9 m8 @, M
- GPIO_SetBits(GPIOA,GPIO_Pin_4);3 A+ U+ }' @, r3 {% ^) u
- }
; v+ y$ {+ P# V$ | - /*************************************************************************/' {! ^: n$ ~6 Q2 o
- //函数功能:设置CS信号为低电平; }: V, b; g9 p& G, N$ D a
- /*************************************************************************/
" I$ R6 p6 l' S( d - void wk2168_cs_low(void)# M5 L8 j) K* K6 L2 s- i
- {3 U/ u2 A1 q2 t/ g4 _! a( U
- GPIO_ResetBits(GPIOA,GPIO_Pin_4);% Q! r; d% r9 I
- }3 J, n/ t7 W: s7 U( A
- /***************************wk2168_write_g_reg***********************************/
. ?& q5 d. z: a$ V8 d6 O - //函数功能:写全局寄存器函数(前提是该寄存器可写,! H1 j3 _* c i R' ?, j1 X) F# m
- //某些寄存器如果你写1,可能会自动置1,具体见数据手册)7 p! S8 S* u9 M% V2 J( A2 M7 _
- //参数:
0 ~ ]9 S$ J" L2 y" n - // greg:为全局寄存器的地址
; I6 t5 S0 x Q3 H% q - // dat:为写入寄存器的数据
A* P% T) o5 U9 @+ E4 `" U - //***********************************************************************/9 ]; Z+ k4 e" e% N! h1 s) g
- void wk2168_write_g_reg(unsigned char greg,unsigned char dat)8 z: O8 {- H& @
- {
& [; y! r9 q4 w# m" B2 a - u8 cmd;
' G4 M( b' T; F0 _; X1 Z z: r - cmd=0|greg;! M# Z1 A; j1 w1 C
- wk2168_cs_low();//拉低cs信号" i1 a, y1 `; J/ d& y3 i
- wk2168_spi_read_write_byte(cmd); //写指令,对于指令的构成见数据手册* r, A m6 [6 [% Q+ I
- wk2168_spi_read_write_byte(dat);//写数据* p9 k, f' D% m8 g* V
- wk2168_cs_high();//拉高cs信号+ C9 n- ]) \9 F! Y. m6 N
- }$ @2 L( a, S6 E; G7 c
- /****************************wk2168_read_g_reg***********************************/7 j& h8 S# X5 c5 m! A7 z
- //函数功能:读全局寄存器
0 L2 [. s- s( Y, h+ P7 a3 B5 K - //参数:
- r) U0 A2 R# r! e - // greg:为全局寄存器的地址
3 l: x. o* d9 y; X - // rec:返回的寄存器值
& H1 }# u9 X5 z$ ~$ m, r% u - //***********************************************************************// G& y U# |3 k9 E0 U# {
- u8 wk2168_read_g_reg(unsigned char greg)
2 [5 X( c4 f& b. [; I5 l - {
" A5 k! J d2 ^! Y9 J" M - u8 cmd,rec;
- I+ {6 E9 E9 |( b' X - cmd=0x40|greg;$ C1 \9 H5 S2 `% G, S
- wk2168_cs_low();//拉低cs信号
: M8 C! T- Y3 U) l2 p/ q - wk2168_spi_read_write_byte(cmd); //写指令,对于指令的构成见数据手册/ r+ g" A3 e% o' H" E# d
- rec=wk2168_spi_read_write_byte(0);//写数据4 \3 @4 \! m" v- M, S+ v% o( [3 f) V
- wk2168_cs_high();//拉高cs信号
( T9 _8 s: Z% h. m0 h$ J - return rec;9 o' A- z2 d' P) Y% ~
- }
Y D; v: {+ E1 `5 S3 t" T8 n0 f! H - ! q8 I' [3 p* `
- /**************************wk2168_write_s_reg***********************************/
- H0 v# X% q( F/ |' A7 [' r9 P - //函数功能:# u: ~1 n1 J; V. S+ a( L, N% m
- //参数:port:为子串口& @) z' `* k9 m" i# }6 p8 v9 w- `
- // sreg:为子串口寄存器
0 h: L I; C4 c) D2 ?7 r - // dat:为写入寄存器的数据
1 e- G( _/ {# q& r5 @ - //注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出6 v) l0 h# g W, ? {" E7 x1 [; n9 x
- //**********************************************************************/
) Y1 Q# |6 c: U - void wk2168_write_s_reg(u8 port,u8 sreg,u8 dat)/ \' Q' E+ o' u1 s
- { : n3 O5 B7 v+ G& p, C T
- u8 cmd;
3 T6 F3 r3 U; u9 j( @( t2 |, ? - cmd=0x0|((port-1)<<4)|sreg;
3 m7 F6 S6 h0 ^ - wk2168_cs_low();//拉低cs信号6 o4 C9 i, O& r
- wk2168_spi_read_write_byte(cmd); //写指令,对于指令的构成见数据手册! f8 \2 U7 J' y& \' j% K2 v
- wk2168_spi_read_write_byte(dat);//写数据
) n$ M2 h" t$ ]6 o$ c7 y; l - wk2168_cs_high();//拉高cs信号
5 E6 b9 B/ y. h4 a( T - }* D& f( L; B$ i( L0 ~7 S
- 1 j/ H! b5 Q* {) ~( i6 t" G
- /**************************wk2168_read_s_reg***********************************/0 D) G3 g% M4 B; e* Y
- //函数功能:读子串口寄存器
4 y. g( {- z+ m - //参数:port为子串口端口号 k$ M( H+ }: w1 ?4 {$ k# z
- // sreg:为子串口寄存器地址* q7 R- k4 U U
- // rec:返回的寄存器值9 O# X3 g" v" K2 M
- //**********************************************************************/% z- Z" N& v6 W* o! x" e
- u8 wk2168_read_s_reg(u8 port,u8 sreg) ]- {2 y2 Z/ v x6 m
- {
& I$ I$ C4 |: c, {6 J - u8 cmd,rec;9 L- s, `/ a7 ^* R- |4 H9 _
- cmd=0x40|((port-1)<<4)|sreg;
0 R! G6 Y' y/ \& ` - wk2168_cs_low();//拉低cs信号# z* {5 Q H2 V' p q `. q( i! Y
- wk2168_spi_read_write_byte(cmd); //写指令,对于指令的构成见数据手册
& q& X8 |2 \# K6 C) [1 W, ^ - rec=wk2168_spi_read_write_byte(0);//写数据
% V( q( }* R" C! e# \+ j4 A - wk2168_cs_high(); //拉高cs信号
( q* d2 U( o( N9 l6 Z - return rec;
& T% a' E- G2 ]3 o - }# @( k9 \. P% F; u* |+ P9 L
- /************************wk2168_write_s_fifo***********************************/6 s. o. g% X8 n
- //函数功能:向子串口fifo写入需要发送的数据
4 A; V, l/ e/ R: @ - //参数:port:为子串口& N7 `" Y8 Y% d4 U3 y% B4 }" O
- // *dat:写入数据- ]: |3 R- Q9 J1 G0 I+ |( T. v9 l
- // num:为写入数据的个数,单次不超过2567 J2 R9 _" I$ J5 X4 \8 |
- //注意:通过该方式写入的数据,被直接写入子串口的缓存FIFO,然后被发送4 j+ f* g1 a3 Q
- //*********************************************************************/. X; P" n9 t# Y' I
- void wk2168_write_s_fifo(u8 port,u8 *dat,int num)
3 ?+ J& R, F i4 i% {5 e - {
( L3 l5 j: D2 l" j3 h - u8 cmd;
2 u% K* a$ C. L( X* y2 y2 a# n" r8 ? - int i;
$ _) b q3 V! }. ]# D - cmd=0x80|((port-1)<<4);, e/ q- a+ h, ?/ w
- if(num>0)) ~; G$ C9 n" w7 O5 x' w$ K
- {: ? r! X' \ `0 Q+ i
- wk2168_cs_low();//拉低cs信号
5 L/ X3 L, s5 D" B; G - wk2168_spi_read_write_byte(cmd); //写指令,对于指令构成见数据手册
" { W, y4 H, { - for(i=0;i<num;i++)5 Z7 n- {5 @% k/ R: @
- {
u B9 P* R2 B. W - wk2168_spi_read_write_byte( *(dat+i));//写数据
6 W7 A" g. I( g9 W7 @ - }) k6 o- S, e7 i6 s; @* `
- wk2168_cs_high();//拉高cs信号) g/ R5 I/ J; q S
- }( s, J' a% o- n5 | c/ S3 |8 L
- }: B. V( s' C! J0 w, y& c
2 `: X2 B- q. C1 g" b0 i- /************************wk2168_read_s_fifo***********************************/! [2 x0 p% s8 p2 w
- //函数功能:从子串口的fifo中读出接收到的数据
, A$ Q2 p# O$ Z) N( K1 K8 \ - //参数:port:为子串口
0 g1 ^" x/ }+ x" [( d0 Y - // *rec:接收到的数据
! F/ P/ D$ H, U7 h: N - // num:读出的数据个数。 e/ L. c) _" `0 E
- //注意:通过该方式读出子串口缓存中的数据。单次不能超过256
5 i U% a% X4 C. e8 |& L" W; f - //*********************************************************************/
1 Z# m' M, T) o3 C0 w - void wk2168_read_s_fifo(u8 port,u8 *rec,int num)
5 f5 K1 P5 Y/ w8 Z - {
, | S( x) q( H/ M/ W - u8 cmd;
! k' b; L& I# @; @ p - int n;( G* M; h, D3 H8 Q' K
- cmd=0xc0|((port-1)<<4);
2 m$ W% }# ~. x* q - if(num>0)# S6 a, l2 V! @4 R: g
- {8 Y/ j+ u8 f `/ _) i) u
- wk2168_cs_low();//拉低cs信号
. G- T5 c" d7 O$ E5 p* i, P) O1 F - wk2168_spi_read_write_byte(cmd);4 ]- w5 P9 o x5 M5 c! }4 j
- for(n=0;n<num;n++)0 p% \; L9 ~) k, @
- {
8 i) g8 c, ~5 W. c) ?3 y5 X - *(rec+n)=wk2168_spi_read_write_byte(0); 9 U& l* }% g, `$ m- @
- }
4 G$ m2 t. ], W - wk2168_cs_high();//拉高cs信号& n3 x$ i3 ^9 ]
- }; f; W5 C" ]' r* m0 v3 y a
- }! c6 w2 g8 R9 s& Y
, t/ W0 x" |; O1 w- 2 w( ]" }" f5 J+ ^6 e7 M8 S
- /*******WkInit*******************************************/9 K; A) _6 T, A' I# a% A' [0 @
- //函数功能:初始化子串口' T$ M- Y: S. U8 J( ?
- /*******************************************************/) K9 {" U3 M/ n. u, X
- void wk2168_sub_uart_init(u8 port)
1 I4 w5 z/ N: H- L$ w - {
+ X- ~* H- H5 u$ o+ P6 G5 ^ - u8 gena,grst,gier,sier,scr;
! [- F' w. Q! D- Y$ ]. w% R - //使能子串口时钟
% b5 W* F+ W/ L$ p5 a6 z2 T' @ - gena=wk2168_read_g_reg(WK2XXX_GENA);
6 D! Y3 X( D' T( I3 v5 H - gena=gena|(1<<(port-1));
! e- R7 c, \/ c1 \7 N+ n/ g) n - wk2168_write_g_reg(WK2XXX_GENA,gena);$ { ]5 e A H
- //软件复位子串口
. v6 q/ _* ?4 Z' w3 g+ r - grst=wk2168_read_g_reg(WK2XXX_GRST);8 r1 [9 @4 G. p
- grst=grst|(1<<(port-1));
; B p$ p# V7 Y% o+ z - wk2168_write_g_reg(WK2XXX_GRST,grst);) w# A+ g8 |2 |+ O' z, t
- //使能串口总中断3 c- s4 N2 D" \( E! U* ~$ _' [& J, \" o# M
- gier=wk2168_read_g_reg(WK2XXX_GIER);
* a# d) `6 [5 ~ - gier=gier|(1<<(port-1));4 a& z2 b+ ~; y8 b C8 B7 G
- wk2168_write_g_reg(WK2XXX_GIER,gier);
0 Z" d, C* l: V! e) v) l - //使能子串口接收触点中断和超时中断7 z; }8 }6 U% ~0 K9 N1 K
- sier=wk2168_read_s_reg(port,WK2XXX_SIER); # i+ b. s2 m; T
- sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
! i/ n& U/ f1 D, } - wk2168_write_s_reg(port,WK2XXX_SIER,sier);3 J6 x& D( t J3 o
- //初始化FIFO和设置固定中断触点0 @/ x6 l7 D( @) t( j: b% [
- wk2168_write_s_reg(port,WK2XXX_FCR,0XFF);
9 D) O) p+ o; I" {. ]% w4 v& x5 j - //设置任意中断触点,如果下面的设置有效, c$ ~0 n. z# g- n, r8 a- C
- //那么上面FCR寄存器中断的固定中断触点将失效
. K0 J3 x" y0 @3 F5 r - wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
. A; B- m! p! [1 `/ d - wk2168_write_s_reg(port,WK2XXX_RFTL,0X40);//设置接收触点为64个字节
& X& M/ h% R' l: Z/ Y* X - wk2168_write_s_reg(port,WK2XXX_TFTL,0X10);//设置发送触点为16个字节
2 v% O* C& g R* e; \ B - wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
7 b. j1 S3 H& G6 g - //使能子串口的发送和接收使能1 l* ~0 q/ Z* M( }" O6 k) H
- scr=wk2168_read_s_reg(port,WK2XXX_SCR); , z& ]% p9 h/ I" ~
- scr|=WK2XXX_TXEN|WK2XXX_RXEN; `2 l' p2 m" z+ \* m! R3 }5 w' D
- wk2168_write_s_reg(port,WK2XXX_SCR,scr);
/ k7 {8 e6 \1 x- v: \0 L - }5 E; g& P& ^) x. q: R
4 I- y+ [' ^& s$ g" }5 s- /******************************wk2168_sub_uart_deinit*******************************************/, {* t0 k5 L. N& B' u8 |
- //函数功能:初始化子串口4 E. O- X9 ~7 w1 \# a
- /*********************************************************************************/
" E$ Y4 H6 {+ h# p) z* d0 K8 @) o8 F - void wk2168_sub_uart_deinit(u8 port)
+ w. @+ a3 ]. H8 G( x9 k( x; s - {
9 k! I% s- k: _7 k - u8 gena,grst,gier;5 b; D+ F1 W* ~, O3 a. H
- //关闭子串口总时钟
2 F( s3 e' K" K( y - gena=wk2168_read_g_reg(WK2XXX_GENA);
% q, V+ w3 S5 U: s1 d3 D$ S) b$ G# O - gena=gena&(~(1<<(port-1)));+ j7 u2 P: c8 E) N6 x2 s+ |
- wk2168_write_g_reg(WK2XXX_GENA,gena);
2 Y W9 u! N9 I - //使能子串口总中断
( H9 B# ^# }; Z- `/ l+ @( n5 B. x - gier=wk2168_read_g_reg(WK2XXX_GIER);
" z8 x$ p! q2 I2 t/ u4 H# L( P( Y - gier=gier&(~(1<<(port-1)));
2 g& A/ A% R! ~% s - wk2168_write_g_reg(WK2XXX_GIER,gier);
9 x: L( E5 r5 k9 ]' r - //软件复位子串口' p' H8 n. ]# |: E3 F- E( x
- grst=wk2168_read_g_reg(WK2XXX_GRST);# e. s8 b" x- M) E" K. t( W# R. Y
- grst=grst|(1<<(port-1));/ a9 n8 t' f! y }0 I5 L* a6 T8 [9 y
- wk2168_write_g_reg(WK2XXX_GRST,grst);; {% D3 c- X5 C- u& m: L
-
' I" o5 e9 S4 I o* J9 x9 g - }1 f; ~# }7 y& r0 Z6 p; |; g1 m
- ~+ W, u% Y, g8 D8 Y6 b9 j" x4 P- /**************************wk2168_set_baudrate*******************************************************/
% {& N6 K; h& n! C. j - //函数功能:设置子串口波特率函数、此函数中波特率的匹配值是根据11.0592Mhz下的外部晶振计算的! G( f" s5 R$ e/ x& M, R
- // port:子串口号0 @; Y8 k, s1 j* L
- // baud:波特率大小.波特率表示方式,5 d" r5 x/ t( [
- /**************************Wk2114SetBaud*******************************************************/
9 z+ j3 ]# m0 e% B( ~ - void wk2168_set_baudrate(u8 port,enum WKBaud baud)6 a1 e* j" `) q2 Z$ R/ p
- { ! z" q( j8 ~* S% V$ P- M
- unsigned char baud1,baud0,pres,scr;2 E, |/ x0 `' M# X9 d9 ?7 @3 D
- //如下波特率相应的寄存器值,是在外部时钟为11.0592mhz的情况下计算所得,如果使用其他晶振,需要重新计算; @8 f5 f9 X8 n! Y
- switch (baud)
$ n I* d7 c0 L' p2 m+ v - {+ E& C! {0 M% z7 g) O! F: g$ O
- case B600:
9 F0 n2 a4 c) |' N" ~ - baud1=0x4;+ T6 {7 ~# Z& L6 F' T2 n
- baud0=0x7f;
% z: f; G& U+ Y& t% g4 N1 t- u - pres=0;
" l6 r$ J4 J4 k+ V, ~8 A1 z- Z+ t2 F - break;; g. z8 V# H' F2 U5 E# `* |
- case B1200:
5 ?' D, V4 b, z, \* C - baud1=0x2;% W9 q) Y& X8 a$ V( R
- baud0=0x3F;% Q) A) y. a* M
- pres=0;. \2 V8 y( t! u( V3 E
- break;! {- C" [, [! X
- case B2400:
( `; w: R. ]2 L* S* |+ f+ ? - baud1=0x1;
$ A' E8 l# H9 h. z% q - baud0=0x1f;
/ o0 y3 \ _! Z8 H, Z( H - pres=0;
& }5 Y/ R$ P5 {: M8 S6 d - break;: Y0 c9 n0 |: T$ A1 x7 I
- case B4800:
) _9 y) B. U, W+ v6 J% _; y6 s - baud1=0x00;
- |7 E; I& x" ? - baud0=0x8f; P6 |* N2 Q* ~$ u! ]! I
- pres=0;( O4 g5 M* ~" L. q. c8 X
- break;
! L7 c1 `9 ~' h. y6 X - case B9600:
/ G5 o- o, i) I: P! l$ h - baud1=0x00;
; C" N+ B' d8 X# n" f N - baud0=0x47;
, E6 I" h- G, ` - pres=0;
6 X! ~8 C1 j! Z* {9 B5 m0 W' j - break; ]7 V( Q m& l. ^" W' c
- case B19200:
( }) e# P- X2 d/ Y7 z5 ` - baud1=0x00;
9 ]$ I6 m9 p0 I, S - baud0=0x23;6 _ z% E, I u$ c' n
- pres=0;
9 K5 n7 O& }1 P% I5 \ - break;
, X$ l5 v/ E8 C" m A5 |% A - case B38400:
9 o5 P& S7 h) h; b* k - baud1=0x00;
( ]* C v, b* i) W. H' o, t6 @ - baud0=0x11;- @6 ~' f! Q* [% u) W* w
- pres=0;
- n; g) y( ?) Q* i! Q- ? - break;/ y4 ~! A5 M+ w0 m
- case B76800:/ Y* c0 o: l+ i$ u% `% Q/ i, @
- baud1=0x00;
, V& R. }+ _, N: {3 N - baud0=0x08;6 L9 M- P* u4 v$ S' D* w3 o( P% }
- pres=0;
+ s7 G4 k- y0 L5 } - break; ! i3 D0 m, c6 X. \6 W
- case B1800:, @, h, s2 q: a8 Q
- baud1=0x01;. J+ H' o% X* S& L" q# I" B Z! K! v
- baud0=0x7f;+ H0 x; L$ i8 L
- pres=0;
- `, O6 ], j1 [ - break;, y9 k' a9 P" A) B e+ j: c$ n
- case B3600:) L9 b. X4 l/ E4 Z6 [7 }
- baud1=0x00;
( P# \7 ~8 y% ~5 l - baud0=0xbf;
# F" q: Z8 i; U2 w# } - pres=0;+ L9 M* V' E. C3 m* v3 u @$ A
- break;
3 U" C4 z8 M4 _+ X F - case B7200:
- [9 b) j5 ^! v - baud1=0x00;
$ a1 z6 T/ F3 ] J0 i- q/ o4 \ - baud0=0x5f;
! D# \: Y }: e& F; ^ - pres=0;
9 N" |7 U$ C; `3 B1 C1 r - break;* a6 T, u- j# ^6 J
- case B14400:0 Z( L: ? |$ `7 e3 y; c. s) ^& e' F
- baud1=0x00;! y) }% B8 @/ W1 \9 H7 z
- baud0=0x2f; X1 V& x; M$ h% o1 S( ?
- pres=0;4 O) n* Z# p& p2 i/ `9 z
- break;
- B1 n' @! G; e e! l8 [% G$ C - case B28800:' ~8 O+ d4 e ^' L% \5 |/ x
- baud1=0x00;
3 C' K5 s9 ^, P: k" W6 C, Y7 x - baud0=0x17;& r: I2 _" L$ n+ D0 U
- pres=0;
( k7 I2 @# k9 e: @* i1 `9 K$ X - break;6 S- Y. v/ p) `) a2 d2 r7 I1 S
- case B57600:$ Y6 s9 C7 i& q8 `5 v( K+ A G
- baud1=0x00;% }! M- i- u, z
- baud0=0x0b;- T/ @* K6 s" f& C3 U5 E# |
- pres=0;
0 R x: _, X3 t- B/ c - break;
: G( N+ h/ \# A+ r d0 s" v& m! a - case B115200:8 @% X) N$ x r N1 M5 d' e
- baud1=0x00;7 Q$ ^( @) S* |3 T: M+ E' x
- baud0=0x05;( O4 M: J5 ]. ~0 Q5 v
- pres=0;
6 L+ L: K1 y# X1 j0 \4 ] - break;# G" ~7 k& h, P
- case B230400:: a) s! E/ }/ M& H) N
- baud1=0x00;
& P4 r/ N* `7 F - baud0=0x02;5 ~# t+ ?( B( l* z
- pres=0;
8 |% _0 `) l# {2 o: S - break;
/ O/ d5 ^" d, L7 x - default:
, Y) b7 ~/ l- `' l( Z! q - baud1=0x00;3 [6 S! ]! M/ b* j. j. n
- baud0=0x00;8 V) Q# k2 y5 v, h( |0 G
- pres=0;
8 p1 m+ m" {$ F, l! |0 R+ b l- P( ` - }
, j4 ]+ m v7 ?5 p2 J5 w1 H - //关掉子串口收发使能5 g4 i4 J6 F y' n- d
- scr=wk2168_read_s_reg(port,WK2XXX_SCR); * _! ~; _) Q3 A* @( Q, p
- wk2168_write_s_reg(port,WK2XXX_SCR,0);
. b& f) d' z1 m$ K0 L/ ]9 ] - //设置波特率相关寄存器
3 M. u4 j& K7 q* d0 h2 | - wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
/ c% z$ J- R* f- `0 e6 K - wk2168_write_s_reg(port,WK2XXX_BAUD1,baud1);8 }) `" P3 M, B) }1 j6 ^6 [. N
- wk2168_write_s_reg(port,WK2XXX_BAUD0,baud0);
0 c. _: i4 l& G/ b$ M7 O - wk2168_write_s_reg(port,WK2XXX_PRES,pres);
/ X# k4 d+ w, \9 @2 r8 E7 R* {9 k - wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
9 `1 }* W, ], K t0 V+ _* X: k - //使能子串口收发使能
% j; U$ E, T) c4 Q( ] - wk2168_write_s_reg(port,WK2XXX_SCR,scr);* i4 P, P' j! d' j, l3 G' e" P$ S
- }+ }1 b' k% [) \- A3 L/ `8 S
- /**************************wk2168_get_tx_len*******************************************/
: {: u" E" _4 [% Z' R: y9 S - //函数功能:获取子串口发送FIFO剩余空间长度. |3 A. K. D* F9 z# u& f& ?
- // port:端口号3 E' P; ?. p9 b% A" `+ x) V; v' E! J
- // 返回值:发送FIFO剩余空间长度: F8 P0 j% d1 M4 A6 h
- /**************************WK_Len********************************************/
" ^# i; L( e4 _* h - int wk2168_get_tx_len(u8 port). X! D J; U* ^! n* P- ~
- {+ y5 F# e6 s1 w! Y$ g3 J
- u8 fsr,tfcnt;# k6 [: G# e0 }# Y: Z3 v4 X) {' S
- int len=0;; p* [ p3 u5 D% B, g( O* Q6 \
- fsr =wk2168_read_s_reg(port,WK2XXX_FSR);
) A3 a5 x: J/ w8 H9 }8 s' g$ ` - tfcnt=wk2168_read_s_reg(port,WK2XXX_TFCNT);
* C U4 M- l7 u0 z5 | - if(fsr& WK2XXX_TFULL)
' G# |3 f1 Z: z1 R, p. { - {
, H' _+ O8 X( x/ U - len=0;$ y* I( m8 L) O/ \, n: Y
- }
8 l1 V7 G* F. q! ^4 r - else
: ]! \% j$ c1 F8 p% C2 C/ ?: I - {% q9 `5 h& E& b1 H5 @
- len=256-tfcnt;
; e8 T( y- b5 j3 `& O - }/ i7 e/ j& G5 |5 p% _8 v
- return len;
8 z. W, N! V( D' d6 e, U - }9 ]6 i8 i* I: k
- + }1 r* f* Q! L4 N3 T
- /**************************wk2168_send_data*******************************************/
& m8 |1 y9 M0 R, x& U - //函数功能:通过子串口发送固定长度数据
# q* D. v3 t$ Q, v4 E4 c2 u$ @ - // port:端口号( |9 {7 @/ m& V8 ]4 x6 s
- // len:单次发送长度不超过256. `0 b5 N v" X
- // 0 `1 G* d V. j+ n
- /**************************wk2168_send_data********************************************/
: ~. L: W; i K4 m( c - int wk2168_send_data(u8 port,int len,u8 *sendbuf)* w5 L$ F* a4 f: D I1 ?
- {
( ~) @ G4 g/ x7 i" b$ q -
p8 U9 e# E5 l! S4 r3 m - #if 1 m/ ]% O% q8 n) u0 {/ [
- wk2168_write_s_fifo(port,sendbuf,len);//通过fifo方式发送数据9 V9 z7 |# U# g( v
- #else
) m: Y0 M" M) S# E - int num=len;+ @! |9 a# N" N0 ]0 [7 ]
- for(num=0;num<len;num++)
& |. G1 w3 X; p, q - {
0 J! y, d: ?$ R; p. j [ - wk2168_write_s_reg(port,WK2XXX_FDAT,*(sendbuf+num));
2 _$ z% [5 R4 g - }: ?3 j& `2 W" S3 c4 ^/ R
- #endif 0 j7 k3 g, }: }6 A6 a: J" p
- return 0;
1 |3 x5 r& {1 i( x k0 I2 b) P - }
% a) o2 f( X- X8 B! ` - ; p; d9 _/ o7 |( [! j9 y+ w/ g
- /**************************wk2168_rec_data*******************************************/
' g1 {7 w( X5 S2 @5 w" S - //函数功能:读取子串口fifo中的数据
5 @$ M. W- K9 }- S5 G5 c$ M9 F - // port:端口号5 a3 Y4 n# |+ y3 s
- // recbuf:接收到的数据
8 \" }. Q) c$ D5 e9 K2 h0 } - // 返回值:接收数据的长度
9 P: ]' X; R0 S' y5 H9 I - /**************************wk2168_rec_data********************************************/
+ A0 `9 A- x# ~: K - int wk2168_rec_data(u8 port,u8 *recbuf)" a5 Q9 K+ K) O; w; G; J& V/ {$ y% P
- {
1 U# H* K9 h2 | c' Y+ | - u8 fsr=0,rfcnt=0,rfcnt2=0,sifr=0;
! |9 B/ |& x$ _0 b1 ^' `6 H - int len=0;
: D+ N) L% Y/ t& V1 q - sifr=wk2168_read_s_reg(port,WK2XXX_SIFR);4 ^& r! u, a8 t6 {$ S* v
- ~+ |: I6 J$ i. Z6 t, u
- $ f2 D" g7 m7 V9 }) {0 W. T
- if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中断和接收超时中断
6 `+ w& I8 U/ R8 F# s# l - { ' Y- [+ k. @, ]0 g
- fsr =wk2168_read_s_reg(port,WK2XXX_FSR);" [ G8 Y C% w" X2 K) m4 Y# e8 Q
- rfcnt=wk2168_read_s_reg(port,WK2XXX_RFCNT);
' x" l/ T {8 k; l, i - rfcnt2=wk2168_read_s_reg(port,WK2XXX_RFCNT);% T9 F* d/ o' C" ` w( p; U/ s
- //printf("rfcnt=0x%x.\n",rfcnt);- Z2 t7 Z( n' M) R* ~6 E, h
- /*判断fifo中数据个数*/; y! T) S1 A( b: E' t& O e
- if(fsr& WK2XXX_RDAT)
2 l% J: ]( E. V6 {* j' W - {
/ F* i3 {' C8 M4 ? - if(!(rfcnt2>=rfcnt))/ A/ ^+ |* c4 g
- {
7 ?3 K9 _: I; s0 C- }% n s; H6 u - rfcnt=rfcnt2;$ [. e( u5 \7 e/ q
- }3 x4 i& `$ X7 b5 N# [0 m5 k7 J
- len=(rfcnt==0)?256:rfcnt;
" ^4 t% O: _* h - }7 Y5 G. z$ T3 N9 l2 z) ?- Y
- #if 17 s4 H9 I6 k/ F7 y0 I
- wk2168_read_s_fifo(port,recbuf,len);9 L: H! c7 v( b) d8 Q& [
- #else* M7 e+ F: i6 f( V, R+ D
- for(n=0;n<len;n++)
' S1 Q2 e3 q/ m$ v. X - *(recbuf+n)=wk2168_read_s_reg(port,WK2XXX_FDAT);7 N9 ~8 b9 u) {2 g- A
- #endif
( Y. ?9 g7 p4 Z* R+ _9 h - return len;, c# V) b* O W: j& X+ z& l
- }
2 v) B) c/ g/ \% W0 a, K4 k9 \ - else
: l' S8 C( Z n: d, X& t8 c - {
! T, e, |$ W( \5 f7 w5 ~ - len=0;
& ~/ [; A0 {5 [) n9 P) D- k, _! L - return len;+ t( c e d# q6 b/ o& j$ K& I- T
- }+ |; }# u$ `/ S+ q F3 r
- }
3 _; |1 [# ` k1 m
) Z0 e8 Q5 w' l/ v# @- /**************************wk2168_set_rs485*******************************************************/5 ]0 X5 O% v- w6 L. \* ?
- //函数功能:设置子串口RS485的收发转换函数,使用RTS引脚控制485电平转换芯片的收发# W) o) X1 D/ L
- // port:子串口号
# r$ c9 {+ U' \# r" f5 Q* v/ ]' c - //
+ M' Y" G% \9 d( i! p: _2 G: B! H - //注意:只有WK2168/WK2204支持该功能
. ]+ a% N5 Z2 Y5 ^ - /**************************wk2168_set_rs485*******************************************************/
! o7 a/ s1 y# V4 E _8 g+ W* j - void wk2168_set_rs485(u8 port)& N4 z" Q$ j1 ~/ D7 W
- { - P: T: { r. t
- wk2168_write_s_reg(port,WK2XXX_RS485,0x02);//
4 p0 X8 W$ G* p: y - //wk2168_write_s_reg(port,WK2XXX_RS485,0x03);//" y) j" O8 m( m) Y5 l* e
- wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
; u X3 Q$ b9 n8 S: k - wk2168_write_s_reg(port,WK2XXX_RTSDLY,0x01);
- Y5 s7 R2 K$ o, i; d - wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 3 M; L c3 m# s+ ^' g) h
- }7 ]7 w! |' d$ a, x8 _) ^- N
- /**************************wk2168_rts_cts*******************************************************/) e! Z: S. V7 f) _& Y
- //函数功能:硬件自动流量控制,需要子设备的支持" ?( t$ f8 ~6 f" J) |
- // port:子串口号% c: v5 T# G, `% A8 I
- // 7 f) T) O7 a. G( N& F* o9 F
- //注意:只有WK2168/WK2204支持该功能8 j0 @" f# e& e$ D7 `$ Z6 K8 `
- /**************************wk2168_rts_cts*******************************************************/
" u t `7 i& `' T1 b$ W - void wk2168_rts_cts(u8 port); y# }3 ]) I A7 }' j. i
- { ' x8 `0 V2 _- \) D, ^) x1 h" E
- wk2168_write_s_reg(port,WK2XXX_FWCR,0x30);//
3 \: X# [! u9 [" }$ A3 Q - wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
; f* Q3 H1 a5 m+ F. F - wk2168_write_s_reg(port,WK2XXX_FWTH,0XF0);//停止接收触点
. i, Z& M6 n3 p; W6 C [9 D% F - wk2168_write_s_reg(port,WK2XXX_FWTL,0X20);//继续接收触点3 h# D/ H( E7 n2 b* L. l
- wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 & d# | q, w- y9 M2 Z9 [9 A
- }
; W" _1 K1 S/ \8 l8 ~
: l5 {4 {7 Z9 ]! }! L9 B2 b+ D* E- 0 u1 V: H& @+ D
- ! z% E# }4 X: N; C6 i! V
复制代码 9 T. }: ^# M3 T x
6 B+ W6 f4 U, W$ R# b7 T
|