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