找回密码
 注册
关于网站域名变更的通知
查看: 355|回复: 1
打印 上一主题 下一主题

 NuMicro M0516-PC通讯协议

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-10-29 09:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    NuMicro M0516-PC通讯协议
    4 U. U* d, v# M' a( v2 B6 z, e
    0 r) o% j3 Z$ e/ Z- v
    main.c
    + M$ D# w) ?/ u# ]- P' n- R/****************************************************************************/
    , @% |2 X: @" a5 Y/ ?- _; l/*                                                                          */" U3 E7 X* a! s1 S6 f
    /*                Copyright (c) 2016, 老马工作室                            */
    . y  [( N  ?& t  x8 X1 y/*                     All rights reserved.                                 */0 D% y$ r8 {! I7 ~0 E4 _
    /*                                                                          */$ I, c( A: |) k8 o9 }0 b* J+ W
    /*      Email:pcwebmaster@163.com                                           */( j0 B, z" L( L7 s$ }* l; b8 l
    /****************************************************************************/. G- V  r3 e. i& j
    /****************************************************************************/
    ' K* G2 R. @$ V0 m/* 文 件 名:comint.c                                                       */
    # `) d9 v/ K! d/ D2 U7 I/* 版    本:Version 1.0                                                    */
    " R+ \1 j% |' z1 Z3 _  L/* 描    述:串行口中断带通讯协议测试                                       */
    : ]  k: y! x/ _% d/ l( K% M/* 主控芯片:NuMicro M0516*/$ D6 p  q/ S) z& s+ Q
    /* 晶振频率:11.0592MHz          */- D( b) ~' {! a5 N% @
    /* 作    者:pcwebmaster(北极狼)                                            */
      W3 u4 N6 b+ ~" K9 n8 }/* 函    数:                                                               */4 e1 _/ \/ U- y8 k9 e( X
    /*         system_init                                                     */
    5 ^/ P8 G8 ]5 |0 V; G1 s/*         com_send_command                                                */; D$ {& h, _) t  {% W) R. V
    /*         com_command_receive*/+ X  s; C8 V* j' Z5 {! F
    /*CalCRC16_1021*/
    * d' F1 {! u; \/*command_decoder*/- z/ ^' F5 Q! ?' N3 a% |* B: \0 j. R
    /*send_command*/1 K* D9 t3 e0 _0 J+ b% I) W
    /* 测    试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */( Y7 h- w+ n$ Y+ o
    /* 测试现象:  */
    8 V# ~5 i+ b( E8 t/* 历史记录:20016.02.18测试通过                                            */
    - w7 g8 n5 S- @" D8 K/ a; T/* 北极狼          20016-02-18     Creat Inital version. (Version 1.0)      */
    - ?! ~" S' U( I2 x% M3 ^# _/****************************************************************************/
    9 R5 j& b# V! |  Y% R( z% v6 U7 k#include <stdio.h>
    . v; T- g: z3 Z- z" Z#include "M051Series.h"" ?- i- V! C* m- Y' ?
    #include "comint.h"
    ( s. M% c! ~( L/ H5 P2 \#define PLL_CLOCK           50000000, X, h! M0 o% V: m. m

    ( b, T3 K" p# c9 {# ]2 f/*---------------------------------------------------------------------------------------------------------*/
    ' K! L. J8 J2 P. T/ q/* Global variables                                                                                        */
    6 ]5 h7 E) s$ V+ D3 G/ Y/*---------------------------------------------------------------------------------------------------------*/3 ?* B; S  n0 ?( \0 X+ l* O
    ( i4 b" Y5 Q! e( m4 k: {4 d7 Y: }
    void SYS_Init(void)
    : b# X/ h+ j. v+ w% M( T{
    8 Q4 M* L/ i8 E0 F, u# H3 k4 s    /*---------------------------------------------------------------------------------------------------------*/  n" X) W3 m: C5 X+ Y& ?
        /* Init System Clock                                                                                       */
    1 f$ ]: ?; A1 d    /*---------------------------------------------------------------------------------------------------------*/: ?' q7 n+ [" G/ j' F
        /* Enable Internal RC 22.1184MHz clock */" e. U) U6 t2 I% }
        CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
    5 `0 U# ?& a& N. G    /* Waiting for Internal RC clock ready */5 V: t, ?% H  I9 n, B) `
        CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
    7 h% J: \) F: Y0 p% @9 ~    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */8 ^/ B2 d; t$ m
        CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
    8 V. Z0 [- d* d7 V    /* Enable external XTAL 12MHz clock */
    4 i% b4 C; T0 K. c  d9 k* o    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
    ; P! v! J. I7 s8 O. b" @0 z2 a% p    /* Waiting for external XTAL clock ready */
    & f/ N! B# `4 f* T% ?8 ^    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
    & K& D, x1 t* ~1 o7 ~' J: d  g    /* Set core clock as PLL_CLOCK from PLL */0 l! j2 Y# B2 Z/ v0 @2 F' d
        CLK_SetCoreClock(PLL_CLOCK);& K5 C1 P" m0 h/ }+ c) q
        /* Enable UART module clock */
    5 J0 e/ M  P  M" |    CLK_EnableModuleClock(UART0_MODULE);
    " y& R$ ?1 E5 r& B- W5 c: |5 B1 a    /* Select UART module clock source */
    4 W# v' \6 y( c: d//    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));CLK_CLKSEL1_UART_S_HIRC* f# E& ^' v% n% }) {9 L
        CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_CLKDIV_UART(1));
    ) D% H6 z0 u: \3 G    /*---------------------------------------------------------------------------------------------------------*/4 }+ U* @, d1 ?5 q8 g
        /* Init I/O Multi-function                                                                                 */' b7 G% v, R6 u- a) T# y
        /*---------------------------------------------------------------------------------------------------------*/
    # n$ L( m/ d$ X5 U    /* Set P3 multi-function pins for UART0 RXD and TXD */* X# V- E$ k- j+ X! s
        SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    3 w$ i. {  A. @    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
    % E' d& p6 U* a' S9 i  {: ^}
    3 }3 V# |( @2 c
    2 E4 C- w9 J5 ^& ~void UART0_Init()9 q: C0 r8 F, q
    {+ g) F8 h3 m% d4 p* w6 I% \
        /*---------------------------------------------------------------------------------------------------------*/
    " a6 R5 C- q7 D    /* Init UART                                                                                               */
    : n+ p6 d8 f0 q9 G    /*---------------------------------------------------------------------------------------------------------*/! u: u4 N/ ?* L
        /* Reset IP */$ U  p3 S, J5 Y5 w! |1 k! ]0 I
        SYS_ResetModule(UART0_RST);
    9 \* F& q" o- s( e) x% }$ [    /* Configure UART0 and set UART0 Baudrate */
    - N% \% q! y$ h0 A$ `9 M; w    UART_Open(UART0, 115200);
    ( [9 q- |; A2 }# {! W//UART_Open(UART0, 9600);
    4 j+ S: N  o; n8 ^1 C( m    /* Enable Interrupt and install the call back function */8 o( W% \* @1 r/ O. h; U
        UART_ENABLE_INT(UART0, (UART_IER_RDA_IEN_Msk));// | UART_IER_THRE_IEN_Msk | UART_IER_RTO_IEN_Msk));6 |3 k. u. K; Y- s2 w( B0 F% E
        NVIC_EnableIRQ(UART0_IRQn);
    4 K( v7 M9 ^4 G2 E5 T. @//    while(g_bWait);
    % J/ g& G9 y6 ]/ E. h' k}
    " S6 N# K: }9 a" u# T" U' b
    - \' L- d+ C$ ^; ^6 m2 q* Wvoid Uart0Send(int32_t Bytes)+ s# f) r' R4 M
    {
    ' X6 k1 C0 p- SUART0->THR = Bytes;) e# C1 X5 j/ H: N
    while ((UART0->FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
    % {# F: G: V3 G1 z' _8 z}
    : H; K$ F! A9 x. P% s: L1 ^# d: B) `/*---------------------------------------------------------------------------------------------------------*/! K6 t1 I, H1 X
    /* MAIN function                                                                                           */& E- ~. V$ [+ O1 y
    /*---------------------------------------------------------------------------------------------------------*/8 p: A$ _* S, M3 r

    ' v4 J6 r8 G( c! [int main(void)) I# ^: {( j" ~( [9 R' _
    {' C/ X3 T2 F3 S) g% R
    //int8_t  i,j;   
    0 c. L6 P  \6 y, W6 b+ f' }, B( U    SYS_UnlockReg();/* Unlock protected registers */    6 F% R8 E6 ~- C) h: P
        SYS_Init();/* Init System, IP clock and multi-function I/O */   
    : J; T- M/ R% a( t    SYS_LockReg();/* Lock protected registers */   
    ; m3 T. F- q6 `" B1 l% ^1 g: v    UART0_Init();/* Init UART0 for printf and testing */
    ; j+ u0 l( @- A  l3 T0 pbuff_init();- b( C" o0 L" Q* e; Q4 i! v$ ?
        /*---------------------------------------------------------------------------------------------------------*/" D  l  K% E  f. n6 {* U, y+ b) a
        /* SAMPLE CODE                                                                                             */
    ; e7 _3 [6 j  C0 U4 i    /*---------------------------------------------------------------------------------------------------------*/, U# x! `8 }& ]3 v9 R+ Y
        printf("\n\nCPU @ %dHz\n", SystEMCoreClock);
    7 s3 h3 r6 s8 k; v4 d- Rprintf("\r\n 世界,你好!\r\n");  
    : C7 V3 ]: q* X' Wprintf("\r\n USART0测试正常! \r\n");" K/ Q! F1 C2 ]" t2 H8 A8 E
    while(1)
    ) z, k# F9 H* G{3 X7 ~; Z0 \" e9 Q3 v" l
    com_command_receive();7 d$ h) H& k7 m( B8 y
    }/ w% ]( h1 ?! c9 q0 v& q5 i, R
    }# u0 l& G0 B0 g

    $ |) H3 B+ M! N) _" [! h+ mCOMINT.C6 |" A( E5 w0 m; A1 t! z
    /****************************************************************************/
    , Z& p7 z' q" s8 k0 _' g/*                                                                          */7 }7 s( v! p/ _
    /*                Copyright (c) 2016, 老马工作室                            */7 d) a! x$ P+ e2 `
    /*                     All rights reserved.                                 */! x; v6 Q1 H2 `2 A7 G
    /*                                                                          */. V" y* s0 Z% k) K* G3 F7 ~% z
    /*      Email:pcwebmaster@163.com                                           */1 Z8 b3 L) `$ N1 x7 q
    /****************************************************************************/
    ) N) l7 C9 L# b" Q/****************************************************************************/
    ! L0 q1 D7 O# q. i; e9 s9 V/* 文 件 名:comint.c                                                       */0 t# o- K: Z; v% I: t6 k
    /* 版    本:Version 1.0                                                    */
    ; ]1 z, o3 v# ?% ~! d/* 描    述:串行口中断带通讯协议测试                                       */
    3 n9 k( k1 ~) o5 u/ T' |6 e8 w/* 主控芯片:NuMicro M0516*/9 d0 B" ]4 l" t( l' P  ^% W
    /* 晶振频率:11.0592MHz          */+ c1 e2 ^6 ?& P+ I+ G( T$ o
    /* 作    者:pcwebmaster(北极狼)                                            */
    + {6 m+ E1 a* N3 E. q) [; X/* 函    数:                                                               */
    5 h/ h* w' G9 w3 R9 }& p/*         system_init                                                     */
    , m7 i6 W! E" B8 y9 Z! y" H/*         com_send_command                                                */
    ) s/ V. R1 r9 x* h5 `. x4 h/*         com_command_receive*/
    : D' B: O* q% |, F1 G/*CalCRC16_1021*/
    % a2 n3 _! v5 P1 G. [2 v2 T) d/*command_decoder*/1 K/ N4 e1 a: l- `
    /*send_command*/
      J/ H" S& z% a! d0 V4 m' A2 n8 J/* 测    试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */8 Q2 L5 E# J" i5 _5 g' y- m: d
    /* 测试现象:  */
    # B% }& c, m; S, n9 t5 M  Z. g& D, Z/* 历史记录:20016.02.18测试通过                                            */9 S* q8 U/ y% e3 D2 B! P' j) V
    /* 北极狼          20016-02-18     Creat Inital version. (Version 1.0)      */9 {  O- ?& C4 `
    /****************************************************************************/
    ' S3 S5 w$ }  Q# g+ ~& U#include "comint.h"1 m& z& w" a0 r1 `8 E+ t) @
    ; ]$ N- u! w+ r6 Q  z- \% b/ T' x  u
    uint8_t  pint_buf[MAX_RINTL];   /* 串口接收缓冲区       */
    3 x  I3 g, j( I5 Vuint8_t  pint_read;             /* 串口缓冲区读指针     */! \8 j. e  F- T4 T; |2 ]. h
    uint8_t  pint_write;            /* 串口缓冲区写指针     */% }* R) i1 X* Z" p/ I
    uint8_t  psend_int;             /* 串口发送允许标志     */
    7 `( y) \  y% P. ?3 Auint8_t  serial_flag = 0;       /* 串口接收数据标志位   */
    % D* q3 ~0 v+ O) z3 L1 E8 F4 j
    2 c( w# P1 p* s2 e( f' T* k3 I7 [, l7 A7 _3 _- W! ?
    uint8_t  prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区    */3 N, T; A( P* c6 M; D9 f5 \5 \
    uint8_t  prec_num;                    /* 命令接收缓冲区字节数 */+ x' j+ l. R' ?) o- X& c

      m- ^5 u( N' K# p# v' I( u6 p5 tuint8_t serial_lengthl = 0;           /* 消息命令长度低8位    */
    ) C& @+ d9 S7 Q) r- k5 p* j6 uuint16_t  serial_length = 0;          /* 消息命令长度16位     *// E0 L5 B5 A% Q( C2 q
      a( u* I& y* Z
    uint8_t ADDRESS[2]={ZU,ZHAN};       /* byte0:通讯组地址, byte1:开发板地址 */- ^2 d* Q' _  M! h

    # q+ `6 F; ~+ q: |# C6 m: F/* 串口发送一个字节 */  g0 Y- H4 x1 v0 z) i
    void com_send_command(uint16_t Data): Q9 O8 @! C$ K
    {
    # Z& T3 _. V# ~UART0->THR = Data;$ `, f& g, ^+ k7 W8 m  r
    while ((UART0->FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空& `; U3 X& p' S! \
    }8 p; v9 J' O. J' s5 I

    4 m: n  ]5 P0 L/* 串口接收数据处理 */
    " }3 m5 E3 R" mvoid com_command_receive(void)
    ( l: l- R7 r2 R  M8 ]{
    ) S9 K7 b' T( n' J) V    uint8_t var1,var4;8 [% Z9 z1 H( Y: K+ {0 z
        uint16_t crc_data = 0;3 \& R- B% i# \* o5 v, m
        var4 = pint_read;( p; [0 J& j! ?* {
    " e( N; \' g- `8 V! A  p1 q
        if (var4 != pint_write)3 q% |. o, x" ?  s; K
        {
    7 [5 K8 C+ _. U% e# I$ g4 N        var1 = pint_buf[var4];! s, h& o3 P" w; D$ b5 X
            var4 = var4+1;
    $ U- D" ], i  q2 A+ U! y8 Y        if (var4 >= MAX_RINTL)
      R' s$ `# ?9 w5 i" r# s            var4=0;
    % h; s! n& w9 R; t: q+ _' N6 h  [) U6 F
            pint_read = var4;
    1 `6 O# w4 N% V4 T
    2 x( x, q( X4 W$ d1 H" ?0 ]        switch(serial_flag)
      o' [8 G/ r" v8 P        {/ s, n& C0 @& i7 a
                case 0: /*收到起始位*/
    " g* j6 S& W$ [) \                if (var1 == SYN)  `# p9 g, `4 _$ _. }! s2 N
                    {# y2 @5 |: F4 C7 r) T
                        serial_flag = 1;% z3 e# Y9 W* z9 Q1 ]1 W# g
    //com_send_command(0x01); //测试
    + c- j% j3 C6 H% [                }9 n2 i( Q6 J, c. u  D
                    else
    - i/ g( B" h# t                {4 B0 i. |0 f1 Y( R3 H
                        serial_flag = 0;- V0 s$ g( t2 a& f/ C0 Y
                    }
    + u, R) a6 i+ i7 `' f5 h  ?3 I                break;' S) e( H& |4 w; R* \2 S" s
    8 z$ a) j/ m7 O; g8 K
                case 1:/*收到起始位*/
    3 w% `! ]' ~+ [7 V  O7 P. R                if (var1 == SYN)
    9 g  k( l! V; g9 U6 D* ^; O                {
    9 b+ {* b% s% W+ j9 y+ k+ U& Q( k                    serial_flag = 2;
    & G4 T- s* r' ?0 [, A//com_send_command(0x02); //测试" F8 h& ]! H& B/ }; C, W
                    }
    8 y$ E5 w" N/ s6 J1 u9 o( ]                else; m- f8 ^1 v4 @/ v& ]6 n
                    {+ [$ Q- ?5 M4 e/ g+ G
                        serial_flag = 0;
    ' n6 F8 g. d, S% z  w; w$ K5 `% M" M                }
    5 E8 A2 }1 i3 F( w                break;4 v2 b0 _3 V/ V+ L0 U
    , D6 I, M4 ~8 H
                case 2:/*收到同步位*/
    1 d1 r/ @; b: J" Y4 e                if (var1 == STX)
    , T& }6 J2 C- U8 u5 {! C                {
    - x" ]% G! f/ I                    serial_flag = 3;; g6 ^, h+ ]3 h% r! C
    //com_send_command(0x03);//测试
    : P3 O  b1 X- B9 g                }
      |7 |& B. H, o" c6 z                else
    9 R& _. N$ @3 @% b                {* L7 J/ x, c& q+ G5 {& m& D9 q
                        serial_flag = 0;
    7 q! D! r3 T3 T! }/ D9 M4 Q                }2 p3 Y! i; b, ?" F
                    break;2 `, F1 n6 L; v" H$ O0 _) y+ G
    ; d( q* X3 F1 N+ f4 [8 t! `  J! b
                case 3: /*收到组地址*/: E* `# a7 @( Y4 {! J" J7 z
                    if (var1 == ADDRESS[0])
    8 p3 A  u! w! v0 w/ I& z                {; W8 Y3 I/ s  ~
                        serial_flag = 4;
    $ \6 W3 O5 }" h0 S9 _. K4 y3 X                    prec_num = 1;
    5 B2 V( }! W: K6 j/ ]  J                    prec_buf[0] = var1;: a, w4 d6 C! D9 t0 I
    //com_send_command(0x04); //测试
    & E1 ?5 f# w9 g7 f- F                }$ b# e* h* F* b$ y5 a
                    else
      f$ c) q- v# }8 B0 p( f0 Q. M' t                {
    9 l: h: E& c2 L! b& e4 ?( {                    serial_flag = 0;; d  O+ U9 s/ N+ k$ w/ ]
                    }3 U6 q# y4 ^, E8 K
                    break;
    5 G( L2 u$ \2 H0 G, e
    ; ]* ^! P  ?: f( [$ z5 J            case 4:/*收到本机地址或者广播地址*/; d3 w( }6 e  G; W2 T
                    if ( (var1 == ADDRESS[1]) || (var1 == 0) )
    - ]# A9 |* ]7 [; P  @! O% D4 n, p( o                {
    ( d2 ^8 b/ r  S0 J                    prec_num = 2;
    # ^& R# e6 a: Y                    prec_buf[1] = var1;
    ' G. u% a" u1 }8 v2 g6 ~6 ^                    serial_flag = 5;
    ' Y3 @6 h* |8 j* }; o//com_send_command(0x05); //测试( b# m/ U4 B( ~6 n$ G7 W* y& l
                    }
    6 z4 Q' }) I( h2 G6 \7 g                else
    : z& n* [3 V/ k1 I                {: n2 f7 s: Y* z' t0 I2 t' _9 i. B
                        serial_flag = 0;
    0 p( ]$ S) Y/ E' ~                }3 A; K3 w/ F4 @5 R  ]  @# a+ q
                    break;0 a2 i+ n" u8 X  F. U/ Q) V

    3 r& r& H, m  `# G6 e            case 5:/*数据长度*// k  ?  ^* N) y/ X1 x3 H/ b0 x/ g2 ?
                    prec_num = 3;; u) m) W/ U/ x; d3 Z7 \
                    prec_buf[2] = var1;+ u; t3 n8 t( x% ^6 f
                    serial_lengthl = var1;3 ]. K+ K6 V* Y0 s. j
                    serial_flag = 6;
    - o1 }2 n) T) E! p( e//com_send_command(0x06);//测试, f' _7 R1 W; E: n# F
                    break;* ?8 K6 o8 k- D7 i! ^. E
    7 J9 y1 W% ?& q& d
                case 6:' v! h9 n3 `& Q9 R* E
                    prec_num = 4;
    # R) R2 @' E# K9 m& ^5 K                prec_buf[3] = var1;2 D, X( q1 M8 _/ o, E( F& `
                    serial_length |= var1;
    " u0 E1 |4 `3 f" T                serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
    6 |5 l* N1 z$ q* R' U+ x- @, g+ C; n                serial_flag = 7;" L: B- t6 k, ]3 a
    //com_send_command(0x07);//测试7 ]* G+ t( k4 f- S
                    break;6 G/ c* \! T1 |6 [

    " F! Y  r' m% }# V+ `2 ?1 C8 B            case 7:
    ( I6 I4 j% R4 K: `- e8 Y% N                prec_buf[prec_num] = var1;
    * r8 E7 J$ A1 t! }0 m3 j. z/ T                prec_num++;& O$ u7 ]/ N9 I4 e5 g
                    serial_length--;( S# j! H7 a" e( M
                    if (serial_length == 0)
    ' n* o2 k" h0 {                {( S' k, z4 v5 P$ T, j9 ~
                        crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 计算crc校验和(从组地址开始到ETX )*/
    . d6 f& X" I: q' Y3 L
    * M- N3 _# F3 B                    if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校验和正确 */0 n' b; x' Z$ a, p" M
                        {
    ) P' c, F2 V5 q1 K8 J$ C                        prec_num = 1;) K% n; K) P3 G" w7 c( C
                            var1 = 0;% Y: L2 T: x; U  z7 h  U
    $ {3 @* E, z0 H$ V% P% w$ n- ?( F7 @
                            if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 *// t3 q' W0 H1 [. Q+ ?
                            {
    5 Q6 D7 B# F" m( E                            if (prec_buf[1] != 0x00) /* 如果不是广播地址则回应ACK*/
    ! }* @0 K  \. y( u6 d) a2 i2 Hcom_send_command(0x49);//测试                                 msg_last_push(MSG_ACK,0);
    9 w9 ?" [1 \2 K4 ~  F3 E3 y//send_command(ACK); //测试   
    0 |5 J5 |+ L; H! y/ ^
    7 C5 B6 |# i5 f' f! f  W                            command_decoder(); /* 如果校验和正确,则进行命令解码 */! w7 j0 Y% k" L$ ^
                            }% Q+ G6 i; Q8 o  _% b% b
                            else
    6 {9 D7 C; m& b6 {# F                        {( _6 X% l( G( F  H0 N, [
    ) T5 ]. A5 ?4 B6 Q' o# i3 w6 t
    send_command(NAK); //测试
    ' g2 ~( @! E2 U! |3 w6 G: U  J. f7 @  O                        }
    + s: r) E( ^& c/ p# }3 y, [% m                    }' K2 W3 g4 |; Z
                        else4 V8 Z; m4 W1 l& v( E: V0 I/ l
                        {$ k) i) D) O) K3 S0 N

    . N0 a; ]6 w7 {; u  rsend_command(NAK); //测试
    " b2 ?& E9 p! _$ R# q                    }( a& @* f% K7 Q7 \$ Q1 _3 F
                        serial_flag = 0;
    * x; f( A! w( t$ f9 d1 o% O9 }                    prec_num = 1;
    - [/ d9 E# n* m; V6 I                }( Q, h1 p( b/ [) w7 W
                    break;
    ( s1 g/ w. i  h& }4 w4 }  s: ?3 c- G" R: h+ J% P# M
                default:" M  |9 ?8 n: T* W
                    serial_flag = 0;
    7 s! }9 y# C  k0 ?( D                prec_num = 1;1 I0 e& }# n) y# W/ J$ ~5 D
                    break;% z3 ~8 [9 ?) v+ O& o* X$ u; E3 W+ Y
            }
    , N8 K( Z7 J5 @1 U8 i! A% q0 K    }
    ( I/ `3 O0 v2 g/ c}# c# s5 K. r  D/ n( D* {! ~( d
    /* 命令解码子程序 */: _7 e5 p- B  n  l
    void command_decoder(void)
    ; ~! x# a* V; n9 x# g% V- u! ^& ?{
    " e2 [3 ^) {1 |" r5 B//    uint8_t i = 0;3 e% J+ D/ C: m4 g: w" \

    9 H5 _. z! s9 l. a8 Z# K" V# v    if (prec_buf[4] == 0x31)       /* 设置报警阈值   */
    1 X7 u, ?4 W# W% Z    {  / E" T) O/ d7 P: Z: `0 T) }
    com_send_command(0x11);//测试5 f) ^  s, e" O, e9 U+ h0 d
            return;" `6 i" O- N% X; B1 c  [/ l9 P5 m
        }
    7 a/ L, o" J: B2 ~8 g" X7 R    else if (prec_buf[4] == 0x32)  /* 请求报警阈值 */
    " |' M; G' t0 C8 f. X* ]    {
    2 ?. ]* W: ]0 y  G" k9 u) h: O7 gcom_send_command(0x12);//测试?! c$ Q  ~; A" v' y, Z) j
            return;
      K2 x3 i, ?( a# v5 }; R  D& K6 z    }
    , _$ j! s9 f; r( M  x' O+ ^    else if (prec_buf[4] == 0x33)  /* 修改当前时间 */0 ^9 z) T1 Q1 E1 I
        {
    2 ^$ g" l6 H0 X. ]9 s" j0 z: Xcom_send_command(0x13);//测试
    & |) @, h" M  p* G        return;
    " K( m+ O5 }' \" I# A    }
    0 h' |) z+ `* n9 o1 {    else if (prec_buf[4] == 0x34)  /* 请求当前时间 */
    # v: W/ Z' ]$ M' X    {) T# q  w. B) L
    com_send_command(0x14);//测试% w$ d) q1 D+ u/ e  o; l
            return;0 p, Y: m' w0 a
        }
    " C6 M; c6 P) Q* J  @+ ~4 I9 G( ^    else if (prec_buf[4] == 0x35)  /* 请求当前数据 */$ A3 s% n/ {4 \  w# U
        {
    & u9 T9 s3 N+ F! ~2 S- C! f# Xcom_send_command(0xAA);//测试3 S) G3 N8 \8 w5 k9 G" v7 x. L
    //__nop();" `4 x5 K/ O- h6 f
    com_send_command(0x15);//测试! J8 S6 A9 ]3 \* d8 j3 V/ W
            return;: G. @( X+ R6 R& I; u3 J( k
        }. b& t9 j* O7 ]
        else if (prec_buf[4] == 0x36)  /* 请求看门狗信息*/
    * {8 z! Y3 P$ j5 z# M    {* i5 v/ u. A/ G  b) U
    com_send_command(0x16);//测试
    , m5 I& J3 ]' [/ k( T: \9 _        return;
    $ Y+ U/ ~* S6 k5 m( A  S! G    }' c: b7 ]1 s2 \# l
        else if (prec_buf[4] == 0x37)  /* 请求报警情况 */  R5 O- A! f& {4 m
        {7 i3 a; @0 t8 W0 `$ u6 P! M
    com_send_command(0x17);//测试
    " l/ L: b" E1 B: D3 _& Z        return;" X) ]  k  h" u# U) b: t5 }% W
        }: L1 v- o* W- E) Q" q
        else if (prec_buf[4] == 0x38)  /* 配置设备地址 */
    ; y0 k7 G$ g) g8 q5 n    {
    . A! F7 a1 B9 ]( Y2 x1 I        ADDRESS[0] = prec_buf[5];  /* 通讯组地址   */) s& ]# v' W) I' y/ H
            ADDRESS[1] = prec_buf[6];  /* 开发板地址   */2 T* v1 a' @2 e* t6 s7 u
    com_send_command(0x181);//测试
    " ^' @4 X* O' m  I9 ^  g0 s        return;
    9 C. B: h: F/ }2 c. e3 h; J% P) [    }
    9 \$ K+ l: ^  Z1 f; S. O    else if (prec_buf[4] == 0x39)  /* 请求设备地址 */
    7 M  j8 }9 g9 p2 Y+ N$ k    {4 x2 C' Y; @9 e: s
    com_send_command(0x19);//测试
    ( O8 F/ f0 X7 K. H% Y        return;
      l. H! P+ Z, n* _* ~1 b    }) t' A" T4 t  H; G+ J
        else if (prec_buf[4] == 0x3a)  /* 控制模拟量输出 */
    ( I2 L' \% x) K    {; Y2 E$ C  ~1 p7 {0 E5 `
    com_send_command(0x1A);//测试?- t% I9 ?% t; p  D& t
            return;
    4 I& w' a& A7 p4 |! f* C/ K    }; i& B2 Y% b( L+ R  D$ i
        else if (prec_buf[4] == 0x3b)  /* 控制开关量输出 */1 `; P9 y* ~, w% _( }
        {
    , k0 D" L) w: C5 N" |com_send_command(0x1B);//测试
      L" A! x; s* `/ l        return;
    : Y) T; m8 k$ s( y    }
    2 [' j- [! `7 b7 U: e//if (prec_buf[4] == 0x00)       /* 如果是广播地址  */9 N2 P7 R; @* U0 @, P& N
    //    {  
    1 Z: D) ^5 l3 t5 R$ a4 _. t/ m//com_send_command(SYN);
    - X7 k9 v3 l7 `0 H2 D//com_send_command(0x00);
    1 C/ U; e7 S4 Y5 @  X* S//com_send_command(SYN);* ^1 o* W* N1 Z0 H
    //        return;
    & L, Z% e. V$ {, T) J//    }
    4 F* b, D9 f9 j1 C  t- L' Q$ d}
    ( @- _4 z, L7 m+ u6 y  ^. k
    5 E" j. x! H) V, E/* 向PC主机发送消息帧,入口参数:消息类型 */0 v6 g! I, d5 h* {
    void send_command(uint8_t command)3 v/ r! N. _& C0 y% m( P8 G
    {
    7 w2 `7 W$ {5 @* {6 _# D    switch (command)# G1 T$ l: v+ x
        {6 J3 O. _/ I9 t1 x+ |7 ]2 M
            case ACK:
    / e$ ^0 g$ e6 {& O2 q9 |; y6 n            com_send_command(SYN);  l8 `, P; Q: r4 p2 J0 @+ x, {+ ~
                com_send_command(SYN);) `5 v8 p- Q+ q$ ]6 X
                com_send_command(ACK);' w- |# _; C- L% |, u$ N0 U7 l
                break;- M+ T* \% _4 @& }

    , n3 |( H5 O1 j- b        case NAK:: U0 N- c  I) Z' q* t
                com_send_command(SYN);' r$ U5 k! N( C4 y- ]; W
                com_send_command(SYN);6 c9 h/ ?8 c1 U2 r6 @, J3 Y
                com_send_command(NAK);2 \0 h& a7 T( D) ~) o
                break;1 X6 U( G. ^: O, ]
    : s! n3 \! m$ b8 Q$ g
            default:5 ^" s* |" S- j5 e
                break;; r: V$ \$ m  ^6 o0 G0 C
        }8 u# U4 p0 V8 [
    }
    , L1 V$ v6 ~2 Vvoid buff_init(void)
    % W; x4 G0 a" K* T6 ?+ _8 [{
    . {' [- b3 k1 ?/ i- D" E    uint8_t loop;
    ) G) M1 x# g( ?& u. {& Z: b    loop = UART0->RBR;   /* 清串口缓冲区   */' |, `4 V" k5 o! E7 X$ R2 @
        for (loop=0; loop<MAX_RINTL; loop++)# H0 [6 r! Y& {: @/ j1 h
        {( V' t" N' r% l+ }3 T4 U. d
            pint_buf[loop] = 0;) W: |# y. H6 c  [" n
        }* b- R3 ]3 L& [
    }
    - o6 O# `$ }0 o& ^7 r2 Y$ v/*计算CRC校验和使用MTT(0X1021)  C: E, f/ o0 T1 W9 b  z# E2 m
    参数:+ s9 r3 V# y2 c0 ?  X
    pBuff 为需计算CRC的缓冲区的头指针3 F8 }# Q  g( y; e" E  `
    BufferLen 缓冲区长度(以字节计): p: P( c: m- S1 V2 d. V
    */
    / F) Z  q, s; ~) {: D) C/ t* Ru_short CalCRC16_1021(uint8_t x[], u_short BufferLen)
    # x! l( Q- ?$ F{
    0 f5 f3 h/ ~) z    u_short i;, I1 W% a0 v" M) V+ V
        uint8_t  j;
    - q8 W1 Y; L  U4 R- k    u_short crc16 = 0;
    / c# l. A% j1 i/ i) x    u_short mask = 0x1021;" `9 g6 m8 w5 y- L! d
        uint8_t *pByteBuffer;
    9 ^" V: d! ]; f: f6 v    uint8_t tmpbyte;+ P6 g' v3 ^# O; m" y+ N
        u_short calval;& O" i: O6 T* N3 }3 A4 t
    0 Q4 w+ q4 F& n3 d) k/ Z( s& o
        pByteBuffer = &x[0];6 F* J$ R- U6 f( I4 S

    7 S& J. f# f# x4 v. L    for (i = 0; i < BufferLen; i++)
    # s1 A" _! }' ^; ~/ x9 S2 E& y! b    {3 T( K- j' c( u  F* K, _& S
            tmpbyte = *pByteBuffer;4 N5 G, m9 S$ Q+ T
            calval = tmpbyte << 8;4 p+ U; O/ r" {7 l2 U$ \" e  w
            for (j = 0; j < 8; j++)
    % [) _' C& a8 }& R8 c9 b5 X        {
    9 [( A1 O: B6 N- }/ a. z. K8 l            if ((crc16 ^ calval) & 0x8000)
    * R; p% }8 u8 O8 E! S                crc16 = (crc16 << 1) ^ mask;
    " k* m4 f& D* ?6 W            else
    ; Y# s4 ^: z5 ]                crc16 <<= 1;! }; f: V1 Y6 Z6 a2 ]9 D8 x

    1 t5 y# Z: a: u+ T: A; n, {            calval <<= 1;, W/ w! d. U. B( @" _( S
            }. t( P2 S+ a6 j+ M5 V, v5 F4 z
            pByteBuffer++;- h5 v+ x7 q1 t" e# u2 C) v5 Y
        }
    1 L- ^" Y8 c3 U, }; K  A2 W    return crc16;! T  E  ]! C8 z$ K& P, s
    }" H) D# M- P) J' x( f( J% {
    ' p1 C% R8 w9 `" M5 K3 n
    /*---------------------------------------------------------------------------------------------------------*// [" u' i5 `7 V! ]$ H* h, ?, O* }
    /* ISR to handle UART Channel 0 interrupt event                                                            */
    . {( H( ], c! e3 C. ^/*---------------------------------------------------------------------------------------------------------*/$ E" C0 _7 O: y( Z3 C
    void UART0_IRQHandler(void)
    ' s* M" R/ C* h* F{
    : v) J! Z1 S* A* d3 @# ?    uint8_t temp;3 F: Z7 ~4 }/ T- L$ `, K
        uint8_t temp1;
    9 a. J3 y# H% `+ l* ?8 t+ i
    0 C: Q/ ]6 T5 i; |% r7 w* mif(UART0->ISR & RDA_INT) //检查是否接收数据中断
    , L% ?+ g* b) e, }4 P{
    7 I! e( E6 [( D2 D4 j6 Xwhile(UART0->ISR & RDA_IF)  //获取所有接收到的数据+ k0 d5 v" d: o7 a4 I4 ?8 {4 ^
    {& J" U0 R, y$ I. F* h! }
    while (UART0->FSR & RX_EMPTY); //检查接收FIFO是否为空
    + O# o. k7 @4 I* [0 \temp1 = UART0->RBR; //读取数据
    8 a1 n3 H+ ^: O; Y3 C3 Ftemp  = pint_write + 1; /* 判断是否可以写入 */) |2 w. X* F( a$ y& j  M- I3 }4 c
    if (temp == MAX_RINTL)" @* ^  M1 s! }% G
    {# S! v; e. Y# o  g
    temp=0;: _  u' N7 h( ?- i0 ^# X) |( F
    }+ q, L! K! ^: E% x9 y% D
    if (temp != pint_read)! F0 u# E* N& c+ g; r
    {: L" f1 a0 m) J1 e7 w
    pint_buf[pint_write] = temp1; /* 读取数据 */, C! M3 S" N0 j6 j6 N
    pint_write = temp;( z# z) M  ~: H3 K, u- N
    }8 K' h# q! A9 ?9 D6 F' J6 _( r- O
    }8 w1 g2 x+ C9 U' i7 L8 X
    }
    - z; Q! A% T) W* C# H% R; T' t% }8 ^}) C( I2 x$ V: V. U; ?

    ) u) C+ w( H- s( hCOMINT.h4 \9 ~$ T: J- g5 k3 w4 v1 @, k

    4 m4 `& T" y, z' X. X7 B  z( h9 g#ifndef __COMINT_H__2 _5 i$ N2 q! L' e6 [; P
    #define __COMINT_H__
    1 @, n5 W" q9 q' ~8 P8 L9 ~% M) M% D; b' }. e
    #include <stdio.h>7 w& e( o0 ?3 j% S& C$ r
    #include "M051Series.h"! ^3 o' l5 n1 Y1 ]) \

    4 `; c, d/ i' R#define RXBUFSIZE 8//1024
    # b& d2 z* v; s" Y#define TX_EMPTY(1<<22)1 b& E: Z4 O# t  C
    #define RX_EMPTY(1<<14)
    & ]' x. I- x" R: U; ?" D#define RDA_INT(1<<8)# ?2 Z! Q' J) }' G- `
    #define RDA_IF(1<<0)2 C1 B; z7 N" D* E9 X7 e
    : r) s0 O# m7 u9 b9 M; \( m
    typedefunsigned shortu_short;
    , ^  r. x/ x8 X9 Q/ h" ?
    $ a( r# y) P6 t6 T, c$ C3 W0 Z#define ZU0x01 /*组地址*///通讯地址修改这两项7 r5 K. K/ Y4 p
    #define ZHAN0x02 /*站地址*///通讯地址修改这两项9 X# |* a2 ^$ m1 E+ L( D0 H- D% M

      r' R& q/ S. D#define MAX_RINTL       16   /* 串口接收缓冲区长度   */
    * R' ]+ p. _) q! Q/ e- a#define SYN           0x16   /* 通讯同步位*/
    0 L6 l* f; ^* X) ?" A9 M& I' A#define STX           0x02   /* 通讯起始位*/
    " z5 H4 U& h& K; I7 ]+ N' Q#define ETX           0x03   /* 通讯结束位*/; {9 |6 R+ B/ s) x/ ]2 A; }/ f
    2 O! A* D) ~8 D
    #define ACK           0x068 I+ b( y7 m7 p1 ^! M5 ]
    #define NAK           0x15
    ' U( O3 ?, C) e: s& T- w" E/ t
    8 ?6 c; {7 w7 K% R! p! a. Y9 o' }9 ]#define MSG_ACK          2    /* 正确应答信息         */
      x+ s, E. B. ^#define MSG_NAK          3    /* 错误应答信息         */
    7 Z$ @4 t5 h* U#define MAX_COMMAND_LEN  16   /* 串口接受命令长度     */  J( P3 J0 T. g

    2 D9 t! _" Q- p( W: b+ sextern char str_test[25]  ;$ L( ?, h+ @* z3 C# t( t
    extern uint8_t  pint_read;             // 串口缓冲区读指针     */
    : s0 k  C: w7 T6 }7 {extern uint8_t  pint_write;            // 串口缓冲区写指针- N4 N7 }+ y2 E' s' z. U- A
    //extern uint8_t  data  psend_int;             // 串口发送允许标志   
    . Z8 e$ G; T# k$ ]extern uint8_t  pint_buf[MAX_RINTL];   // 串口接收缓冲区      
    # b  H1 V1 [3 T$ Mextern uint8_t serial_flag;              /* 串口接收数据标志位   */1 H$ a" Q& Q4 b" _- u

    0 Z+ d' R, q7 mextern uint8_t  prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区 */% H* N+ b2 \8 w3 n4 p- w  v; x

    " J' a6 M) D1 E/* 串口发送一个字节 */  O4 W0 A9 [- V7 l
    extern void com_send_command(uint16_t Data);
    6 r' q4 x; q" c/* 串口接收数据处理 */; Y* }8 D* M* u( }% Q1 O+ z
    extern void com_command_receive(void);$ f" r3 V; t" m
    /* 串口接收初始化 */
    9 G2 O+ k7 Z6 xextern void buff_init(void);
    8 X2 a8 W6 \) U- w/ D( V/ M* D6 y2 d3 \. U
    ///* 串口接收一字节数据 */+ e! `( d! h5 J' _5 T: p4 g' w
    //unsigned char UartReadChar(void); //reentrant
    / `4 P2 g2 `  i7 d% `. Q$ G1 |/*计算CRC校验和使用MTT(0X1021)+ M! J' R+ g. O& f& [8 ], L& J
    参数:
    , r( B5 m1 S8 z4 ^! i" ?) LpBuff 为需计算CRC的缓冲区的头指针
    # z) i& l5 ^$ P2 _" pBufferLen 缓冲区长度(以字节计)3 F- U/ I" Z. g% C& Y5 K
    */
    4 K- D' C+ ~& b6 Gu_short CalCRC16_1021(uint8_t x[], u_short BufferLen);: W( z/ B8 `, W& p  c. w
    4 u; C, X' m8 ^
    /* 命令解码子程序 */
    . I9 E! c; @  K6 f3 Ivoid command_decoder(void);
    8 L7 U7 P( w+ v# B8 V/ R/ @2 J0 Y/* 向主机发送消息帧,入口参数:消息类型 */: k- X5 [' n. @3 ]
    void send_command(uint8_t command);$ Y! y5 E4 F" S0 Z7 ^
    7 Z9 f$ p; ?8 ^+ m3 R. u, ~
    #endif# |7 o1 X3 k3 x8 e" y9 J# @

    9 V+ Q. D8 b, Y! q/ I. U* `6 ^4 L6 o5 _, o

    & x# @: Q, h0 r4 }+ e- k
    : i0 x4 `* E; ]  D+ c- b/ W7 a8 a
    1 ^- ~/ u& ^" }! [$ L- x- |( c4 C, u

    & V9 j1 V! D5 C5 E0 v! P

      l, R- n2 ~& e, [  R- T
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 19:30 , Processed in 0.218750 second(s), 30 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表