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

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

[复制链接]
STMCU小助手 发布时间:2022-4-20 20:34
一、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
20210413134012387.jpg ! |8 U  f" Z! P; s7 _; b& [; K

# U( i6 U6 p# R) n2 ^! z3 t6 i$ E 20210413134020902.jpg , 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
  1. #include "sys.h"
    ( ~' s2 c+ V/ f- L2 `. i
  2. #include "delay.h"
    2 Z7 U) \1 u2 m) T" o9 B
  3. #include "usart.h"+ D8 f9 c5 f- U- g
  4. #include "led.h" * L8 v7 J' }: p$ w9 c3 P" ]  z/ a5 ?
  5. #include "wk2168.h"
    3 N- @: {7 ~/ w! w
  6. , ?* I. B- c, @0 ]0 g$ c# h2 H
  7. 0 `: y! M- n3 o2 z

  8. 1 D' m2 D: }* o' ~: V$ ]

  9. 1 Q9 y# i9 W8 J0 n

  10. * i4 I9 B0 k6 q
  11. int main(void): p$ `# u# _5 |* s3 r
  12. {        # S$ }% |( \7 Q" m( [3 Z
  13.         //wk2xxx相关定义
    3 Q/ I$ l+ j; A1 n
  14.         u8 sendTimeCnt;& F& j8 B$ a+ J- b  q! O. p
  15.         u16 ledCnt;
    $ j) }7 r: p3 k% h, g8 C1 r2 ^) N
  16.         u8 dat1;
    / w( P: I1 B. t! ~$ E. m
  17.         u8 sendData[5]={0x01,0x02,0x03,0x04,0x05};
    3 |+ L5 U  s$ i5 C
  18.         
    5 W$ h3 W' W/ b/ T% Y
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级8 j$ H/ y! T' a/ Y
  20.         delay_init();        + q# P1 ?6 a+ a
  21.         uart_init(115200);
    ' T4 [: f7 @* q! @$ ]) w
  22.         led_init();        
    8 `3 b1 u4 V- \, A* _3 w
  23.         wk2168_init();        
    , j9 t7 c% S5 `* A
  24.         wk2168_exit_init();
    ; d! h  r! t. t  T* b) @3 l5 l2 i
  25. 7 ]3 i, v7 [; X% j
  26. /*读写GNEA,测试主接口通信是否成功*/
    ( s. d( V7 u" a( G# J
  27.         dat1=wk2168_read_g_reg(WK2XXX_GENA);0 H* l) Y1 g9 Q8 G9 G: S0 u  \9 W
  28.         printf("gena=0x%x.\r\n",dat1);
    % R& b* z5 \- e2 v

  29. ; }$ J# a7 ^) X' a
  30. / P+ F) g7 n1 r9 [3 Z  G
  31.         /*初始化子串口*/
    5 T) o/ {( h# j- Z: }8 Q
  32.         wk2168_sub_uart_init(1);
    / |$ N# b! e' E
  33.         wk2168_sub_uart_init(2);9 C  E) L* N; F% v
  34.         wk2168_sub_uart_init(3);6 ?! ~# ^; C3 F$ k% P% W9 T
  35.         wk2168_sub_uart_init(4);1 U& z  g6 u# r0 z: g/ @
  36.         /*设置子串口波特率*/
    9 i+ I- _7 i5 a# f. s6 ?
  37.         wk2168_set_baudrate(1,B9600);
    0 ^1 W2 e" y; J
  38.         wk2168_set_baudrate(2,B9600);) m  o/ y5 ]: y' t7 i2 d/ [. O
  39.         wk2168_set_baudrate(3,B9600);
    7 f1 M# x& D$ V8 |8 O2 R6 M6 @
  40.         wk2168_set_baudrate(4,B9600);1 f* u; J% {" q8 h% S* e% O
  41.         /*使能485*/3 a* B, |/ ~' V
  42.         wk2168_set_rs485(1);- l; c7 F( B' J, F! _
  43.         wk2168_set_rs485(2);
    * G0 X/ f( G6 e, o4 ~! W! _: E
  44.         wk2168_set_rs485(3);
    * u3 k+ `/ \+ I  }2 `* ]2 R
  45.         wk2168_set_rs485(4);
    ' P, @9 t% ~! t' Z6 p  m- E

  46. 2 O6 x1 m3 U1 P% I# i
  47.         
    8 o1 m( Y* B, u7 }  f- N
  48.         while(1), j' f: T' X9 T  d7 N& M: z
  49.         {! f( t9 |, @2 u! \  j7 L+ J/ l- s
  50.                 ) T9 s/ E2 P( b. i; K0 x
  51.                 sendTimeCnt++;' J( j5 [% M1 S3 ^# z
  52.                 if(sendTimeCnt>=100)! T- X- M" r  T" _. a7 x
  53.                 {$ B' p5 \4 N3 e% q/ v
  54.                         sendTimeCnt=0;; _, `7 h7 `) G9 k8 o
  55.                         wk2168_exti_disable();               
    - [) _6 k+ p/ `
  56.                         wk2168_write_s_fifo(1,sendData,sizeof(sendData));1 h# X5 u3 y% `9 C& S6 z6 K6 `
  57.                         wk2168_write_s_fifo(2,sendData,sizeof(sendData));
    % G/ n- P) i9 Z& H* t. H1 u
  58.                         wk2168_write_s_fifo(3,sendData,sizeof(sendData));
      w! u. c9 O2 o* ]3 E
  59.                         wk2168_write_s_fifo(4,sendData,sizeof(sendData));5 D, H% j. b% ^! E3 S3 S0 G
  60.                         wk2168_exti_enable();                                
    4 o5 V, F) u1 C0 Z  ^
  61.                         
      ]+ F8 x9 f( ^5 y# K% M" u6 `: K
  62.                 }0 [( C# T3 J2 V5 B% l* B. r* Q2 @2 c
  63.         % N' o& Q5 o) ~0 F+ u
  64.                 $ E4 p( {% d5 T, p# ^6 ~
  65.                 ledCnt++;
    5 m5 T* U; I& D3 ~/ `1 D
  66.                 if(ledCnt>=50)
    $ O5 `. |3 C# i& \% Y% M
  67.                 {
    4 S7 j4 X9 C  w. W( F/ K8 }
  68.                         ledCnt=0;2 `. _0 a3 s; s. L$ g5 v2 v
  69.                         turn_prog_led();0 D. ^. q0 g9 B5 b
  70.                 }
    " z6 `8 X) V! D& E9 d% y
  71.                 8 W% q, i/ @, u
  72.                 delay_ms(10);
    - ]# o6 I& ]( ?3 [  ^
  73.         }" U" c& l2 D' r8 p6 ]- q, b. Z" o
  74. }
    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, |
  1. #include "wk2168.h"% X; x; f$ _* g0 f& S* s& s
  2. #include "delay.h"
    . ^! ^% N7 B6 p# P

  3. 2 p- c  q' B5 q9 ]; X4 d  ~5 t6 {
  4. # y8 f; j; E+ @. \" W& f
  5. void wk2168_init(void)
    + g& n" |/ Z9 G; G" e: J, r9 A
  6. {
    " s% v# T( X9 [8 q* m! I
  7.         GPIO_InitTypeDef GPIO_InitStructure;6 k! T- {1 Y) c8 p7 y
  8.         SPI_InitTypeDef SPI_InitStructure;
    ; ^- r- o' Z/ F! L# y  W
  9.         
    : g4 e! t/ F9 W! R6 o$ f% }
  10.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE );        
    - t, }! y' }& s1 v# U8 [
  11.         & h$ Z" f# }, E% S- O* L
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA0--INT#
    ) `2 I6 i' Y4 y( s* F
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        ) n# m; b4 l7 N( o
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
    ( \3 f) L" P: P  T/ {- @: O
  15.         GPIO_Init( GPIOB, &GPIO_InitStructure );
    . `) Z" M- A7 {- Q; W$ N
  16.         
    * F- n/ {, P' C- v- g
  17.         4 ~9 z) B5 y6 E$ y/ b
  18.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//SPI1_RST6 ?( d2 C* G' u4 t
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
    ( {  ^8 h7 W4 \' I( S8 b9 R
  20.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        2 N+ t9 H4 g; o" F/ e2 F8 a1 r
  21.         GPIO_Init( GPIOB, &GPIO_InitStructure );/ v) U5 @" Q  T- X* ]
  22.         GPIO_SetBits(GPIOB,GPIO_Pin_0);
    7 |" h3 K8 O* w4 O& [  D# R
  23.         ' c6 V5 ~2 ^1 s; o
  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI1_CS
    9 O1 J1 C* _1 a3 k" z
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
    ( q% ^5 e' T- l; ?: }' ~
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
    + p  E8 w: C$ w) p! j/ ^
  27.         GPIO_Init( GPIOA, &GPIO_InitStructure );, A0 ~6 R3 F* ]) P/ G0 O
  28.         GPIO_SetBits(GPIOA,GPIO_Pin_4);6 O* I3 b6 }! o! a& r! A
  29.         " ?. F0 ?  D+ a& Y
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//SPI1_SCK. p  L$ B1 {' ~
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
    " |- }6 _9 i6 Y7 Q' E; Q& ~
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- F1 w3 f: i8 ]6 b3 q
  33.         GPIO_Init( GPIOA, &GPIO_InitStructure );        # ?$ \! O3 x+ S% N6 o1 V  q6 n! W
  34. 9 S! W6 g% `4 Y; s& o/ e! ]
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//SPI1_MISO8 {+ g6 r% z0 T" W: y4 I/ x; [! b
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                ( y! g  c& m& \7 ]
  37.         GPIO_Init( GPIOA, &GPIO_InitStructure );        
    $ m4 ]8 z/ `1 Z7 o" s3 i
  38.         
    9 i; z+ g( i$ Y+ E3 m" _
  39.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//SPI1_MOSI
    3 K# H$ I  s" T- |% H* z* T
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                0 q! q+ H8 E! n, u& A# |7 j1 @
  41.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    9 L; e4 H& Y4 h  d7 }: L6 V8 j
  42.         GPIO_Init( GPIOA, &GPIO_InitStructure );) B% M, E  L+ ~" I# f6 K
  43.         2 ~3 Q  e, w3 h3 J5 h0 A
  44.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        5 u2 L, s- I4 L( \, @) }3 ^
  45.         
    # J; u* X5 \% ?* u( K3 z) d0 e
  46.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        
    . E7 y8 D7 G1 `" I$ N6 b

  47. 8 v, i! A, J2 _2 o( H$ @
  48.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        * s* S1 R* g9 I! X" H+ C
  49.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        ! d! b( ^  D) [4 D) u- P$ b) |% u
  50.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        ( K! K2 F* t. q( w4 v& @
  51.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        % b; F: [# l( Z  \" h" H
  52.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;& |& o' G4 _& j' Q; q  t
  53.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        $ ~7 r3 X. g( t! M+ @
  54.         SPI_InitStructure.SPI_CRCPolynomial = 7;; k6 ?8 M# i' r; y* H
  55.         SPI_Init( SPI1, &SPI_InitStructure );
    ; K! A, A9 J; C' t! k5 a1 y* V
  56.   J% L3 K; y0 g' p  G& q$ F/ X
  57.         SPI_Cmd( SPI1, ENABLE );+ H# N# z& j  G4 s
  58.         
    ( R7 Q% s$ ~7 {7 B8 K# A

  59. ' l% \: P( d$ _2 v% z) F) h8 j8 h
  60.         wk2168_rst=0;
    9 D' Z# p2 m- @; @, f# P4 r% u) [
  61.         delay_ms(50);2 O8 A+ F* e$ |+ n3 R3 E4 y! D
  62.         wk2168_rst=1;
    8 ]  m4 x: \! t  K8 C' G/ @
  63.         delay_ms(10);" j. r- f& W0 m
  64.         - ]2 ]9 G8 [# n# N
  65. }
    ' }8 e6 z' {6 ~/ _( @9 ]* n
  66. " P0 n! }" P3 W( f3 M' g: G9 E
  67. void wk2168_exit_init()& c" `) E7 `' E( V  @6 O& n
  68. {+ h. Z# u/ {. ]: R' @" q
  69.          EXTI_InitTypeDef EXTI_InitStructure;
    # P" m4 I1 w# B# W: ?9 t" T
  70.          NVIC_InitTypeDef NVIC_InitStructure;
    ) H0 \) ~0 L+ ]

  71. 2 ?$ ]  F# f% X" y4 Z
  72.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
    0 d5 Z$ k5 E* I& f
  73. 4 ^7 o, g; ~7 {5 Z$ D
  74. 3 O( R) D  u7 P0 I+ t/ ^+ ?6 P) s
  75.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//下降沿触发
    / ^. c2 f* [. B3 w8 p( x

  76. $ R7 v! N& g7 z; v
  77.           EXTI_InitStructure.EXTI_Line=EXTI_Line1;        
    ; r! C! G& q" B4 E& D& C
  78.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
    - P; g& Y/ F; J# ]! o/ N- l+ S
  79.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;- P  o6 o- y1 r" M8 p. e
  80.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    5 Q7 g- F! G" c) s% Q
  81.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器+ I6 Q1 e; L0 h, o% [5 i
  82. 7 m: ]* O1 l- Z9 Z5 {2 D
  83.     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
    ) W' n* T2 O  T+ k+ O) ~
  84.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2, " P% ^- T( x* K0 a+ c
  85.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级2
    . d, ^! ?  B. `, A6 D
  86.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
    5 y; b% U2 Z2 E0 O1 O
  87.           NVIC_Init(&NVIC_InitStructure);        7 r5 j# u. W3 [8 x, m
  88. }
    9 K' b; V1 P5 E, o% \# a; G% ]5 Y
  89. void wk2168_exti_enable(void)3 x- D" V8 j4 e! \& D/ n6 n* `" A3 q
  90. {
    & W$ ?' W4 Q4 f* s" X+ J$ B
  91.         NVIC_InitTypeDef NVIC_InitStructure;: f' f$ v# X" l& F4 |, Y2 i5 g
  92.         / {! m" t3 D; g# G! c8 V
  93.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
    2 J- x5 J4 z# b" F* {  W" R
  94.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级2, . w: |. l7 h* m2 B
  95.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级2
    8 X1 m% c; [3 F, Q. M' |3 d: {
  96.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
    4 S7 g, \0 k: s; G6 |: X; _" U
  97.           NVIC_Init(&NVIC_InitStructure);
    % {7 U% t  e+ l, `, @( Z
  98. }& m( F3 [' U9 O; E. [

  99. . V/ P6 x, k. o. Z) D
  100. void wk2168_exti_disable(void)) E/ k# k) `  Q  a0 v
  101. {
    4 [2 {8 R; W' B( m" _% ~
  102.         NVIC_InitTypeDef NVIC_InitStructure;  p4 c* J3 n- q! g" S+ v( }4 s
  103.         % a6 m: ^! `& B, V7 {5 H& S- Z
  104.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
    , v# E* [; ]% d
  105.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级2,
    $ g* W2 w# L' s6 t: i
  106.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级2
    3 a7 d0 U2 G- f1 O4 M! A
  107.           NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;                                                                //使能外部中断通道( S# `# ~2 J/ A% T( _8 a
  108.           NVIC_Init(&NVIC_InitStructure);3 l5 N2 L+ B( Z7 {( ^3 c) Y4 W
  109. }
    5 ~9 D9 b5 Z: |) U6 N. q6 p; V2 z
  110. //外部中断0服务程序 7 q0 q( t3 H( d) b, s% f
  111. void EXTI1_IRQHandler(void)
    * K2 S, `9 k! }/ `' w
  112. {+ ~. M* n# Z& J
  113.         u8 gifr,rxbuf[256];5 i" k$ G4 B- S2 V
  114.         int rxlen;        
    0 e' \5 F! f3 J6 p: f
  115.         if(EXTI_GetFlagStatus(EXTI_Line1)!= RESET)) c' C* t4 `1 H! ?
  116.         {
    3 s  a* B& I% {1 y5 R/ R( u
  117.                 gifr=wk2168_read_g_reg(WK2XXX_GIFR);/**/
    5 Z; T4 V8 h% M& m- e
  118.                 do{7 a! p! e8 F* A& B5 T
  119.                         if(gifr&WK2XXX_UT1INT)//判断子串口1是否有中断, m+ g) `" P+ B6 @8 A; n1 M
  120.                         {
    : [! z3 y+ b# _: D+ ~6 Y2 O$ Y8 O
  121.                                 /*数据处理*/
    2 _9 M6 l+ b9 [& m. V
  122.                                 /*数据接收*/( F2 g" f: y2 U, p& H3 r! k+ C
  123.                                 rxlen=wk2168_rec_data(1,rxbuf);//一次接收的数据不会超过256Byte$ [: }4 R! \) j! i1 ~
  124.                                 /*数据发送*/9 X/ B' N+ H, P# N" }
  125.                                 //把接收的数据发送出去
      t7 c5 f; H1 \
  126.                                 wk2168_send_data(1,rxlen,rxbuf);4 ]' E0 H3 P! V  H# E; S

  127. 8 v" S2 c3 z3 N3 y& v
  128.                         }
    . ^5 U1 S" I! ^9 q4 h& o
  129.                         4 M( R/ ^6 w: J' Y3 P
  130.                         if(gifr&WK2XXX_UT2INT)//判断子串口2是否有中断
    * Q/ k6 J: ]. C* k
  131.                         {: }6 n7 l8 `6 D( M/ U3 ^1 ~
  132.                                 /*数据接收*/
    * n- j3 o4 x5 w% _$ R% |$ t
  133.                                 rxlen=wk2168_rec_data(2,rxbuf);//一次接收的数据不会超过256Byte
    4 ^( b. s+ F/ }8 i% B
  134.                                 /*数据发送*/
    5 `) C! |. G1 C4 i3 Q2 ^7 ]
  135.                                 //把接收的数据发送出去
    / d; m5 q; c, I6 D6 t
  136.                                 wk2168_send_data(2,rxlen,rxbuf);9 I7 t+ a- P- V3 E2 w1 S
  137.                         ! d: W& w) y. G) I" \6 i
  138.                           }; E0 P# ~' o- D" X% a( [
  139.                         if(gifr&WK2XXX_UT3INT)//判断子串口3是否有中断4 M8 Z% y# X" K! ~
  140.                         {
    7 k( P$ ?$ T* Q
  141.                                 /*数据接收*/
    8 @; d) A1 i# w1 Q4 I" S) R
  142.                                 rxlen=wk2168_rec_data(3,rxbuf);//一次接收的数据不会超过256Byte0 ]2 a4 g2 D0 c- {) Z: }5 u/ l) L
  143.                                 /*数据发送*/
    1 T* k# J1 ?' \$ S/ h5 Y
  144.                                 //把接收的数据发送出去
    4 p' D9 s  x1 O) q8 N5 l- q" d
  145.                                 wk2168_send_data(3,rxlen,rxbuf);
    + v8 A% C- M. \- n- n8 z
  146.                                 // printf("port!!!!\n");
    5 O0 ~, t5 e& M1 g0 U' t
  147.                         }) {  Z4 |  {& [2 j% M% c
  148.                         if(gifr&WK2XXX_UT4INT)//判断子串口4是否有中断" r# \; s: k# B. d5 b
  149.                         {5 N( r9 C5 b" t6 R5 V* L, M
  150.                                 /*数据接收*/
    : Q" x' R7 Q# Z7 w! G$ |, _: i
  151.                                 rxlen=wk2168_rec_data(4,rxbuf);//一次接收的数据不会超过256Byte8 a0 X1 ~$ L3 j: q' @+ K/ b
  152.                                 /*数据发送*/$ n$ x  ^' P7 J) I
  153.                                 //把接收的数据发送出去
    . j5 w1 Y3 X  Z' W
  154.                                 wk2168_send_data(4,rxlen,rxbuf);
    3 F# y9 A7 T9 e2 S) q7 M
  155.                         }
    & {1 m6 O0 S8 u0 B
  156.                         $ n& }9 T* R5 M
  157.                         gifr=wk2168_read_g_reg(WK2XXX_GIFR);( T' o$ Y( D% K% H( ]
  158.                         //printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);
    8 g0 w# C* o; f5 w/ f
  159.                 }while(gifr&0x0f);                                       
    , C) b5 g! N! D4 Q$ t8 X5 x
  160.                 EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE0上的中断标志位  
    , x& `, @9 J& J" x/ d( ^
  161.         }  J3 h. \0 Q5 k9 l- c3 T5 T( ~
  162. }  z! {" }3 e+ r" Y
  163. /* SPI交换一个字节接口 */
    " z& L( M1 c: [" X4 ^0 L
  164. u8 wk2168_spi_read_write_byte(u8 TxData)
    + q' e% ]! W1 e( h$ M5 K
  165. {, o. _4 G7 a* K( |
  166.         u8 retry=0;                                         
    ( x  c3 y. w3 u" k! s* _
  167.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
    # Q* d4 X- e; h* O% z! i$ u
  168.         {" ~# u: T0 G# L; H4 A
  169.                 retry++;
    ! W0 K& v& [8 I+ ^5 F7 i: a  {3 J
  170.                 if(retry>200)return 0;: B; W6 M; @4 M% }0 [! @% E4 R
  171.         }                          
    ( S2 G# `3 P; R. u  g+ H( f/ q
  172.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
    ; J, M1 K/ M0 x+ X% M: R! l* a2 ]
  173.         retry=0;8 P3 n" W$ Y8 l
  174. / L5 j" q" t8 z$ R
  175.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
    5 O! {8 T# K9 O- F# C4 z, d" b
  176.         {! s$ \4 C% Z* n' ^9 R
  177.                 retry++;) D+ Q0 q7 ~  {5 L4 b
  178.                 if(retry>200)return 0;0 p  v/ K7 r  h5 Q- j
  179.         }                                                              # m0 U& i8 H6 H, l
  180.         return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据        
    5 V, M5 K  K  `/ E' G& P7 h; i
  181. }7 f/ {: e5 T9 ]

  182. 2 J0 e! ]1 m8 K1 f
  183. /*************************************************************************/4 b% B, G; v+ d- y) |
  184. //函数功能:设置CS信号为高电平
    9 D* r7 O1 j5 h9 M% y
  185. /*************************************************************************/# Z' Q. o8 @* D1 p
  186. void wk2168_cs_high(void)% @& |. @5 G2 v) H1 n( [
  187. {
    : K8 n- f3 g$ J8 r6 f7 K
  188.         GPIO_SetBits(GPIOA,GPIO_Pin_4);- Q* o5 M! S% \7 u% X
  189. }) W# p$ M3 y, a* M  ?
  190. /*************************************************************************/
    0 p: X( ]7 m; Q+ U
  191. //函数功能:设置CS信号为低电平/ S2 B* a! }. I3 J+ `( d7 i
  192. /*************************************************************************/5 f5 c& X0 Q& D/ E' e; c% ?
  193. void wk2168_cs_low(void)
    $ R& K1 D( V. a( j0 ]8 H$ A" F
  194. {
    ( k" T! K/ |, e1 D+ l3 q+ S
  195.         GPIO_ResetBits(GPIOA,GPIO_Pin_4);5 j: I: x2 ]2 p3 Z5 a
  196. }2 F+ w) Q" A9 U
  197. /***************************wk2168_write_g_reg***********************************/7 M- ^- Z" O' r% o+ b5 l3 A7 [* I
  198. //函数功能:写全局寄存器函数(前提是该寄存器可写,: N9 W9 S! [/ k. `
  199. //某些寄存器如果你写1,可能会自动置1,具体见数据手册)
    $ M" R' e- y7 _" D: J0 b: ?
  200. //参数:
    4 h/ t/ j' t+ T3 {: p2 M
  201. //      greg:为全局寄存器的地址( f' N8 M/ {+ e6 F: G4 u' U
  202. //      dat:为写入寄存器的数据% i5 P% q$ _# D3 D( Y
  203. //***********************************************************************/) T8 U; i; b% ]; S1 d' \  g; k
  204. void wk2168_write_g_reg(unsigned char greg,unsigned char dat)5 t0 E  V" ~1 Q1 q7 k! E' b
  205. {         2 \% q- q  h& V! q
  206.         u8 cmd;
    ) U  B; h8 J. z- t" F; s) Z
  207.         cmd=0|greg;
    ) t' e8 {; P2 O' E' ?, H
  208.         wk2168_cs_low();//拉低cs信号" [- u( t$ u8 B3 y
  209.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
    1 E) m) [, W' ~1 A
  210.         wk2168_spi_read_write_byte(dat);//写数据- l/ |! b+ T+ P. ]& h8 S- L( c( Z4 t
  211.         wk2168_cs_high();//拉高cs信号
    5 o6 ~+ U- K4 ~/ }
  212. }
    ' O% R3 x& H6 f& U
  213. /****************************wk2168_read_g_reg***********************************/
    9 \; r3 m# y8 q. t5 z7 R
  214. //函数功能:读全局寄存器
      Y' G8 s& b6 S' M
  215. //参数:% A4 F# {: ^& L! e: q
  216. //      greg:为全局寄存器的地址, G/ X5 V- D+ x3 f) g9 n
  217. //      rec:返回的寄存器值+ e9 G1 }3 ~. r9 x
  218. //***********************************************************************/
    ; z# P( D9 c! j' N
  219. u8 wk2168_read_g_reg(unsigned char greg)1 s/ h3 H& ]( J6 ^, l" Y* f
  220. {         - z; R. o5 {) X/ Q' q' e! V* l( F% `9 e
  221.         u8 cmd,rec;. y: P& `: q# ?" ~
  222.         cmd=0x40|greg;% g7 n% ]+ }# J: T' Q: p
  223.         wk2168_cs_low();//拉低cs信号! V. v' D9 G2 Q7 _  V/ ]! _( D
  224.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
    . F  j2 j$ J: c6 Y) ]+ E* W' b
  225.         rec=wk2168_spi_read_write_byte(0);//写数据9 p) m& U' d2 `4 N1 J  u
  226.         wk2168_cs_high();//拉高cs信号                                                        
    ( K6 g' Z9 B# T- @( H4 }1 i
  227.         return rec;
    - e; ]! M" |& I4 F; e+ f6 Z2 B
  228. }$ H' V0 h. b9 ?; V4 b8 [

  229. : E" T' k4 O( s/ G7 I
  230. /**************************wk2168_write_s_reg***********************************/8 f" D, z9 Q: W; X! d
  231. //函数功能:
    * j7 C$ _( O+ o! S
  232. //参数:port:为子串口
    9 |4 P8 |1 ~4 [0 o7 ?8 m
  233. //      sreg:为子串口寄存器
    5 q, ^6 Y( {  w1 ]
  234. //      dat:为写入寄存器的数据
    6 R" [" i+ Q& A- _& E: O
  235. //注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出
    ! c0 K5 f/ E! }' N9 c+ l7 g
  236. //**********************************************************************// N( @/ g6 e+ ~3 d
  237. void wk2168_write_s_reg(u8 port,u8 sreg,u8 dat). F$ e( u* u9 l% o9 ?
  238. {         
    : ]: F5 E9 F3 W# [0 I1 N0 M$ ?# P0 r# e
  239.         u8 cmd;
    ; c$ y" x( r! Y
  240.         cmd=0x0|((port-1)<<4)|sreg;
    " d- h& E# N! m2 `9 z0 B4 l9 H6 y. a
  241.         wk2168_cs_low();//拉低cs信号
    $ t& c& d; D: v* O' U
  242.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
    # L: j# L% p7 }  j( r: @! G+ d
  243.         wk2168_spi_read_write_byte(dat);//写数据: i# l0 U% K( A! \. n/ x- ^
  244.         wk2168_cs_high();//拉高cs信号
    1 q4 a3 }) M8 p, I; M
  245. }9 `) X& q) }, S! L, n$ [4 e; }$ N2 L

  246. ; I2 ]) g) ^& t3 F. b; f) u1 E. g
  247. /**************************wk2168_read_s_reg***********************************/
    2 _' d% w' ?5 o; i" V* s% q
  248. //函数功能:读子串口寄存器; O, f' q) ^% x9 e) ]1 r4 L
  249. //参数:port为子串口端口号
    / W! U; u: H: h
  250. //      sreg:为子串口寄存器地址5 e# t# q$ H& O3 y; T
  251. //      rec:返回的寄存器值$ ]: Q+ M' p+ \+ H1 y+ J! Q
  252. //**********************************************************************/
    % a' j4 R! B4 J6 m5 {( |
  253. u8 wk2168_read_s_reg(u8 port,u8 sreg)6 T' b0 I; W% z( ^
  254. {         * O6 [1 l. q: K7 E5 x: v
  255.         u8 cmd,rec;
    + j3 a# F# U8 D1 h% n
  256.         cmd=0x40|((port-1)<<4)|sreg;
    % G( j7 p% R( ]  h( O% {0 Z
  257.         wk2168_cs_low();//拉低cs信号3 }3 Q6 y$ z5 Q5 B" N
  258.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册. N0 Y( R7 z; A: _& P
  259.         rec=wk2168_spi_read_write_byte(0);//写数据
    3 \* N  j; M' ?
  260.         wk2168_cs_high();        //拉高cs信号                                                        / I+ C% D+ n4 j& {5 \
  261.         return rec;0 n: V* ]# e- R$ k/ W$ W
  262. }. |$ }/ P! J) }6 u1 n
  263. /************************wk2168_write_s_fifo***********************************/& M$ o( p$ `8 F* A0 `- H4 g
  264. //函数功能:向子串口fifo写入需要发送的数据
    / E) k, I2 Z6 ]8 r9 k: d
  265. //参数:port:为子串口# p. R# H- K2 w2 Q4 x' U1 q: s
  266. //      *dat:写入数据
    $ J9 T' A- ~8 z  K+ }% a4 H% P' n
  267. //      num:为写入数据的个数,单次不超过256
    6 j% m8 b: b# E: O: ~3 ~0 K" P0 O
  268. //注意:通过该方式写入的数据,被直接写入子串口的缓存FIFO,然后被发送+ a" h  X8 \1 k0 x9 s
  269. //*********************************************************************/6 P' Q! @5 ?* M' V2 n4 d6 r( [
  270. void wk2168_write_s_fifo(u8 port,u8 *dat,int num)
    0 \8 F3 S& X" B' F8 T, x
  271. {         2 G2 O* `/ [; [; J  d- b
  272.         u8 cmd;3 e( m0 p( o9 y, l8 [1 K- [
  273.         int i;) v4 f: \6 Z6 J; }
  274.         cmd=0x80|((port-1)<<4);
    9 G5 A% |- i0 d3 x
  275.         if(num>0)1 j4 h# G! ^& L1 v8 h/ S, t
  276.         {) p% R0 r, V! t# X. v! p' s9 C: k
  277.                 wk2168_cs_low();//拉低cs信号
    / R# t! k- H. q3 `$ V
  278.                 wk2168_spi_read_write_byte(cmd); //写指令,对于指令构成见数据手册/ d" L3 w$ O: Q, G! r
  279.                 for(i=0;i<num;i++)
    " c$ O* U% ]4 t- X; U: k
  280.                 {: C% Z9 a4 G, c" A5 h
  281.                         wk2168_spi_read_write_byte( *(dat+i));//写数据
    1 w# {6 Q. ]! X: \6 o0 l
  282.                 }
    - f5 q$ ?: r5 a1 S6 _
  283.                 wk2168_cs_high();//拉高cs信号6 M# u2 |4 s8 |3 M4 U" h# j) m9 q* o
  284.         }
    & z( d" {+ I, y* N0 H+ O$ I
  285. }
    5 b: v4 h/ v* T! R
  286. 6 s6 \  q- Z% B% I3 ~( E" A8 U
  287. /************************wk2168_read_s_fifo***********************************/* }3 _, A; \) @5 i* y# ]. w
  288. //函数功能:从子串口的fifo中读出接收到的数据
    " h- v/ U8 E1 C# n  v" q
  289. //参数:port:为子串口! x5 [( q& N* j  K
  290. //      *rec:接收到的数据
    $ b2 R) Z. t8 ]( s5 h+ R
  291. //      num:读出的数据个数。
    9 L- u# w  a: }: A: M
  292. //注意:通过该方式读出子串口缓存中的数据。单次不能超过256
    * R  [0 |7 G  b/ I
  293. //*********************************************************************/& q$ b- r( U; f
  294. void wk2168_read_s_fifo(u8 port,u8 *rec,int num)
    1 d9 {2 j- l! W. h! r
  295. {
    1 k! T: {) j( b
  296.         u8 cmd;
    ( v6 k2 n& p& X3 }! \, @
  297.         int n;6 H; u3 Q9 |/ r" F; b: U4 r
  298.         cmd=0xc0|((port-1)<<4);
    # c/ k# p4 a" z. @: V
  299.         if(num>0)
    * s- u9 N& }/ B
  300.         {% i( N3 p' W( V. c, @& ?
  301.                 wk2168_cs_low();//拉低cs信号' D) S# c, G- R2 y4 v
  302.                 wk2168_spi_read_write_byte(cmd);
    % M0 g, i: b3 r1 x
  303.                 for(n=0;n<num;n++)
    # j, s! F% V2 Z* k' E# r8 k
  304.                 {        # P/ m3 |2 K* Q) q0 B6 F8 T( O
  305.                         *(rec+n)=wk2168_spi_read_write_byte(0);        8 q& n6 R& k1 B0 g9 p: B
  306.                 }6 G! c$ v8 z" q( i
  307.                 wk2168_cs_high();//拉高cs信号
    8 Z+ L# Z( P, Z
  308.         }
    - K8 z6 }! E( g7 L% i
  309. }; D3 t) A$ c+ @6 w
  310. $ ^6 {; O3 H( l  b: R
  311. : T2 |$ Q& q4 \3 c/ O4 w- z: x
  312. /*******WkInit*******************************************/
    4 O. ]/ J6 q- m$ W' q
  313. //函数功能:初始化子串口
    . {( Z1 p$ ]6 e# @3 G& i
  314. /*******************************************************/
    , U! _1 E+ Z. z* r% j! ~8 I
  315. void wk2168_sub_uart_init(u8 port)
    - \3 H- d! Y% t- Y/ L) h! {$ @
  316. {
    ) k; V( M, W8 K3 P% P1 Y3 l
  317.         u8 gena,grst,gier,sier,scr;3 [) K" }& n* ?9 f5 O
  318.         //使能子串口时钟/ j  q+ j( d2 T# m% p; U
  319.         gena=wk2168_read_g_reg(WK2XXX_GENA);
    * o+ B; R) v8 H, d
  320.         gena=gena|(1<<(port-1));
    + D1 g' g$ ~" G. b
  321.         wk2168_write_g_reg(WK2XXX_GENA,gena);
    ! k) h4 T! E4 }3 w3 |" V
  322.         //软件复位子串口* k0 [1 B7 e+ M! k( r  V
  323.         grst=wk2168_read_g_reg(WK2XXX_GRST);: i) n9 i. n- r' ]* ^4 `
  324.         grst=grst|(1<<(port-1));
    ; a4 k" ]% a! f* ~
  325.         wk2168_write_g_reg(WK2XXX_GRST,grst);$ _* G1 l' r9 N
  326.         //使能串口总中断
    ' V+ {; u3 T, ~5 O
  327.         gier=wk2168_read_g_reg(WK2XXX_GIER);$ F- Y$ i8 f, q# q2 D+ k5 G8 S& p. |
  328.         gier=gier|(1<<(port-1));" A# n6 X& p/ n0 P
  329.         wk2168_write_g_reg(WK2XXX_GIER,gier);: }# T. N. i0 S( S7 S
  330.         //使能子串口接收触点中断和超时中断8 \4 d$ p* R  J/ a3 ?; c
  331.         sier=wk2168_read_s_reg(port,WK2XXX_SIER); & K: L' k0 p9 d- _. U/ U# ?8 [
  332.         sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;* u& M6 n; w/ N; S5 X7 S7 V- }
  333.         wk2168_write_s_reg(port,WK2XXX_SIER,sier);
    , M4 l5 z0 X% ]4 C# D1 j$ E( E$ |
  334.         //初始化FIFO和设置固定中断触点- P3 W% ?$ W- V% I
  335.         wk2168_write_s_reg(port,WK2XXX_FCR,0XFF);  
    ; q% J: p8 T4 F' x  k
  336.         //设置任意中断触点,如果下面的设置有效,: Q; W7 U' J* ?! P4 ?- {* G
  337.         //那么上面FCR寄存器中断的固定中断触点将失效2 \, v1 K; I0 t( e' P
  338.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page11 C8 s! n3 m: \% T& r, v6 ]
  339.         wk2168_write_s_reg(port,WK2XXX_RFTL,0X40);//设置接收触点为64个字节
    4 r3 s" l. ?9 @5 f0 |. U7 x* Q" C
  340.         wk2168_write_s_reg(port,WK2XXX_TFTL,0X10);//设置发送触点为16个字节+ {( d$ n( I  T* L) ^) ?
  341.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
    * z6 t9 L4 T* Q" F
  342.         //使能子串口的发送和接收使能
    , A) ]" `# b3 K/ i. {: V/ A8 b
  343.         scr=wk2168_read_s_reg(port,WK2XXX_SCR); + L6 h% r5 i' W- I
  344.         scr|=WK2XXX_TXEN|WK2XXX_RXEN;
    9 e$ W$ [) m/ L, U7 h
  345.         wk2168_write_s_reg(port,WK2XXX_SCR,scr);                          8 y. b: f$ P2 [0 n6 N& c6 Z! `
  346. }
    & P  q. i0 @$ [3 v* b  q3 g

  347. 4 z6 a$ h: x+ K
  348. /******************************wk2168_sub_uart_deinit*******************************************/8 Y) V6 l; Y  ?* i8 b3 Q, d
  349. //函数功能:初始化子串口% {9 S0 g4 p/ t4 A/ v* C  ?
  350. /*********************************************************************************/) m# ]$ A$ q) x8 [4 i$ U( K
  351. void wk2168_sub_uart_deinit(u8 port): ^* J1 q, k' j, ^# O* G: h
  352. {
    % J7 s' }) x4 _( R, `' T9 w
  353.         u8 gena,grst,gier;
    / i( |  W' s, S( A
  354.         //关闭子串口总时钟, o( f" ]1 J) `1 }. J
  355.         gena=wk2168_read_g_reg(WK2XXX_GENA);
    3 ]7 Q/ @6 O% ?" T
  356.         gena=gena&(~(1<<(port-1)));
    7 _/ X' }* w5 k4 Y2 @  b0 e, l
  357.         wk2168_write_g_reg(WK2XXX_GENA,gena);* A! M4 T6 u( j( k6 A! k% P
  358.         //使能子串口总中断
    - @- G) i3 S; u7 ]9 \2 b+ h( u/ F
  359.         gier=wk2168_read_g_reg(WK2XXX_GIER);9 U6 x  `. r& @" _1 |( V+ z7 J' f
  360.         gier=gier&(~(1<<(port-1)));
    ! H$ C. i" T  q) b
  361.         wk2168_write_g_reg(WK2XXX_GIER,gier);
    2 i8 }! T) ?/ ]8 n! |  B1 m# ^% ~) h  D
  362.         //软件复位子串口3 @3 \, [5 b6 X. @& d
  363.         grst=wk2168_read_g_reg(WK2XXX_GRST);" i. L. c8 S; [) X- ]  m# @
  364.         grst=grst|(1<<(port-1));
    4 F6 p* M. a9 U
  365.         wk2168_write_g_reg(WK2XXX_GRST,grst);, p' n. X; h/ N0 H* i( y
  366.         : A% @* B* s, `
  367. }7 k. h5 Z. K. {% x! L4 E* m/ F
  368. + s7 @5 ~# |+ X! c  c8 l
  369. /**************************wk2168_set_baudrate*******************************************************/
    # i# L  ?% Z( O7 z2 o* l
  370. //函数功能:设置子串口波特率函数、此函数中波特率的匹配值是根据11.0592Mhz下的外部晶振计算的9 C- g( \! w6 Y) A
  371. // port:子串口号
    $ Q6 Y5 H0 i0 o# O
  372. // baud:波特率大小.波特率表示方式,
    % S* u# E" H8 o' p
  373. /**************************Wk2114SetBaud*******************************************************/4 @) [( i6 ]  j8 a/ c
  374. void wk2168_set_baudrate(u8 port,enum WKBaud baud)1 ?" l) a8 A; M  e6 ]
  375. {  ' B9 t* v0 l! Q/ ~, D: C7 c/ T
  376.         unsigned char baud1,baud0,pres,scr;
    # R+ _" J2 g& s, @9 ~, x3 S! G( b
  377.         //如下波特率相应的寄存器值,是在外部时钟为11.0592mhz的情况下计算所得,如果使用其他晶振,需要重新计算
    ; K% [' {3 @+ T. p3 ?1 S! _
  378.         switch (baud)
    ' d0 N- R$ m( s) q
  379.         {
    ) ^: F4 K% ]" J+ A: O0 r' t; c
  380.                 case B600:  x1 {2 ^6 s% q; N
  381.                         baud1=0x4;$ v5 ?1 f$ L4 v" s" t8 |% Z! B
  382.                         baud0=0x7f;
    2 k$ o! W" d6 j# e4 X$ E1 z
  383.                         pres=0;! R" X+ J6 M* J
  384.                         break;2 ?! h; {5 F+ w7 K
  385.                 case B1200:
    3 p( q: {0 z+ I/ X+ B* j
  386.                         baud1=0x2;
    ; b( l, j/ ]) T9 D1 E5 D* `0 W
  387.                         baud0=0x3F;
    " E* z) J; ~9 F
  388.                         pres=0;. w* F5 B8 W% p7 `1 C
  389.                         break;* _- w4 u9 L7 O) |, {! p
  390.                 case B2400:3 ^$ X" \! z7 t) y" V
  391.                         baud1=0x1;3 S6 k" u+ j' O9 @  H
  392.                         baud0=0x1f;
    $ j- Y$ D5 S; `( c/ t
  393.                         pres=0;3 D6 @5 I8 r! W
  394.                         break;; I& _/ @# V6 R& z6 |2 {
  395.                 case B4800:
    7 Q( t& a2 M: H6 Q, l- M
  396.                         baud1=0x00;! k9 g! }, P! h1 G
  397.                         baud0=0x8f;( _" D# G( F1 P4 ^. h
  398.                         pres=0;$ ?% f0 J5 {; B& _$ ^2 I" ]
  399.                         break;4 o4 P$ @6 a( f0 X! |' |  ]
  400.                 case B9600:
    , ]. e& d4 p( i
  401.                         baud1=0x00;  \/ b" m/ b4 J4 B/ X
  402.                         baud0=0x47;
    " p' a% q: M$ r4 ~
  403.                         pres=0;8 g$ {* [  y& J  R4 P
  404.                         break;
    6 n7 F: m( |! M
  405.                 case B19200:
    8 \5 F& E7 U: ?& u  d' r6 {4 h7 W
  406.                         baud1=0x00;
    % A( C3 o# v/ F0 X# Z: E0 [3 s
  407.                         baud0=0x23;( r; }. U# \  q2 Y& Y# Y1 q9 x, D; w% ]
  408.                         pres=0;# b0 Y8 j4 E6 ]8 Y+ Y4 s/ {4 `
  409.                         break;
    . ^. {# i3 y* b0 l7 V7 m1 W
  410.                 case B38400:
    / R. y& w0 E' ~
  411.                         baud1=0x00;
    : m9 i% g7 y+ h- Q6 Z. v0 k# E
  412.                         baud0=0x11;
      d% ]" E' H1 Z! c$ @, y
  413.                         pres=0;
    5 Y  v& y8 n  L
  414.                         break;
    1 P3 I& o' l! a$ R- W
  415.                 case B76800:
    : M, f. r5 M$ `% n) d' }5 P
  416.                         baud1=0x00;
    2 U+ o: N) u8 f8 ^; l% H) V
  417.                         baud0=0x08;) [6 |9 T0 N, F* I3 C
  418.                         pres=0;+ f! K7 B# j9 ^! y- O/ n
  419.                         break;        1 F3 X, p. e2 e1 v0 V( f( `5 g9 v
  420.                 case B1800:/ K3 G/ \9 V2 G, q0 p
  421.                         baud1=0x01;7 q7 y0 z  G7 t1 ?3 d' N
  422.                         baud0=0x7f;
    , H& I7 z" B+ |- U6 \
  423.                         pres=0;' S5 d; |4 X7 m2 Z: P' g& a
  424.                         break;
    1 R/ v6 q# s) v2 {" J" M
  425.                 case B3600:! C# Q. o9 {: x# |
  426.                         baud1=0x00;" a! ^3 f- Q: P. Z
  427.                         baud0=0xbf;
    ' U* ^# Y5 F1 g8 R
  428.                         pres=0;
    & \5 V" o9 C3 R5 S& j6 V
  429.                         break;. i- j/ l$ C4 f: m0 ?
  430.                 case B7200:6 Q3 r" e4 c5 m: k2 e
  431.                         baud1=0x00;
    + W6 D2 J5 N# F# U* }8 \
  432.                         baud0=0x5f;# l6 \% ~6 O; p
  433.                         pres=0;
    + H7 _8 ]7 |# c9 s7 D3 k8 \: `
  434.                         break;
      M$ e2 c4 e& p" O* f8 A
  435.                 case B14400:
    7 Q7 t/ s" o8 C% ~' b  z% Y
  436.                         baud1=0x00;
    + I' l* |& A+ j8 d
  437.                         baud0=0x2f;' Y* _: j/ p: W( I$ N
  438.                         pres=0;
    * F* q: D( Y* ^( b7 ?: x+ r
  439.                         break;
    / o9 x5 C/ r. v8 I/ @8 [
  440.                 case B28800:
    9 s5 P3 R( c# c$ R8 n7 j
  441.                         baud1=0x00;8 k5 K# r/ X5 b
  442.                         baud0=0x17;3 _9 q. D$ x% j: _9 ]4 ~
  443.                         pres=0;
    2 i" @& J; `5 N* ~
  444.                         break;, w% K5 B- @  K6 _2 i8 p6 @' \$ n
  445.                 case B57600:3 u: m1 J7 z! ^
  446.                         baud1=0x00;- e! ~- F* Z! C+ O- d
  447.                         baud0=0x0b;5 H/ F+ n4 K% `) s5 b8 ^6 I, N
  448.                         pres=0;# P% q- R  {' b/ A
  449.                         break;
      u% e; I4 ~. N, t* X) t
  450.                 case B115200:
    8 W! i+ e, g9 s0 l! `
  451.                         baud1=0x00;
    4 s  P9 O, a" A
  452.                         baud0=0x05;
    6 K. A. H' W+ T8 }& r1 t4 x* X
  453.                         pres=0;. r" i/ d7 l: k  k
  454.                         break;
    + T5 {4 u% f: E) x, x# y, }
  455.                 case B230400:) g9 h0 Q: D) L8 `! M; W
  456.                         baud1=0x00;( N& A* H+ ^" N# A% d, B" S/ F8 I
  457.                         baud0=0x02;0 {! v# |( j, c( l: G
  458.                         pres=0;5 N& d6 j9 B2 _2 x
  459.                         break;
    , g# @8 i, |) v" z. p
  460.                 default:5 u+ I7 X7 e& Z7 R
  461.                         baud1=0x00;, V& [2 I7 z. u) \$ E$ B: j/ b
  462.                         baud0=0x00;
    5 J, c( m8 r+ H/ Y& |
  463.                         pres=0;
    $ i" f- ?: S6 `5 M# ]3 j6 m
  464.     }1 {1 B3 {9 J, k! p
  465.         //关掉子串口收发使能3 l' B3 Z# S$ f  s, Z7 U4 t
  466.         scr=wk2168_read_s_reg(port,WK2XXX_SCR);
    5 n$ ]6 Q7 ^9 a# |; O3 W; X5 D
  467.         wk2168_write_s_reg(port,WK2XXX_SCR,0);
    4 p" J0 O" ^- ?! p# X' x, R
  468.         //设置波特率相关寄存器
    ( D0 U: ]! G6 u+ D3 K0 j8 G
  469.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page10 {* K  j8 {7 g4 Y6 R
  470.         wk2168_write_s_reg(port,WK2XXX_BAUD1,baud1);9 z) u0 ]- v' I1 N: H
  471.         wk2168_write_s_reg(port,WK2XXX_BAUD0,baud0);
    ; T. N. C) D- f/ p1 S
  472.         wk2168_write_s_reg(port,WK2XXX_PRES,pres);- }9 @+ ?8 t" D8 \) A4 ?! _0 J8 f
  473.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
    ( z* V! W% V, b+ F; f, C
  474.         //使能子串口收发使能- h- o3 R/ {" b: s7 U. G
  475.         wk2168_write_s_reg(port,WK2XXX_SCR,scr);" _% X+ a* a: B
  476. }8 G1 r6 J+ T8 Q! }
  477. /**************************wk2168_get_tx_len*******************************************/0 [, ]( B' x8 k' m1 d/ g& n& d0 T
  478. //函数功能:获取子串口发送FIFO剩余空间长度) X6 W% i" `6 ^0 S9 Q  r
  479. // port:端口号5 x, e" [  d4 ?& n( {3 o4 d8 [% K0 X
  480. // 返回值:发送FIFO剩余空间长度) y# _+ |2 `2 O& ^
  481. /**************************WK_Len********************************************/! ^9 z* s0 ]/ k  l# @" r
  482. int wk2168_get_tx_len(u8 port)
    3 A+ [5 U+ M$ V4 f) m
  483. {
    9 C8 a7 R" b2 k5 L
  484.         u8 fsr,tfcnt;
    % Z& G4 z: N2 d5 |* o
  485.         int len=0;0 {# z' g3 l9 I" P7 v7 D1 F2 k* U
  486.         fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);5 X0 `# K* D# q6 s, \) D
  487.         tfcnt=wk2168_read_s_reg(port,WK2XXX_TFCNT);
    . D6 U* u1 T* I* k5 N  t0 o
  488.         if(fsr& WK2XXX_TFULL)3 |! k, t# I  z( q3 R9 r
  489.         {
    # p* c6 k7 J7 c* P8 t
  490.                 len=0;
    , t- y' a  b7 m5 E
  491.         }5 V" Q; r) ]- t* `" F
  492.         else
    0 \6 S8 |$ x. H/ ^, V: }; [
  493.         {! {! T% Z( v) ~7 g
  494.                 len=256-tfcnt;
    + u- ^! R, h: h1 b4 K2 ~7 M
  495.         }7 B& I& J" Y8 g3 g
  496.         return len;8 O+ p  ]3 ]: k5 ?  v. |
  497. }
    3 ]4 ]- `& j% W4 ?
  498. # Q2 x* x1 w* z" O* M
  499. /**************************wk2168_send_data*******************************************/
    & e- X* _- R) O5 ^
  500. //函数功能:通过子串口发送固定长度数据* `& U; b8 d& B# ~8 p; x8 q* Z
  501. // port:端口号6 p" f' `4 k0 T9 ~
  502. // len:单次发送长度不超过256
    # t. o5 S# `/ A7 Y3 q: ?; k3 v
  503. //
    / C# M' E% z( I& J8 I& v2 O
  504. /**************************wk2168_send_data********************************************/  h7 u' i; T3 E; T
  505. int wk2168_send_data(u8 port,int len,u8 *sendbuf)# b# d3 n0 c1 F( N9 _! S$ f
  506. {0 T0 v5 y1 V. i. S' d2 P! p, Q
  507.         ) C" d7 _2 t0 T% v
  508. #if 1
    6 Z) k- N5 V' @3 D) L( l- b
  509.         wk2168_write_s_fifo(port,sendbuf,len);//通过fifo方式发送数据- f+ M, {2 Q9 P8 U
  510. #else, ^( ^% ~( Q6 j9 \
  511.         int num=len;6 ~8 C  ^) G4 u
  512.         for(num=0;num<len;num++)% W6 N0 Q' c) ~( N  e6 M* L: C
  513.         {
    2 r- S8 i6 Y) z& i$ ]
  514.                 wk2168_write_s_reg(port,WK2XXX_FDAT,*(sendbuf+num));9 q  i& W8 y/ {7 A) `/ P
  515.         }
    ! V0 L6 S+ y' D0 j, }
  516. #endif        ' O: r# H& v  g: D
  517.         return 0;
    7 v; M0 Y# m: n/ O- m7 W; i
  518. }/ G" x7 L- e$ T; f$ W& z

  519. * ?( K: G/ b0 F+ ?" |" A
  520. /**************************wk2168_rec_data*******************************************/
      }, z3 }$ [' a8 {- m+ q
  521. //函数功能:读取子串口fifo中的数据
    2 \4 ~3 i: |# ^+ ~3 }0 o
  522. // port:端口号
    ( a( [9 g" i2 e2 i$ i$ }( a+ v
  523. // recbuf:接收到的数据* f, n; @7 g+ a* l) s
  524. // 返回值:接收数据的长度
    * e" [1 d& d" Z( t0 c1 T' |
  525. /**************************wk2168_rec_data********************************************/
    1 h! M, U1 s3 s9 j
  526. int wk2168_rec_data(u8 port,u8 *recbuf)
    4 y: `: c- H8 P  @$ o7 A' K
  527. {
    1 A: e; O+ ~: i# g5 C( P" Y; a
  528.         u8  fsr=0,rfcnt=0,rfcnt2=0,sifr=0;, l9 D8 t% i' W! ~3 E4 B
  529.         int len=0;
    8 N# A& N, ]( ^" c  `& I& h
  530.         sifr=wk2168_read_s_reg(port,WK2XXX_SIFR);
    ' @% O3 R: I0 _( i
  531.         ' [& f: |$ v  G! c& S) i

  532. " ?0 e, c/ y, k3 |, G( t  @. A
  533.         if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中断和接收超时中断
    $ `8 N, f& Z7 A+ t' ~& c4 w1 D9 v
  534.         { % R( G; }1 W8 n9 [: u! L+ V
  535.                 fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);
    . k% T, ~1 |4 h+ \, }3 G
  536.                 rfcnt=wk2168_read_s_reg(port,WK2XXX_RFCNT);
    * K3 `: |& K- \2 M( v. Q/ b
  537.                 rfcnt2=wk2168_read_s_reg(port,WK2XXX_RFCNT);3 i$ Z; G+ [+ |1 h/ q/ o3 r
  538.                 //printf("rfcnt=0x%x.\n",rfcnt);" C9 l$ w  Q6 D1 s0 Z
  539.                 /*判断fifo中数据个数*/" ^# ^8 M: v4 _" v
  540.                 if(fsr& WK2XXX_RDAT)
    0 J7 |8 \- n! _# Y8 b
  541.                 { " r9 R& G2 o# F
  542.                         if(!(rfcnt2>=rfcnt))
    3 Y' E- p4 y& H1 T0 x5 U
  543.                         {- W+ K4 [6 K* ~) j+ D$ L* V
  544.                                 rfcnt=rfcnt2;
    1 Z  N( n( o1 {# l! A
  545.                         }
    $ H4 C3 b8 u& L5 ~
  546.                         len=(rfcnt==0)?256:rfcnt;/ O8 h' @" u1 g
  547.                 }) g+ y" y2 S3 q
  548. #if 1& m$ q4 E6 A6 V3 a3 K$ d9 O. t* ~
  549.                 wk2168_read_s_fifo(port,recbuf,len);
    5 m" g! i; a/ g" a" ~/ u, E3 f4 `
  550. #else# V! `5 B4 C) _+ a- X9 B
  551.                 for(n=0;n<len;n++)9 |7 O; i* W; |
  552.                  *(recbuf+n)=wk2168_read_s_reg(port,WK2XXX_FDAT);5 ^9 U5 ]6 Z# b) Z) i
  553. #endif        3 a7 j" x4 O+ R; Y9 Z
  554.                 return len;1 [8 z+ N- v$ f1 ]) {
  555.         }( {9 e; y2 N6 {8 ^
  556.         else
    5 ~3 E( N- v0 @  O7 f3 [/ d, Y
  557.         {4 n4 D, A! U3 ]9 h6 c! {( S9 [
  558.                 len=0;
    : h# D, g4 T$ ^8 e) \: j
  559.                 return len;* V( Z/ O: y3 v7 B* Q2 I3 k
  560.         }" @  Y& m5 k, ?# B
  561. }
    + T' R4 ^# l3 j: p4 \- s

  562. # J8 T6 i& @; e) \9 h
  563. /**************************wk2168_set_rs485*******************************************************/$ T) N) R2 t& v0 C; j6 W- S0 f: g
  564. //函数功能:设置子串口RS485的收发转换函数,使用RTS引脚控制485电平转换芯片的收发
    9 A4 _0 {5 U8 n1 Y& W
  565. // port:子串口号
    ; b& z/ W1 v% D+ x
  566. //
    9 N0 F7 F; E4 \9 c6 Y
  567. //注意:只有WK2168/WK2204支持该功能
    ' G3 g5 r( H1 J7 A$ z- f; I" }
  568. /**************************wk2168_set_rs485*******************************************************/
      A) C- j/ c1 k; W! u  s0 M& w/ n' B
  569. void wk2168_set_rs485(u8 port)# L' ?5 o; W  V% c/ ?  V
  570. {   : m( S2 z1 ~) K+ G1 g0 h
  571.         wk2168_write_s_reg(port,WK2XXX_RS485,0x02);//" |1 H  i. J0 g/ Y1 A. }$ z! ]+ K
  572.         //wk2168_write_s_reg(port,WK2XXX_RS485,0x03);//. ~0 D. {5 i, ~2 s8 B, o3 E
  573.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
    $ a3 |; |# i3 Z" q/ g& u% X
  574.         wk2168_write_s_reg(port,WK2XXX_RTSDLY,0x01);8 b0 t8 @7 k5 Z- O1 h% {3 t
  575.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
    - E/ e! ]' X4 V' D" q/ x1 J. \
  576. }
    : Q( i) A* j! F0 P4 g
  577. /**************************wk2168_rts_cts*******************************************************/) m9 m( [2 z, t
  578. //函数功能:硬件自动流量控制,需要子设备的支持' v3 Q# t; @: J" ?6 K
  579. // port:子串口号' V* u+ J, o4 T1 s: a: X1 s0 g" ]
  580. //
    ) j" ]! f& Y- G# ?8 G: f
  581. //注意:只有WK2168/WK2204支持该功能
    / w: g  D1 Y7 D" W' {# B, s
  582. /**************************wk2168_rts_cts*******************************************************/
    9 Q3 B% h- W+ ?6 y* n& O
  583. void wk2168_rts_cts(u8 port)
    % r! N) c; K# `/ [+ i( R5 g
  584. {   4 g; z& I" f; t
  585.         wk2168_write_s_reg(port,WK2XXX_FWCR,0x30);//* ?! M) J. R# ^6 r2 d' K
  586.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
    . {  _5 t$ U) o& g: {4 ?5 U' e  ?+ n9 }
  587.         wk2168_write_s_reg(port,WK2XXX_FWTH,0XF0);//停止接收触点1 p/ s/ s: u2 H0 n  N7 D' B
  588.         wk2168_write_s_reg(port,WK2XXX_FWTL,0X20);//继续接收触点5 k- T( ^0 b7 Q: |- b4 _
  589.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 1 _& V7 }. s' ^$ \* F; C9 a! _
  590. }
    * M% Q' |* \/ e# h( A* c

  591. 5 B9 l2 Y* E' Y; m
  592. $ C& T0 W) X- R$ {6 ?9 Y' ?8 x7 s

  593. 2 \/ j; Z0 |, c/ k: H
复制代码
3 z! x9 g6 r! z0 L8 b
) T5 i6 O- L  U+ `. @
赞 收藏 评论0 发布时间:2022-4-20 20:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版