你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动WK2168串口扩展芯片完整教程

[复制链接]
STMCU小助手 发布时间:2022-4-20 20:34
一、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
20210413134012387.jpg
4 G! z4 w* f8 N$ V3 ~0 x
9 \) E4 T# Y* ?9 P 20210413134020902.jpg ' [( 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
  1. #include "sys.h"
    9 q- V3 b$ ~, _0 A, _! T- A9 [
  2. #include "delay.h"
    & x' F; M! u: `/ z2 x2 }
  3. #include "usart.h"
    $ v/ x  T3 W2 l% d# v- n
  4. #include "led.h" # ?/ t1 u, a0 t1 M2 X
  5. #include "wk2168.h"0 |5 D4 a* P+ o; t# }2 D: ?5 D
  6. $ T+ m, w  C* }( Q: E9 X
  7. / I8 ^, T4 k8 Q/ t5 ~0 L

  8. . H2 c6 c% \; J6 I
  9. ' U7 s  f, @, u2 U) G" V; k5 O! h2 S
  10. , W% q. o4 v4 X& w: S, T
  11. int main(void)+ Q- |5 E" i5 M$ L3 r' `4 c* P
  12. {        
    # i3 _( _& a2 G1 \, ~8 E4 L6 O
  13.         //wk2xxx相关定义+ y& F4 g1 {; c; V0 h- T: V5 s
  14.         u8 sendTimeCnt;6 E4 Y5 e1 z. _5 n) h/ Q: e+ H9 F* \
  15.         u16 ledCnt;" p( K  ~5 _1 v2 P6 M, f
  16.         u8 dat1;
    1 Q) h* b& D4 j) Y, G+ d3 F( J7 X
  17.         u8 sendData[5]={0x01,0x02,0x03,0x04,0x05};9 G: I7 g; f# Q  V- S# M+ h+ e
  18.         4 j; y+ |) Y  Q# V
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    6 U' Y$ J( S  y9 u/ N6 b0 I5 ^* G  {
  20.         delay_init();        
    . H8 r* S; h4 r# h" E& E4 O% B
  21.         uart_init(115200);
    0 q% f8 w2 T9 L6 ~& P
  22.         led_init();        $ |- }: a, d4 C2 W! a
  23.         wk2168_init();        
    - H8 b8 [0 i. S/ P9 d: w
  24.         wk2168_exit_init();; h+ U: M; B+ A4 H7 V: y
  25. / j/ G& p4 K, n3 x
  26. /*读写GNEA,测试主接口通信是否成功*/2 w; w- W  ]+ w- W
  27.         dat1=wk2168_read_g_reg(WK2XXX_GENA);3 ?6 Y. C1 {, ~  \7 ]' [* W
  28.         printf("gena=0x%x.\r\n",dat1);/ U# t7 i6 [, K  {4 J4 e) t  A

  29. 6 M) O7 K6 h% k$ `+ b. x! x
  30. 3 i1 k) t2 M6 q; a
  31.         /*初始化子串口*/' h5 y' c# |6 I( q( ]1 r. B
  32.         wk2168_sub_uart_init(1);- I. i" A& U, N, {6 y) X0 h
  33.         wk2168_sub_uart_init(2);
    ! n+ h4 L3 B' f) L: T9 n! ~7 W! ^0 }
  34.         wk2168_sub_uart_init(3);
    ; C6 k" s6 i2 \& U. G2 ]+ H
  35.         wk2168_sub_uart_init(4);6 Z/ X0 B/ O/ t/ u
  36.         /*设置子串口波特率*/0 s5 q7 Y% Q9 P% F5 C- ~2 v$ Y
  37.         wk2168_set_baudrate(1,B9600);' \; `/ e6 W6 _$ ^
  38.         wk2168_set_baudrate(2,B9600);, Z9 i* e# E$ n2 n
  39.         wk2168_set_baudrate(3,B9600);9 h! K* M% u+ Y: h& s7 T
  40.         wk2168_set_baudrate(4,B9600);
    4 B3 J; ~) D# t  b& w, F, K
  41.         /*使能485*/0 H! C8 J. F) u% ?: i! a
  42.         wk2168_set_rs485(1);
    3 S( b& \: N; \8 p- P0 ]
  43.         wk2168_set_rs485(2);3 c, g4 }4 u+ q# G# `$ ]
  44.         wk2168_set_rs485(3);6 C/ T2 }; h+ k
  45.         wk2168_set_rs485(4);& Q$ c' H& M& Z. X1 g/ n) U

  46.   B5 N' @& U. t4 h
  47.         
    ) n$ ?! i7 L6 P
  48.         while(1)+ _" I4 A/ e; X6 a$ d: D# l* J% y
  49.         {8 ^3 h( @( L9 ]* t5 J$ ~
  50.                
    9 o" K6 `, f% e5 ~: ?+ ?4 ]9 U; W
  51.                 sendTimeCnt++;% E, P9 a. ~6 C. @; b
  52.                 if(sendTimeCnt>=100)9 H1 P4 j- @3 d/ @& Y1 G
  53.                 {
    ! p9 l0 ^. w9 l; n9 l$ M3 H1 Y. K
  54.                         sendTimeCnt=0;/ z& A) |! `1 C2 s1 n; Y
  55.                         wk2168_exti_disable();               
    4 B+ j+ N7 f* d
  56.                         wk2168_write_s_fifo(1,sendData,sizeof(sendData));
    % Y( K; U* W6 L# z3 k
  57.                         wk2168_write_s_fifo(2,sendData,sizeof(sendData));1 w3 U; p9 g7 N3 [6 c
  58.                         wk2168_write_s_fifo(3,sendData,sizeof(sendData));9 y/ ]  |7 I/ e9 ]8 f
  59.                         wk2168_write_s_fifo(4,sendData,sizeof(sendData));2 t$ ~8 A/ r8 T) R. ~; L/ H9 s& ?" n
  60.                         wk2168_exti_enable();                                
    1 q- d; K1 [6 x# z0 I
  61.                         
    # h" _, B3 Q& t0 w
  62.                 }5 h2 q. P# h4 p: {$ K
  63.         % r8 X) @1 T  L# e7 B( u
  64.                
    / |7 i$ o1 Y" Q& a3 h' C& t
  65.                 ledCnt++;8 S  M% m* v+ q( B! I( _4 k1 j
  66.                 if(ledCnt>=50)% w# C! l$ h  T4 @/ I/ g/ V. C
  67.                 {
    ; o# M3 k% _) v1 \# ~) M2 P8 L7 u% m
  68.                         ledCnt=0;
    6 _3 V" r9 H; {
  69.                         turn_prog_led();. g! U9 }# D7 J% W
  70.                 }* W" Y( c  ]' S/ |5 w7 O5 _* L8 e
  71.                 ' z; w. q6 `& d; S7 N- y
  72.                 delay_ms(10);
    ; E) u- B6 h4 ~( _& s
  73.         }
    ; J7 Q$ b2 B# ^4 N% d1 M
  74. }
    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
  1. #include "wk2168.h"+ X6 ?# {* w8 I. p! z( ?$ ~
  2. #include "delay.h") z: O2 ]7 N& c3 X$ }
  3. % H) A0 b7 t. M/ T* `' j
  4. 5 f: H' c5 N  T9 k5 m$ X  W
  5. void wk2168_init(void)
    + q7 P( Y0 o3 b, |. F
  6. {$ `' `% \- B) O2 e: ]3 L3 g
  7.         GPIO_InitTypeDef GPIO_InitStructure;
    3 T+ u: ]$ M/ R* I, S
  8.         SPI_InitTypeDef SPI_InitStructure;2 x# r$ a2 p# L; R: t: U1 v
  9.         
    ! Y! a3 A, ~+ B' M; p% ]& J5 x
  10.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE );        
    - t3 H% Q" d9 ?0 k
  11.         
    ) [/ ]: E  p, _, a. ?/ f
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA0--INT#2 ~0 U! [+ u6 \) F# e
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        
    2 [5 }6 a9 K, r3 [8 e& U
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        ! o# X! |0 B+ j1 |! J4 c
  15.         GPIO_Init( GPIOB, &GPIO_InitStructure );/ |1 {0 }' c: J7 \/ u/ e
  16.         9 @1 d/ M  V# z5 h9 P
  17.         
    / j* Y. Y1 V2 s: k; P: q2 Q
  18.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//SPI1_RST
    % k0 r' b& ~. b' l$ ?% w; [8 B# I1 z- `
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
    $ R- i7 }. q( t% A0 V
  20.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
    " K! c9 S! T( B) K! S
  21.         GPIO_Init( GPIOB, &GPIO_InitStructure );' Y( ]6 E; G7 e) q/ S1 _
  22.         GPIO_SetBits(GPIOB,GPIO_Pin_0);
    : j/ J  ?. J; ?. F
  23.         
    6 u9 W8 R6 r8 g/ @% N
  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI1_CS
    , ^$ U5 z; J; j4 L2 o
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
    0 `- m5 b8 u9 H& }* I5 Y7 Z, S; K; a
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        0 {" p6 S5 o5 Y+ g# q( \
  27.         GPIO_Init( GPIOA, &GPIO_InitStructure );
    ; O) B7 H7 v1 O; n! k) X
  28.         GPIO_SetBits(GPIOA,GPIO_Pin_4);
      ~; y8 i  |* V- _2 o5 l
  29.         
    5 V$ J% h- f# V+ Y& y6 V/ |
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//SPI1_SCK4 X2 e! X0 @" {
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
    + U  H: u. B# p- x6 y
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" w$ {% u9 [; L' s7 O( G
  33.         GPIO_Init( GPIOA, &GPIO_InitStructure );        
    3 U+ D+ {" d, B

  34. - L  A- W. h' Y% o: \% u' u8 n
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//SPI1_MISO
    ) p- w8 k  t$ N4 I# J. p' m
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                5 |! T# }2 r# Q( y" i; M
  37.         GPIO_Init( GPIOA, &GPIO_InitStructure );        ( R' q8 N5 S4 W. J& D2 ]/ G: l
  38.           |0 ~, T& C3 O: `7 ~  @6 O
  39.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//SPI1_MOSI; A% Z( ]+ Y9 b
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                2 |, g3 H* v. y3 O( C( j) P
  41.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    % Y  }) _4 y- H7 i$ a
  42.         GPIO_Init( GPIOA, &GPIO_InitStructure );
    - S* d* u" ]* E% \' I; x
  43.         4 G6 C/ [, ^8 \- X
  44.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        : w4 V3 p) U# x+ w8 J# t
  45.         
    " ^$ L  b6 G- D
  46.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        , M; f. \* F: b- H& m. S
  47. + d) V" c  [3 V
  48.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        
    : d! @% ~' w% ^! V% M9 H. J- U6 y/ R/ q
  49.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        
    3 I' A8 _0 X; p8 [
  50.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        
    ) Y. o8 N0 J" e$ h6 a; p
  51.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        
    ) [. |" @9 h+ e
  52.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    & p& l- X0 @5 m' T6 w
  53.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        
    4 X, g) O6 G; i5 D3 M
  54.         SPI_InitStructure.SPI_CRCPolynomial = 7;' o0 l+ a: c; o
  55.         SPI_Init( SPI1, &SPI_InitStructure );
    ) y4 \1 G% w3 I8 A/ T

  56. 1 {% ?4 ^5 y  ]4 q
  57.         SPI_Cmd( SPI1, ENABLE );( a1 L6 {% Z7 E9 }1 d' w+ a
  58.         2 e! I: s' M' z) }) S7 X' G$ Z
  59. . F' L. p3 u! S6 ?5 j4 Y$ W. I
  60.         wk2168_rst=0;
    1 ]/ y( {% B" j5 V9 @* s; J
  61.         delay_ms(50);) }6 C- y9 R- m
  62.         wk2168_rst=1;
    & _9 U& E* C, u- a( o$ C; ^  k
  63.         delay_ms(10);8 ]$ u; U; O8 c5 B! G
  64.         . w- e- Q) k/ C2 P( z3 i
  65. }
    3 Q4 ~9 C3 j, F/ f1 J4 S4 K8 c$ S
  66. 2 `+ Z) ?# D3 _8 S/ k/ A- ]
  67. void wk2168_exit_init()
    - N# Q7 g, G0 [3 L: D
  68. {
    9 c! h  I! S- ]- P2 a. {8 D
  69.          EXTI_InitTypeDef EXTI_InitStructure;4 z8 ^; T% X* G: G4 S8 m8 \" N
  70.          NVIC_InitTypeDef NVIC_InitStructure;
    7 M, r- l& n+ a) h3 C- y( ^

  71. # C. T3 N# G; Q
  72.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
    8 Z% x- Y( u7 k7 V9 z% J$ J! ?
  73. 4 I7 W/ Z0 J$ Q$ P* i) }

  74. 8 W1 V. C5 u  a- P- g, \8 [* }
  75.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//下降沿触发; v1 ~0 z4 W3 v! _  ?6 \1 H4 b: n

  76. 2 g6 ~" r2 p. Q3 M2 k- f
  77.           EXTI_InitStructure.EXTI_Line=EXTI_Line1;        
      J+ O2 p' B$ K$ G4 V+ O
  78.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        ) S( p) R5 S  @* y1 j
  79.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;% ~$ F4 M5 E/ F; n. }- ~0 L
  80.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    2 B: y& y5 r+ r
  81.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    , X) U+ ~4 {: _6 E" k# [6 p, g

  82. 4 u# ~( N. _4 i* G! V1 N8 \; K3 [
  83.     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
    ! v$ p2 K  i9 I* z: G
  84.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2, " v8 ~/ ~) ]- c4 R7 ^
  85.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级2
    0 A6 v5 y/ }6 X
  86.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道0 W7 |. a5 f7 u, I9 K
  87.           NVIC_Init(&NVIC_InitStructure);        
    . F3 q4 \* [4 P
  88. }
    5 a( N) E% e4 y1 s7 q% `4 [" t
  89. void wk2168_exti_enable(void)! y6 K1 A9 P9 H/ m- W1 o' o1 L( M0 p
  90. {
    " B& a! C; E" w4 `, d& w6 i
  91.         NVIC_InitTypeDef NVIC_InitStructure;7 [$ A4 E) z0 B. d7 R8 m5 y
  92.         5 T6 F8 `$ D9 |2 a, {
  93.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
    & @! n; S" r9 |7 J8 Q
  94.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级2,
    5 w4 }0 W* E& X8 w
  95.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级2
    # v% P, ^. D, d7 t3 P' ]  `
  96.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道* o/ W: d; x1 q8 G. O
  97.           NVIC_Init(&NVIC_InitStructure);
    8 M8 H, H9 f* l7 W* X$ y
  98. }% S% S' x1 O9 B9 F; i7 _) n

  99. ' ~5 }) f( I  T, @+ J* r; l; e! V
  100. void wk2168_exti_disable(void)
    : Y! Z, I0 F" @* S  v% }$ z
  101. {
    5 N9 p1 [/ x, z; b8 y) E5 J
  102.         NVIC_InitTypeDef NVIC_InitStructure;: @+ @( }; X. U5 F
  103.         + e( C% [+ }& R$ w
  104.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
    ) v/ r; `0 ]/ n3 e# w% _
  105.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级2,
    % l$ d% X6 M2 h: U: w! H
  106.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级2
    6 B+ J7 V7 S8 x- x$ D# y
  107.           NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;                                                                //使能外部中断通道7 s/ f& n7 n, g2 [
  108.           NVIC_Init(&NVIC_InitStructure);
    ) B& @& x. x( B* N" G* y& H
  109. }
    # S' E9 V/ Q' [; ]7 U% ]$ a7 |3 g
  110. //外部中断0服务程序 + f$ w5 i; u) M7 \
  111. void EXTI1_IRQHandler(void)- A/ S3 x- m3 \1 B, L
  112. {6 C, ^5 g5 T& w6 R
  113.         u8 gifr,rxbuf[256];
    - v: p1 j7 _& E  }) e" b2 z
  114.         int rxlen;        / |! ?  L1 C5 t8 H% P
  115.         if(EXTI_GetFlagStatus(EXTI_Line1)!= RESET)) g; `- _2 W* t
  116.         {2 t3 _6 ^0 l% X& A. ^) s) }$ `
  117.                 gifr=wk2168_read_g_reg(WK2XXX_GIFR);/**/
    - w7 H0 N5 u" c; d- ^$ Y4 j
  118.                 do{
    2 T9 V) S% m+ _; x8 T7 R5 X2 ]
  119.                         if(gifr&WK2XXX_UT1INT)//判断子串口1是否有中断! x/ n' e6 L) b+ T
  120.                         {
    ' a0 I( l( n# c0 @4 w3 ?
  121.                                 /*数据处理*/  N" m6 f7 A' d1 _, n% P" [8 z  v& h
  122.                                 /*数据接收*/
    ! [; D2 R; }4 O# F# F
  123.                                 rxlen=wk2168_rec_data(1,rxbuf);//一次接收的数据不会超过256Byte
    / t! G$ N. j. N. W" ?6 O4 v
  124.                                 /*数据发送*/2 H# l& R  C/ D; |* z# G. w6 {. \' F
  125.                                 //把接收的数据发送出去, v0 q' u6 q$ B/ T# r
  126.                                 wk2168_send_data(1,rxlen,rxbuf);
    2 _3 J; b& U: O7 b

  127. 9 ~3 T# v2 Q3 R3 G7 X
  128.                         }
    ! k8 N6 X. k8 F, J: G* A
  129.                         : L& }, s1 `/ b6 ^
  130.                         if(gifr&WK2XXX_UT2INT)//判断子串口2是否有中断7 `, B0 z" l- v
  131.                         {
    ; Y" i3 D0 R: @8 i3 L
  132.                                 /*数据接收*/
    & B2 }3 o" z$ _6 O3 A$ f, @
  133.                                 rxlen=wk2168_rec_data(2,rxbuf);//一次接收的数据不会超过256Byte; G# |& Z& A- f9 z6 m$ g
  134.                                 /*数据发送*/& e+ H/ a  W: d8 V% q  Y
  135.                                 //把接收的数据发送出去
    - p: _: V' a0 M  l! T) U, Q
  136.                                 wk2168_send_data(2,rxlen,rxbuf);# Q( R# a; D: N8 c( D2 `2 \# L
  137.                         
    : s# _% Z7 b- l6 s
  138.                           }
    1 B+ R, W: f+ l+ K9 J6 r: V
  139.                         if(gifr&WK2XXX_UT3INT)//判断子串口3是否有中断
    2 E+ p  w' p  o' p$ p5 [* d$ h
  140.                         {
    - ?7 [# W1 i% H+ A; h
  141.                                 /*数据接收*/, ~2 K) D8 F/ f! n' D
  142.                                 rxlen=wk2168_rec_data(3,rxbuf);//一次接收的数据不会超过256Byte
    6 W5 `" t! {+ Z0 {) O/ }4 }4 ], N
  143.                                 /*数据发送*/$ u* \- P) `: M" w1 C
  144.                                 //把接收的数据发送出去
    8 @0 o* Q% \' V$ E: _
  145.                                 wk2168_send_data(3,rxlen,rxbuf);
    . o% m( A; e, R) ?5 Z/ k/ ~
  146.                                 // printf("port!!!!\n");" _7 C/ x# Q0 F# g2 P
  147.                         }; D  I9 T" r6 u7 P8 {4 {  n" g
  148.                         if(gifr&WK2XXX_UT4INT)//判断子串口4是否有中断
    % c: |8 U; G9 E% E( |
  149.                         {' a3 y3 A$ o; Y+ \% [
  150.                                 /*数据接收*/
    ( C9 T& e$ `3 K, r2 j
  151.                                 rxlen=wk2168_rec_data(4,rxbuf);//一次接收的数据不会超过256Byte  ]' [; Q4 o  I2 S7 l! H9 D+ `
  152.                                 /*数据发送*/
    1 m9 _" N' q! k, @2 o
  153.                                 //把接收的数据发送出去8 a! o; O4 {3 V2 Y, U2 q8 `
  154.                                 wk2168_send_data(4,rxlen,rxbuf);
    8 k+ m1 @5 C; W4 e" }; F, p
  155.                         }
    ! |4 V7 L1 f: q9 Z- ^3 \4 Q
  156.                         / h3 X/ W4 a5 E: m" o
  157.                         gifr=wk2168_read_g_reg(WK2XXX_GIFR);
    6 w1 i! d6 u* h( B, }$ G
  158.                         //printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);
    : I- `- T% l* S# D' o; J
  159.                 }while(gifr&0x0f);                                        8 z" i& R7 f  a7 X0 v- \7 _7 R# Q$ |
  160.                 EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE0上的中断标志位  9 h5 D. K2 X% }% }
  161.         }
    , ?5 E1 ^! K5 [" K
  162. }9 f7 O( a, b" |% D7 y7 s# @* r
  163. /* SPI交换一个字节接口 */" m4 q, V1 V2 N' P1 n" y' Q
  164. u8 wk2168_spi_read_write_byte(u8 TxData)" a! S* O/ B' G. u: U6 X
  165. {
    % Y6 x+ P( E6 f( A8 D( J
  166.         u8 retry=0;                                         
    # R) ^& e: Q. Y$ u. ]. k' z
  167.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
    0 h6 |9 k! Y% f
  168.         {
    ( s- b6 X  o3 [. S9 A& R. E* N
  169.                 retry++;4 C  d- {$ _% n/ G& {1 F
  170.                 if(retry>200)return 0;
    / j, {; }9 q/ Q
  171.         }                          
    # l9 t+ t" q0 x$ e3 n) L( d
  172.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
    " A* p  x2 p3 S6 u7 R+ z
  173.         retry=0;
    $ t4 U, L" T+ l; H; i1 j
  174. . g5 q# a% p% ]4 W7 q
  175.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位& F* p% i% a% @( v0 M
  176.         {/ q6 V! P& g3 M" t
  177.                 retry++;" ?  {. N: F4 Z0 z) Y- ]
  178.                 if(retry>200)return 0;4 \1 {6 k. l" `+ {* P* r
  179.         }                                                              
    % N" x9 R8 J2 m( f6 S' P9 \
  180.         return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据        
    1 l5 T7 p9 ?% _, h& D
  181. }
    $ l1 b4 p3 l) @- c

  182. 3 r( G& p- F. k) P  U8 R5 j' g9 a
  183. /*************************************************************************/
    - e* {! K+ N9 U+ }% j/ |# I
  184. //函数功能:设置CS信号为高电平
    % y# i0 B7 S, E! m/ d6 J: i8 A
  185. /*************************************************************************/
    % d5 `) x2 C3 ~# G* ]
  186. void wk2168_cs_high(void)
    4 \+ X0 [) B0 W$ {- t
  187. {2 ]- r3 Y8 ~/ o+ b9 m8 @, M
  188.         GPIO_SetBits(GPIOA,GPIO_Pin_4);3 A+ U+ }' @, r3 {% ^) u
  189. }
    ; v+ y$ {+ P# V$ |
  190. /*************************************************************************/' {! ^: n$ ~6 Q2 o
  191. //函数功能:设置CS信号为低电平; }: V, b; g9 p& G, N$ D  a
  192. /*************************************************************************/
    " I$ R6 p6 l' S( d
  193. void wk2168_cs_low(void)# M5 L8 j) K* K6 L2 s- i
  194. {3 U/ u2 A1 q2 t/ g4 _! a( U
  195.         GPIO_ResetBits(GPIOA,GPIO_Pin_4);% Q! r; d% r9 I
  196. }3 J, n/ t7 W: s7 U( A
  197. /***************************wk2168_write_g_reg***********************************/
    . ?& q5 d. z: a$ V8 d6 O
  198. //函数功能:写全局寄存器函数(前提是该寄存器可写,! H1 j3 _* c  i  R' ?, j1 X) F# m
  199. //某些寄存器如果你写1,可能会自动置1,具体见数据手册)7 p! S8 S* u9 M% V2 J( A2 M7 _
  200. //参数:
    0 ~  ]9 S$ J" L2 y" n
  201. //      greg:为全局寄存器的地址
    ; I6 t5 S0 x  Q3 H% q
  202. //      dat:为写入寄存器的数据
      A* P% T) o5 U9 @+ E4 `" U
  203. //***********************************************************************/9 ]; Z+ k4 e" e% N! h1 s) g
  204. void wk2168_write_g_reg(unsigned char greg,unsigned char dat)8 z: O8 {- H& @
  205. {         
    & [; y! r9 q4 w# m" B2 a
  206.         u8 cmd;
    ' G4 M( b' T; F0 _; X1 Z  z: r
  207.         cmd=0|greg;! M# Z1 A; j1 w1 C
  208.         wk2168_cs_low();//拉低cs信号" i1 a, y1 `; J/ d& y3 i
  209.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册* r, A  m6 [6 [% Q+ I
  210.         wk2168_spi_read_write_byte(dat);//写数据* p9 k, f' D% m8 g* V
  211.         wk2168_cs_high();//拉高cs信号+ C9 n- ]) \9 F! Y. m6 N
  212. }$ @2 L( a, S6 E; G7 c
  213. /****************************wk2168_read_g_reg***********************************/7 j& h8 S# X5 c5 m! A7 z
  214. //函数功能:读全局寄存器
    0 L2 [. s- s( Y, h+ P7 a3 B5 K
  215. //参数:
    - r) U0 A2 R# r! e
  216. //      greg:为全局寄存器的地址
    3 l: x. o* d9 y; X
  217. //      rec:返回的寄存器值
    & H1 }# u9 X5 z$ ~$ m, r% u
  218. //***********************************************************************// G& y  U# |3 k9 E0 U# {
  219. u8 wk2168_read_g_reg(unsigned char greg)
    2 [5 X( c4 f& b. [; I5 l
  220. {         
    " A5 k! J  d2 ^! Y9 J" M
  221.         u8 cmd,rec;
    - I+ {6 E9 E9 |( b' X
  222.         cmd=0x40|greg;$ C1 \9 H5 S2 `% G, S
  223.         wk2168_cs_low();//拉低cs信号
    : M8 C! T- Y3 U) l2 p/ q
  224.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册/ r+ g" A3 e% o' H" E# d
  225.         rec=wk2168_spi_read_write_byte(0);//写数据4 \3 @4 \! m" v- M, S+ v% o( [3 f) V
  226.         wk2168_cs_high();//拉高cs信号                                                        
    ( T9 _8 s: Z% h. m0 h$ J
  227.         return rec;9 o' A- z2 d' P) Y% ~
  228. }
      Y  D; v: {+ E1 `5 S3 t" T8 n0 f! H
  229. ! q8 I' [3 p* `
  230. /**************************wk2168_write_s_reg***********************************/
    - H0 v# X% q( F/ |' A7 [' r9 P
  231. //函数功能:# u: ~1 n1 J; V. S+ a( L, N% m
  232. //参数:port:为子串口& @) z' `* k9 m" i# }6 p8 v9 w- `
  233. //      sreg:为子串口寄存器
    0 h: L  I; C4 c) D2 ?7 r
  234. //      dat:为写入寄存器的数据
    1 e- G( _/ {# q& r5 @
  235. //注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出6 v) l0 h# g  W, ?  {" E7 x1 [; n9 x
  236. //**********************************************************************/
    ) Y1 Q# |6 c: U
  237. void wk2168_write_s_reg(u8 port,u8 sreg,u8 dat)/ \' Q' E+ o' u1 s
  238. {         : n3 O5 B7 v+ G& p, C  T
  239.         u8 cmd;
    3 T6 F3 r3 U; u9 j( @( t2 |, ?
  240.         cmd=0x0|((port-1)<<4)|sreg;
    3 m7 F6 S6 h0 ^
  241.         wk2168_cs_low();//拉低cs信号6 o4 C9 i, O& r
  242.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册! f8 \2 U7 J' y& \' j% K2 v
  243.         wk2168_spi_read_write_byte(dat);//写数据
    ) n$ M2 h" t$ ]6 o$ c7 y; l
  244.         wk2168_cs_high();//拉高cs信号
    5 E6 b9 B/ y. h4 a( T
  245. }* D& f( L; B$ i( L0 ~7 S
  246. 1 j/ H! b5 Q* {) ~( i6 t" G
  247. /**************************wk2168_read_s_reg***********************************/0 D) G3 g% M4 B; e* Y
  248. //函数功能:读子串口寄存器
    4 y. g( {- z+ m
  249. //参数:port为子串口端口号  k$ M( H+ }: w1 ?4 {$ k# z
  250. //      sreg:为子串口寄存器地址* q7 R- k4 U  U
  251. //      rec:返回的寄存器值9 O# X3 g" v" K2 M
  252. //**********************************************************************/% z- Z" N& v6 W* o! x" e
  253. u8 wk2168_read_s_reg(u8 port,u8 sreg)  ]- {2 y2 Z/ v  x6 m
  254. {         
    & I$ I$ C4 |: c, {6 J
  255.         u8 cmd,rec;9 L- s, `/ a7 ^* R- |4 H9 _
  256.         cmd=0x40|((port-1)<<4)|sreg;
    0 R! G6 Y' y/ \& `
  257.         wk2168_cs_low();//拉低cs信号# z* {5 Q  H2 V' p  q  `. q( i! Y
  258.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
    & q& X8 |2 \# K6 C) [1 W, ^
  259.         rec=wk2168_spi_read_write_byte(0);//写数据
    % V( q( }* R" C! e# \+ j4 A
  260.         wk2168_cs_high();        //拉高cs信号                                                        
    ( q* d2 U( o( N9 l6 Z
  261.         return rec;
    & T% a' E- G2 ]3 o
  262. }# @( k9 \. P% F; u* |+ P9 L
  263. /************************wk2168_write_s_fifo***********************************/6 s. o. g% X8 n
  264. //函数功能:向子串口fifo写入需要发送的数据
    4 A; V, l/ e/ R: @
  265. //参数:port:为子串口& N7 `" Y8 Y% d4 U3 y% B4 }" O
  266. //      *dat:写入数据- ]: |3 R- Q9 J1 G0 I+ |( T. v9 l
  267. //      num:为写入数据的个数,单次不超过2567 J2 R9 _" I$ J5 X4 \8 |
  268. //注意:通过该方式写入的数据,被直接写入子串口的缓存FIFO,然后被发送4 j+ f* g1 a3 Q
  269. //*********************************************************************/. X; P" n9 t# Y' I
  270. void wk2168_write_s_fifo(u8 port,u8 *dat,int num)
    3 ?+ J& R, F  i4 i% {5 e
  271. {         
    ( L3 l5 j: D2 l" j3 h
  272.         u8 cmd;
    2 u% K* a$ C. L( X* y2 y2 a# n" r8 ?
  273.         int i;
    $ _) b  q3 V! }. ]# D
  274.         cmd=0x80|((port-1)<<4);, e/ q- a+ h, ?/ w
  275.         if(num>0)) ~; G$ C9 n" w7 O5 x' w$ K
  276.         {: ?  r! X' \  `0 Q+ i
  277.                 wk2168_cs_low();//拉低cs信号
    5 L/ X3 L, s5 D" B; G
  278.                 wk2168_spi_read_write_byte(cmd); //写指令,对于指令构成见数据手册
    " {  W, y4 H, {
  279.                 for(i=0;i<num;i++)5 Z7 n- {5 @% k/ R: @
  280.                 {
      u  B9 P* R2 B. W
  281.                         wk2168_spi_read_write_byte( *(dat+i));//写数据
    6 W7 A" g. I( g9 W7 @
  282.                 }) k6 o- S, e7 i6 s; @* `
  283.                 wk2168_cs_high();//拉高cs信号) g/ R5 I/ J; q  S
  284.         }( s, J' a% o- n5 |  c/ S3 |8 L
  285. }: B. V( s' C! J0 w, y& c

  286. 2 `: X2 B- q. C1 g" b0 i
  287. /************************wk2168_read_s_fifo***********************************/! [2 x0 p% s8 p2 w
  288. //函数功能:从子串口的fifo中读出接收到的数据
    , A$ Q2 p# O$ Z) N( K1 K8 \
  289. //参数:port:为子串口
    0 g1 ^" x/ }+ x" [( d0 Y
  290. //      *rec:接收到的数据
    ! F/ P/ D$ H, U7 h: N
  291. //      num:读出的数据个数。  e/ L. c) _" `0 E
  292. //注意:通过该方式读出子串口缓存中的数据。单次不能超过256
    5 i  U% a% X4 C. e8 |& L" W; f
  293. //*********************************************************************/
    1 Z# m' M, T) o3 C0 w
  294. void wk2168_read_s_fifo(u8 port,u8 *rec,int num)
    5 f5 K1 P5 Y/ w8 Z
  295. {
    , |  S( x) q( H/ M/ W
  296.         u8 cmd;
    ! k' b; L& I# @; @  p
  297.         int n;( G* M; h, D3 H8 Q' K
  298.         cmd=0xc0|((port-1)<<4);
    2 m$ W% }# ~. x* q
  299.         if(num>0)# S6 a, l2 V! @4 R: g
  300.         {8 Y/ j+ u8 f  `/ _) i) u
  301.                 wk2168_cs_low();//拉低cs信号
    . G- T5 c" d7 O$ E5 p* i, P) O1 F
  302.                 wk2168_spi_read_write_byte(cmd);4 ]- w5 P9 o  x5 M5 c! }4 j
  303.                 for(n=0;n<num;n++)0 p% \; L9 ~) k, @
  304.                 {        
    8 i) g8 c, ~5 W. c) ?3 y5 X
  305.                         *(rec+n)=wk2168_spi_read_write_byte(0);        9 U& l* }% g, `$ m- @
  306.                 }
    4 G$ m2 t. ], W
  307.                 wk2168_cs_high();//拉高cs信号& n3 x$ i3 ^9 ]
  308.         }; f; W5 C" ]' r* m0 v3 y  a
  309. }! c6 w2 g8 R9 s& Y

  310. , t/ W0 x" |; O1 w
  311. 2 w( ]" }" f5 J+ ^6 e7 M8 S
  312. /*******WkInit*******************************************/9 K; A) _6 T, A' I# a% A' [0 @
  313. //函数功能:初始化子串口' T$ M- Y: S. U8 J( ?
  314. /*******************************************************/) K9 {" U3 M/ n. u, X
  315. void wk2168_sub_uart_init(u8 port)
    1 I4 w5 z/ N: H- L$ w
  316. {
    + X- ~* H- H5 u$ o+ P6 G5 ^
  317.         u8 gena,grst,gier,sier,scr;
    ! [- F' w. Q! D- Y$ ]. w% R
  318.         //使能子串口时钟
    % b5 W* F+ W/ L$ p5 a6 z2 T' @
  319.         gena=wk2168_read_g_reg(WK2XXX_GENA);
    6 D! Y3 X( D' T( I3 v5 H
  320.         gena=gena|(1<<(port-1));
    ! e- R7 c, \/ c1 \7 N+ n/ g) n
  321.         wk2168_write_g_reg(WK2XXX_GENA,gena);$ {  ]5 e  A  H
  322.         //软件复位子串口
    . v6 q/ _* ?4 Z' w3 g+ r
  323.         grst=wk2168_read_g_reg(WK2XXX_GRST);8 r1 [9 @4 G. p
  324.         grst=grst|(1<<(port-1));
    ; B  p$ p# V7 Y% o+ z
  325.         wk2168_write_g_reg(WK2XXX_GRST,grst);) w# A+ g8 |2 |+ O' z, t
  326.         //使能串口总中断3 c- s4 N2 D" \( E! U* ~$ _' [& J, \" o# M
  327.         gier=wk2168_read_g_reg(WK2XXX_GIER);
    * a# d) `6 [5 ~
  328.         gier=gier|(1<<(port-1));4 a& z2 b+ ~; y8 b  C8 B7 G
  329.         wk2168_write_g_reg(WK2XXX_GIER,gier);
    0 Z" d, C* l: V! e) v) l
  330.         //使能子串口接收触点中断和超时中断7 z; }8 }6 U% ~0 K9 N1 K
  331.         sier=wk2168_read_s_reg(port,WK2XXX_SIER); # i+ b. s2 m; T
  332.         sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
    ! i/ n& U/ f1 D, }
  333.         wk2168_write_s_reg(port,WK2XXX_SIER,sier);3 J6 x& D( t  J3 o
  334.         //初始化FIFO和设置固定中断触点0 @/ x6 l7 D( @) t( j: b% [
  335.         wk2168_write_s_reg(port,WK2XXX_FCR,0XFF);  
    9 D) O) p+ o; I" {. ]% w4 v& x5 j
  336.         //设置任意中断触点,如果下面的设置有效,  c$ ~0 n. z# g- n, r8 a- C
  337.         //那么上面FCR寄存器中断的固定中断触点将失效
    . K0 J3 x" y0 @3 F5 r
  338.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
    . A; B- m! p! [1 `/ d
  339.         wk2168_write_s_reg(port,WK2XXX_RFTL,0X40);//设置接收触点为64个字节
    & X& M/ h% R' l: Z/ Y* X
  340.         wk2168_write_s_reg(port,WK2XXX_TFTL,0X10);//设置发送触点为16个字节
    2 v% O* C& g  R* e; \  B
  341.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
    7 b. j1 S3 H& G6 g
  342.         //使能子串口的发送和接收使能1 l* ~0 q/ Z* M( }" O6 k) H
  343.         scr=wk2168_read_s_reg(port,WK2XXX_SCR); , z& ]% p9 h/ I" ~
  344.         scr|=WK2XXX_TXEN|WK2XXX_RXEN;  `2 l' p2 m" z+ \* m! R3 }5 w' D
  345.         wk2168_write_s_reg(port,WK2XXX_SCR,scr);                          
    / k7 {8 e6 \1 x- v: \0 L
  346. }5 E; g& P& ^) x. q: R

  347. 4 I- y+ [' ^& s$ g" }5 s
  348. /******************************wk2168_sub_uart_deinit*******************************************/, {* t0 k5 L. N& B' u8 |
  349. //函数功能:初始化子串口4 E. O- X9 ~7 w1 \# a
  350. /*********************************************************************************/
    " E$ Y4 H6 {+ h# p) z* d0 K8 @) o8 F
  351. void wk2168_sub_uart_deinit(u8 port)
    + w. @+ a3 ]. H8 G( x9 k( x; s
  352. {
    9 k! I% s- k: _7 k
  353.         u8 gena,grst,gier;5 b; D+ F1 W* ~, O3 a. H
  354.         //关闭子串口总时钟
    2 F( s3 e' K" K( y
  355.         gena=wk2168_read_g_reg(WK2XXX_GENA);
    % q, V+ w3 S5 U: s1 d3 D$ S) b$ G# O
  356.         gena=gena&(~(1<<(port-1)));+ j7 u2 P: c8 E) N6 x2 s+ |
  357.         wk2168_write_g_reg(WK2XXX_GENA,gena);
    2 Y  W9 u! N9 I
  358.         //使能子串口总中断
    ( H9 B# ^# }; Z- `/ l+ @( n5 B. x
  359.         gier=wk2168_read_g_reg(WK2XXX_GIER);
    " z8 x$ p! q2 I2 t/ u4 H# L( P( Y
  360.         gier=gier&(~(1<<(port-1)));
    2 g& A/ A% R! ~% s
  361.         wk2168_write_g_reg(WK2XXX_GIER,gier);
    9 x: L( E5 r5 k9 ]' r
  362.         //软件复位子串口' p' H8 n. ]# |: E3 F- E( x
  363.         grst=wk2168_read_g_reg(WK2XXX_GRST);# e. s8 b" x- M) E" K. t( W# R. Y
  364.         grst=grst|(1<<(port-1));/ a9 n8 t' f! y  }0 I5 L* a6 T8 [9 y
  365.         wk2168_write_g_reg(WK2XXX_GRST,grst);; {% D3 c- X5 C- u& m: L
  366.         
    ' I" o5 e9 S4 I  o* J9 x9 g
  367. }1 f; ~# }7 y& r0 Z6 p; |; g1 m

  368. - ~+ W, u% Y, g8 D8 Y6 b9 j" x4 P
  369. /**************************wk2168_set_baudrate*******************************************************/
    % {& N6 K; h& n! C. j
  370. //函数功能:设置子串口波特率函数、此函数中波特率的匹配值是根据11.0592Mhz下的外部晶振计算的! G( f" s5 R$ e/ x& M, R
  371. // port:子串口号0 @; Y8 k, s1 j* L
  372. // baud:波特率大小.波特率表示方式,5 d" r5 x/ t( [
  373. /**************************Wk2114SetBaud*******************************************************/
    9 z+ j3 ]# m0 e% B( ~
  374. void wk2168_set_baudrate(u8 port,enum WKBaud baud)6 a1 e* j" `) q2 Z$ R/ p
  375. {  ! z" q( j8 ~* S% V$ P- M
  376.         unsigned char baud1,baud0,pres,scr;2 E, |/ x0 `' M# X9 d9 ?7 @3 D
  377.         //如下波特率相应的寄存器值,是在外部时钟为11.0592mhz的情况下计算所得,如果使用其他晶振,需要重新计算; @8 f5 f9 X8 n! Y
  378.         switch (baud)
    $ n  I* d7 c0 L' p2 m+ v
  379.         {+ E& C! {0 M% z7 g) O! F: g$ O
  380.                 case B600:
    9 F0 n2 a4 c) |' N" ~
  381.                         baud1=0x4;+ T6 {7 ~# Z& L6 F' T2 n
  382.                         baud0=0x7f;
    % z: f; G& U+ Y& t% g4 N1 t- u
  383.                         pres=0;
    " l6 r$ J4 J4 k+ V, ~8 A1 z- Z+ t2 F
  384.                         break;; g. z8 V# H' F2 U5 E# `* |
  385.                 case B1200:
    5 ?' D, V4 b, z, \* C
  386.                         baud1=0x2;% W9 q) Y& X8 a$ V( R
  387.                         baud0=0x3F;% Q) A) y. a* M
  388.                         pres=0;. \2 V8 y( t! u( V3 E
  389.                         break;! {- C" [, [! X
  390.                 case B2400:
    ( `; w: R. ]2 L* S* |+ f+ ?
  391.                         baud1=0x1;
    $ A' E8 l# H9 h. z% q
  392.                         baud0=0x1f;
    / o0 y3 \  _! Z8 H, Z( H
  393.                         pres=0;
    & }5 Y/ R$ P5 {: M8 S6 d
  394.                         break;: Y0 c9 n0 |: T$ A1 x7 I
  395.                 case B4800:
    ) _9 y) B. U, W+ v6 J% _; y6 s
  396.                         baud1=0x00;
    - |7 E; I& x" ?
  397.                         baud0=0x8f;  P6 |* N2 Q* ~$ u! ]! I
  398.                         pres=0;( O4 g5 M* ~" L. q. c8 X
  399.                         break;
    ! L7 c1 `9 ~' h. y6 X
  400.                 case B9600:
    / G5 o- o, i) I: P! l$ h
  401.                         baud1=0x00;
    ; C" N+ B' d8 X# n" f  N
  402.                         baud0=0x47;
    , E6 I" h- G, `
  403.                         pres=0;
    6 X! ~8 C1 j! Z* {9 B5 m0 W' j
  404.                         break;  ]7 V( Q  m& l. ^" W' c
  405.                 case B19200:
    ( }) e# P- X2 d/ Y7 z5 `
  406.                         baud1=0x00;
    9 ]$ I6 m9 p0 I, S
  407.                         baud0=0x23;6 _  z% E, I  u$ c' n
  408.                         pres=0;
    9 K5 n7 O& }1 P% I5 \
  409.                         break;
    , X$ l5 v/ E8 C" m  A5 |% A
  410.                 case B38400:
    9 o5 P& S7 h) h; b* k
  411.                         baud1=0x00;
    ( ]* C  v, b* i) W. H' o, t6 @
  412.                         baud0=0x11;- @6 ~' f! Q* [% u) W* w
  413.                         pres=0;
    - n; g) y( ?) Q* i! Q- ?
  414.                         break;/ y4 ~! A5 M+ w0 m
  415.                 case B76800:/ Y* c0 o: l+ i$ u% `% Q/ i, @
  416.                         baud1=0x00;
    , V& R. }+ _, N: {3 N
  417.                         baud0=0x08;6 L9 M- P* u4 v$ S' D* w3 o( P% }
  418.                         pres=0;
    + s7 G4 k- y0 L5 }
  419.                         break;        ! i3 D0 m, c6 X. \6 W
  420.                 case B1800:, @, h, s2 q: a8 Q
  421.                         baud1=0x01;. J+ H' o% X* S& L" q# I" B  Z! K! v
  422.                         baud0=0x7f;+ H0 x; L$ i8 L
  423.                         pres=0;
    - `, O6 ], j1 [
  424.                         break;, y9 k' a9 P" A) B  e+ j: c$ n
  425.                 case B3600:) L9 b. X4 l/ E4 Z6 [7 }
  426.                         baud1=0x00;
    ( P# \7 ~8 y% ~5 l
  427.                         baud0=0xbf;
    # F" q: Z8 i; U2 w# }
  428.                         pres=0;+ L9 M* V' E. C3 m* v3 u  @$ A
  429.                         break;
    3 U" C4 z8 M4 _+ X  F
  430.                 case B7200:
    - [9 b) j5 ^! v
  431.                         baud1=0x00;
    $ a1 z6 T/ F3 ]  J0 i- q/ o4 \
  432.                         baud0=0x5f;
    ! D# \: Y  }: e& F; ^
  433.                         pres=0;
    9 N" |7 U$ C; `3 B1 C1 r
  434.                         break;* a6 T, u- j# ^6 J
  435.                 case B14400:0 Z( L: ?  |$ `7 e3 y; c. s) ^& e' F
  436.                         baud1=0x00;! y) }% B8 @/ W1 \9 H7 z
  437.                         baud0=0x2f;  X1 V& x; M$ h% o1 S( ?
  438.                         pres=0;4 O) n* Z# p& p2 i/ `9 z
  439.                         break;
    - B1 n' @! G; e  e! l8 [% G$ C
  440.                 case B28800:' ~8 O+ d4 e  ^' L% \5 |/ x
  441.                         baud1=0x00;
    3 C' K5 s9 ^, P: k" W6 C, Y7 x
  442.                         baud0=0x17;& r: I2 _" L$ n+ D0 U
  443.                         pres=0;
    ( k7 I2 @# k9 e: @* i1 `9 K$ X
  444.                         break;6 S- Y. v/ p) `) a2 d2 r7 I1 S
  445.                 case B57600:$ Y6 s9 C7 i& q8 `5 v( K+ A  G
  446.                         baud1=0x00;% }! M- i- u, z
  447.                         baud0=0x0b;- T/ @* K6 s" f& C3 U5 E# |
  448.                         pres=0;
    0 R  x: _, X3 t- B/ c
  449.                         break;
    : G( N+ h/ \# A+ r  d0 s" v& m! a
  450.                 case B115200:8 @% X) N$ x  r  N1 M5 d' e
  451.                         baud1=0x00;7 Q$ ^( @) S* |3 T: M+ E' x
  452.                         baud0=0x05;( O4 M: J5 ]. ~0 Q5 v
  453.                         pres=0;
    6 L+ L: K1 y# X1 j0 \4 ]
  454.                         break;# G" ~7 k& h, P
  455.                 case B230400:: a) s! E/ }/ M& H) N
  456.                         baud1=0x00;
    & P4 r/ N* `7 F
  457.                         baud0=0x02;5 ~# t+ ?( B( l* z
  458.                         pres=0;
    8 |% _0 `) l# {2 o: S
  459.                         break;
    / O/ d5 ^" d, L7 x
  460.                 default:
    , Y) b7 ~/ l- `' l( Z! q
  461.                         baud1=0x00;3 [6 S! ]! M/ b* j. j. n
  462.                         baud0=0x00;8 V) Q# k2 y5 v, h( |0 G
  463.                         pres=0;
    8 p1 m+ m" {$ F, l! |0 R+ b  l- P( `
  464.     }
    , j4 ]+ m  v7 ?5 p2 J5 w1 H
  465.         //关掉子串口收发使能5 g4 i4 J6 F  y' n- d
  466.         scr=wk2168_read_s_reg(port,WK2XXX_SCR); * _! ~; _) Q3 A* @( Q, p
  467.         wk2168_write_s_reg(port,WK2XXX_SCR,0);
    . b& f) d' z1 m$ K0 L/ ]9 ]
  468.         //设置波特率相关寄存器
    3 M. u4 j& K7 q* d0 h2 |
  469.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
    / c% z$ J- R* f- `0 e6 K
  470.         wk2168_write_s_reg(port,WK2XXX_BAUD1,baud1);8 }) `" P3 M, B) }1 j6 ^6 [. N
  471.         wk2168_write_s_reg(port,WK2XXX_BAUD0,baud0);
    0 c. _: i4 l& G/ b$ M7 O
  472.         wk2168_write_s_reg(port,WK2XXX_PRES,pres);
    / X# k4 d+ w, \9 @2 r8 E7 R* {9 k
  473.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
    9 `1 }* W, ], K  t0 V+ _* X: k
  474.         //使能子串口收发使能
    % j; U$ E, T) c4 Q( ]
  475.         wk2168_write_s_reg(port,WK2XXX_SCR,scr);* i4 P, P' j! d' j, l3 G' e" P$ S
  476. }+ }1 b' k% [) \- A3 L/ `8 S
  477. /**************************wk2168_get_tx_len*******************************************/
    : {: u" E" _4 [% Z' R: y9 S
  478. //函数功能:获取子串口发送FIFO剩余空间长度. |3 A. K. D* F9 z# u& f& ?
  479. // port:端口号3 E' P; ?. p9 b% A" `+ x) V; v' E! J
  480. // 返回值:发送FIFO剩余空间长度: F8 P0 j% d1 M4 A6 h
  481. /**************************WK_Len********************************************/
    " ^# i; L( e4 _* h
  482. int wk2168_get_tx_len(u8 port). X! D  J; U* ^! n* P- ~
  483. {+ y5 F# e6 s1 w! Y$ g3 J
  484.         u8 fsr,tfcnt;# k6 [: G# e0 }# Y: Z3 v4 X) {' S
  485.         int len=0;; p* [  p3 u5 D% B, g( O* Q6 \
  486.         fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);
    ) A3 a5 x: J/ w8 H9 }8 s' g$ `
  487.         tfcnt=wk2168_read_s_reg(port,WK2XXX_TFCNT);
    * C  U4 M- l7 u0 z5 |
  488.         if(fsr& WK2XXX_TFULL)
    ' G# |3 f1 Z: z1 R, p. {
  489.         {
    , H' _+ O8 X( x/ U
  490.                 len=0;$ y* I( m8 L) O/ \, n: Y
  491.         }
    8 l1 V7 G* F. q! ^4 r
  492.         else
    : ]! \% j$ c1 F8 p% C2 C/ ?: I
  493.         {% q9 `5 h& E& b1 H5 @
  494.                 len=256-tfcnt;
    ; e8 T( y- b5 j3 `& O
  495.         }/ i7 e/ j& G5 |5 p% _8 v
  496.         return len;
    8 z. W, N! V( D' d6 e, U
  497. }9 ]6 i8 i* I: k
  498. + }1 r* f* Q! L4 N3 T
  499. /**************************wk2168_send_data*******************************************/
    & m8 |1 y9 M0 R, x& U
  500. //函数功能:通过子串口发送固定长度数据
    # q* D. v3 t$ Q, v4 E4 c2 u$ @
  501. // port:端口号( |9 {7 @/ m& V8 ]4 x6 s
  502. // len:单次发送长度不超过256. `0 b5 N  v" X
  503. // 0 `1 G* d  V. j+ n
  504. /**************************wk2168_send_data********************************************/
    : ~. L: W; i  K4 m( c
  505. int wk2168_send_data(u8 port,int len,u8 *sendbuf)* w5 L$ F* a4 f: D  I1 ?
  506. {
    ( ~) @  G4 g/ x7 i" b$ q
  507.         
      p8 U9 e# E5 l! S4 r3 m
  508. #if 1  m/ ]% O% q8 n) u0 {/ [
  509.         wk2168_write_s_fifo(port,sendbuf,len);//通过fifo方式发送数据9 V9 z7 |# U# g( v
  510. #else
    ) m: Y0 M" M) S# E
  511.         int num=len;+ @! |9 a# N" N0 ]0 [7 ]
  512.         for(num=0;num<len;num++)
    & |. G1 w3 X; p, q
  513.         {
    0 J! y, d: ?$ R; p. j  [
  514.                 wk2168_write_s_reg(port,WK2XXX_FDAT,*(sendbuf+num));
    2 _$ z% [5 R4 g
  515.         }: ?3 j& `2 W" S3 c4 ^/ R
  516. #endif        0 j7 k3 g, }: }6 A6 a: J" p
  517.         return 0;
    1 |3 x5 r& {1 i( x  k0 I2 b) P
  518. }
    % a) o2 f( X- X8 B! `
  519. ; p; d9 _/ o7 |( [! j9 y+ w/ g
  520. /**************************wk2168_rec_data*******************************************/
    ' g1 {7 w( X5 S2 @5 w" S
  521. //函数功能:读取子串口fifo中的数据
    5 @$ M. W- K9 }- S5 G5 c$ M9 F
  522. // port:端口号5 a3 Y4 n# |+ y3 s
  523. // recbuf:接收到的数据
    8 \" }. Q) c$ D5 e9 K2 h0 }
  524. // 返回值:接收数据的长度
    9 P: ]' X; R0 S' y5 H9 I
  525. /**************************wk2168_rec_data********************************************/
    + A0 `9 A- x# ~: K
  526. int wk2168_rec_data(u8 port,u8 *recbuf)" a5 Q9 K+ K) O; w; G; J& V/ {$ y% P
  527. {
    1 U# H* K9 h2 |  c' Y+ |
  528.         u8  fsr=0,rfcnt=0,rfcnt2=0,sifr=0;
    ! |9 B/ |& x$ _0 b1 ^' `6 H
  529.         int len=0;
    : D+ N) L% Y/ t& V1 q
  530.         sifr=wk2168_read_s_reg(port,WK2XXX_SIFR);4 ^& r! u, a8 t6 {$ S* v
  531.           ~+ |: I6 J$ i. Z6 t, u
  532. $ f2 D" g7 m7 V9 }) {0 W. T
  533.         if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中断和接收超时中断
    6 `+ w& I8 U/ R8 F# s# l
  534.         { ' Y- [+ k. @, ]0 g
  535.                 fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);" [  G8 Y  C% w" X2 K) m4 Y# e8 Q
  536.                 rfcnt=wk2168_read_s_reg(port,WK2XXX_RFCNT);
    ' x" l/ T  {8 k; l, i
  537.                 rfcnt2=wk2168_read_s_reg(port,WK2XXX_RFCNT);% T9 F* d/ o' C" `  w( p; U/ s
  538.                 //printf("rfcnt=0x%x.\n",rfcnt);- Z2 t7 Z( n' M) R* ~6 E, h
  539.                 /*判断fifo中数据个数*/; y! T) S1 A( b: E' t& O  e
  540.                 if(fsr& WK2XXX_RDAT)
    2 l% J: ]( E. V6 {* j' W
  541.                 {
    / F* i3 {' C8 M4 ?
  542.                         if(!(rfcnt2>=rfcnt))/ A/ ^+ |* c4 g
  543.                         {
    7 ?3 K9 _: I; s0 C- }% n  s; H6 u
  544.                                 rfcnt=rfcnt2;$ [. e( u5 \7 e/ q
  545.                         }3 x4 i& `$ X7 b5 N# [0 m5 k7 J
  546.                         len=(rfcnt==0)?256:rfcnt;
    " ^4 t% O: _* h
  547.                 }7 Y5 G. z$ T3 N9 l2 z) ?- Y
  548. #if 17 s4 H9 I6 k/ F7 y0 I
  549.                 wk2168_read_s_fifo(port,recbuf,len);9 L: H! c7 v( b) d8 Q& [
  550. #else* M7 e+ F: i6 f( V, R+ D
  551.                 for(n=0;n<len;n++)
    ' S1 Q2 e3 q/ m$ v. X
  552.                  *(recbuf+n)=wk2168_read_s_reg(port,WK2XXX_FDAT);7 N9 ~8 b9 u) {2 g- A
  553. #endif        
    ( Y. ?9 g7 p4 Z* R+ _9 h
  554.                 return len;, c# V) b* O  W: j& X+ z& l
  555.         }
    2 v) B) c/ g/ \% W0 a, K4 k9 \
  556.         else
    : l' S8 C( Z  n: d, X& t8 c
  557.         {
    ! T, e, |$ W( \5 f7 w5 ~
  558.                 len=0;
    & ~/ [; A0 {5 [) n9 P) D- k, _! L
  559.                 return len;+ t( c  e  d# q6 b/ o& j$ K& I- T
  560.         }+ |; }# u$ `/ S+ q  F3 r
  561. }
    3 _; |1 [# `  k1 m

  562. ) Z0 e8 Q5 w' l/ v# @
  563. /**************************wk2168_set_rs485*******************************************************/5 ]0 X5 O% v- w6 L. \* ?
  564. //函数功能:设置子串口RS485的收发转换函数,使用RTS引脚控制485电平转换芯片的收发# W) o) X1 D/ L
  565. // port:子串口号
    # r$ c9 {+ U' \# r" f5 Q* v/ ]' c
  566. //
    + M' Y" G% \9 d( i! p: _2 G: B! H
  567. //注意:只有WK2168/WK2204支持该功能
    . ]+ a% N5 Z2 Y5 ^
  568. /**************************wk2168_set_rs485*******************************************************/
    ! o7 a/ s1 y# V4 E  _8 g+ W* j
  569. void wk2168_set_rs485(u8 port)& N4 z" Q$ j1 ~/ D7 W
  570. {   - P: T: {  r. t
  571.         wk2168_write_s_reg(port,WK2XXX_RS485,0x02);//
    4 p0 X8 W$ G* p: y
  572.         //wk2168_write_s_reg(port,WK2XXX_RS485,0x03);//" y) j" O8 m( m) Y5 l* e
  573.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
    ; u  X3 Q$ b9 n8 S: k
  574.         wk2168_write_s_reg(port,WK2XXX_RTSDLY,0x01);
    - Y5 s7 R2 K$ o, i; d
  575.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 3 M; L  c3 m# s+ ^' g) h
  576. }7 ]7 w! |' d$ a, x8 _) ^- N
  577. /**************************wk2168_rts_cts*******************************************************/) e! Z: S. V7 f) _& Y
  578. //函数功能:硬件自动流量控制,需要子设备的支持" ?( t$ f8 ~6 f" J) |
  579. // port:子串口号% c: v5 T# G, `% A8 I
  580. // 7 f) T) O7 a. G( N& F* o9 F
  581. //注意:只有WK2168/WK2204支持该功能8 j0 @" f# e& e$ D7 `$ Z6 K8 `
  582. /**************************wk2168_rts_cts*******************************************************/
    " u  t  `7 i& `' T1 b$ W
  583. void wk2168_rts_cts(u8 port); y# }3 ]) I  A7 }' j. i
  584. {   ' x8 `0 V2 _- \) D, ^) x1 h" E
  585.         wk2168_write_s_reg(port,WK2XXX_FWCR,0x30);//
    3 \: X# [! u9 [" }$ A3 Q
  586.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
    ; f* Q3 H1 a5 m+ F. F
  587.         wk2168_write_s_reg(port,WK2XXX_FWTH,0XF0);//停止接收触点
    . i, Z& M6 n3 p; W6 C  [9 D% F
  588.         wk2168_write_s_reg(port,WK2XXX_FWTL,0X20);//继续接收触点3 h# D/ H( E7 n2 b* L. l
  589.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 & d# |  q, w- y9 M2 Z9 [9 A
  590. }
    ; W" _1 K1 S/ \8 l8 ~

  591. : l5 {4 {7 Z9 ]! }! L9 B2 b+ D* E
  592. 0 u1 V: H& @+ D
  593. ! z% E# }4 X: N; C6 i! V
复制代码
9 T. }: ^# M3 T  x
6 B+ W6 f4 U, W$ R# b7 T
收藏 评论0 发布时间:2022-4-20 20:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版