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

 NuMicro M0516-PC通讯协议

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    NuMicro M0516-PC通讯协议

      ~) |& S" u; j6 x
    6 }1 k& r* A( |. x4 y& S% A% x: h
    main.c
    3 R3 M0 C* L5 |$ J. L& E/****************************************************************************/
    . ]& Q# ~, B  t* p5 _( N) t4 H/*                                                                          */3 V& j- J1 ]& f, b
    /*                Copyright (c) 2016, 老马工作室                            */5 |0 S# ?7 u: b) d
    /*                     All rights reserved.                                 */  K& l& S0 c2 J' K
    /*                                                                          */
    2 E! w% ?  O1 O* P/*      Email:pcwebmaster@163.com                                           */6 t3 G* R1 z4 U- o' a. n
    /****************************************************************************/
    0 a8 _) |3 n& F/****************************************************************************/
      q/ l7 q6 X: F. w0 ~8 ], J; x9 M/* 文 件 名:comint.c                                                       */
    $ `9 ^: ]& B( |: V1 Y/* 版    本:Version 1.0                                                    */
    ) Z" [( i  u' _7 \/* 描    述:串行口中断带通讯协议测试                                       */: [& x3 S; o3 ~: a) h' Q8 e: e
    /* 主控芯片:NuMicro M0516*/$ z7 |9 I1 |6 m3 k+ ]
    /* 晶振频率:11.0592MHz          */
    ) J( K' p! v$ @2 v8 p/* 作    者:pcwebmaster(北极狼)                                            */9 n6 k$ G: T) D1 i, T  J) U4 x( t
    /* 函    数:                                                               */1 o- I. e8 G- E5 A( ^  ~
    /*         system_init                                                     *// @/ e( j4 l: `' i( V+ q3 R* q
    /*         com_send_command                                                */* O7 I9 y1 R, a% c; v6 `4 @+ C
    /*         com_command_receive*/
    ( W0 D' I; b/ w/ ]/*CalCRC16_1021*/
    8 i; k" k2 ^1 T1 V9 m/*command_decoder*/8 i$ `' q9 [# c
    /*send_command*// S* v# [0 b5 `
    /* 测    试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */
    2 f: Z9 [5 ~' y* f: g3 B/* 测试现象:  */- Q0 Y8 t9 y0 s% H4 N8 |
    /* 历史记录:20016.02.18测试通过                                            */
    + O" Y0 f9 }) ?7 d# T9 k5 G) z7 g/* 北极狼          20016-02-18     Creat Inital version. (Version 1.0)      */7 S8 D$ M& H( i! c' g8 N* ~" Y
    /****************************************************************************/' Y8 d1 R# s5 U: ^6 l' u
    #include <stdio.h>
    . s% G7 L# _+ \6 ~( v( A, ?#include "M051Series.h"& ~0 C) ]& o' L3 M
    #include "comint.h"8 }; @6 _' ]) p4 u% s$ u" Z# c! S# e
    #define PLL_CLOCK           50000000$ b* N% R8 t1 o( D+ s3 D7 U( {5 ]

    # Z  b. \, K  _( x" }/*---------------------------------------------------------------------------------------------------------*/' U+ M- ~! b& m% t5 |! ?
    /* Global variables                                                                                        */& w3 }4 N1 l& n; d& R% ]
    /*---------------------------------------------------------------------------------------------------------*/( M9 L: g/ H; ?0 ^# q
    * r; c, t' ?2 ~7 @# [+ Q
    void SYS_Init(void)( j. y4 p( l" ^6 ~* G5 `$ D( D
    {
    1 K9 n* ~* s9 Q. F    /*---------------------------------------------------------------------------------------------------------*/
    ' a" M! A, m! x8 V    /* Init System Clock                                                                                       */
    0 ]. P; p  B: ]* k    /*---------------------------------------------------------------------------------------------------------*/6 D3 M' U* @. L3 s( F) r
        /* Enable Internal RC 22.1184MHz clock */
    0 D- o" N$ Q% y1 u- z" V& w# M  I, a    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
    : L% ^3 [: D5 m- |: s$ J! [    /* Waiting for Internal RC clock ready */
    5 _* m$ A; b8 z2 y* F    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);0 I" V+ {2 o* v' i" k0 z
        /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    4 M) A0 ]" n  ^  {! d: H) w& b    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
    0 F  u& b& @' t5 u% o& {    /* Enable external XTAL 12MHz clock */
    % t8 \0 g" g+ K* ]    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
    $ C7 P" L/ ?# ]7 m    /* Waiting for external XTAL clock ready */
    $ C0 P' q! Y, \2 Z' `" {, s, L& P    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);9 V4 _2 V+ o3 U& v
        /* Set core clock as PLL_CLOCK from PLL */
    7 C7 ^/ `: I- _; R8 c! T4 E    CLK_SetCoreClock(PLL_CLOCK);
    5 Q, Y0 x- x8 h! U. S    /* Enable UART module clock */. F+ [) K. H. w$ Z- l/ Z  W1 i
        CLK_EnableModuleClock(UART0_MODULE);- r( H: c& y0 T& Y& Z
        /* Select UART module clock source */
    . U$ P! h, z( z' d3 p, a& E+ C+ A9 z//    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));CLK_CLKSEL1_UART_S_HIRC
    7 g4 N6 j; l% H* N# K0 |% \2 [8 g    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_CLKDIV_UART(1));
    % g: G- ]8 v2 b+ t. g6 {7 [/ r    /*---------------------------------------------------------------------------------------------------------*/
    5 ~0 N! [! o% n8 F! N9 N* S    /* Init I/O Multi-function                                                                                 */
    1 o& N: D6 q3 Z( G, r( F0 x- s. |    /*---------------------------------------------------------------------------------------------------------*/
    ; r1 m" j& ?  V. v' B8 h! }7 z    /* Set P3 multi-function pins for UART0 RXD and TXD */
      r0 q! q6 E, \0 ~! g" k7 N    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    , ^( i8 E& y/ m/ c! _    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
    1 M/ ?1 N* r+ i+ r% H}4 |' ~* U- Z& O* A6 g1 Y

    8 y& _0 L4 b- X2 Z9 K7 vvoid UART0_Init()* B9 j, z# {- D% P" E
    {+ \5 p3 s5 {( s0 d% t( v/ B# t* e
        /*---------------------------------------------------------------------------------------------------------*/4 T  ]& {2 @' o
        /* Init UART                                                                                               */! ?( N) ?1 A8 o
        /*---------------------------------------------------------------------------------------------------------*/
    : M( ^- J# z/ l. X8 I, {# o    /* Reset IP */! o) L+ n7 K* z* J' s
        SYS_ResetModule(UART0_RST);. ^) a/ _$ U& a$ e7 P  ?- q3 }
        /* Configure UART0 and set UART0 Baudrate */4 Q3 q. J( t) c
        UART_Open(UART0, 115200);" q0 @9 C+ ?% U9 W
    //UART_Open(UART0, 9600);
    $ n0 }- J- F+ B0 _, D    /* Enable Interrupt and install the call back function */$ p' @1 Y# h7 L7 V- ~* A
        UART_ENABLE_INT(UART0, (UART_IER_RDA_IEN_Msk));// | UART_IER_THRE_IEN_Msk | UART_IER_RTO_IEN_Msk));
    % b! U# T6 A- Z, [5 ~    NVIC_EnableIRQ(UART0_IRQn);
    3 T& y5 u' c8 I//    while(g_bWait);9 T+ M/ B5 ]9 q6 ~* c  E, M, u. l
    }, v5 d" d! S/ t. O9 n- }8 K
    9 G! i* V8 |5 ^. D1 b
    void Uart0Send(int32_t Bytes)
    ( e# }( U5 P4 I. z/ \" @' G{
    5 j7 W+ @' L  K9 C: I9 QUART0->THR = Bytes;
    ' d: G4 M6 G. Rwhile ((UART0->FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空 2 k( U  Q9 S, ]
    }+ d* H5 B9 a/ J
    /*---------------------------------------------------------------------------------------------------------*/! c3 P7 I. m' ]: [) L
    /* MAIN function                                                                                           */
    , s; H( w; D7 o" E- x, b" B3 e! s/*---------------------------------------------------------------------------------------------------------*/$ M. X3 P2 a: W8 ^

      @6 |- k( R3 U" S+ D( Zint main(void)
    2 U3 j: [' u! \{/ s& _4 m6 U' X( u5 `
    //int8_t  i,j;    - M( W4 V* ~) e/ D# M, v1 {+ Q5 C* _
        SYS_UnlockReg();/* Unlock protected registers */   
    : K" v3 F) U+ w3 N- z0 u$ O    SYS_Init();/* Init System, IP clock and multi-function I/O */    , u% r$ `9 H2 e) [% }# F; C6 h6 w
        SYS_LockReg();/* Lock protected registers */   
    9 W* {" \1 N- x6 s    UART0_Init();/* Init UART0 for printf and testing */
    ( y, x! m$ t1 `/ n6 n0 V. s1 x2 tbuff_init();6 \9 q& q2 R0 b( m+ v
        /*---------------------------------------------------------------------------------------------------------*/, q( t& \6 V/ O& M- e) k
        /* SAMPLE CODE                                                                                             */
    . ?& O: X- I  c    /*---------------------------------------------------------------------------------------------------------*/
    7 y" a; J* N2 M. n4 x0 J: m, H4 s    printf("\n\nCPU @ %dHz\n", SystEMCoreClock);
    ) B! n8 w% [% e: f5 ^printf("\r\n 世界,你好!\r\n");  
    9 t; s2 ~' E7 p$ i: W1 r" Yprintf("\r\n USART0测试正常! \r\n");9 l/ P! O# k  s: T
    while(1)9 I* w$ E" D$ s
    {
    9 x3 C6 V# S0 G/ d$ U/ b7 K2 d- ^com_command_receive();5 C% y; x" \; K8 @( N0 ~
    }
    - R5 _- m, ?. _) J}
    ; Q( A. Z& A. E6 {) {$ U
    : m  O5 o% ]  ?1 \4 u) l5 sCOMINT.C% k' @; ~5 s' A! k
    /****************************************************************************/
    ; d- C9 e) ^  T8 G! e4 z/*                                                                          */8 X  f& a9 z8 c+ E' i1 b. P
    /*                Copyright (c) 2016, 老马工作室                            */
    " T" S7 k# }( q* s1 H9 k/*                     All rights reserved.                                 */
    : }8 ?* K" p9 K9 e/*                                                                          */
    " P: U# K' ]/ Z, Z/*      Email:pcwebmaster@163.com                                           */) I# M' A  B5 _! g- f0 t$ j- B( J
    /****************************************************************************/
    " C, r, E  u3 w/ l/****************************************************************************/
    / _' D7 z9 p9 y8 }/* 文 件 名:comint.c                                                       */, _- B2 {( r+ c0 m! t1 v* u
    /* 版    本:Version 1.0                                                    */! I2 U1 O! ?' U0 S1 n: v
    /* 描    述:串行口中断带通讯协议测试                                       */. E+ S: i( O4 U6 h, F7 O# a
    /* 主控芯片:NuMicro M0516*/5 h9 Z) {; X' q$ X- G/ [
    /* 晶振频率:11.0592MHz          */6 Y$ g4 [6 u9 w0 {1 X
    /* 作    者:pcwebmaster(北极狼)                                            */0 h$ F5 n: _+ U4 J) C6 U3 F7 t, d
    /* 函    数:                                                               */
    0 y7 T' w1 w# j$ N2 V" M" |/ s/*         system_init                                                     */
    # [+ v. \* K& Y" |% h9 m/*         com_send_command                                                */+ _3 R8 s" ^: E+ R4 V
    /*         com_command_receive*// e6 y3 q+ \# H% _
    /*CalCRC16_1021*/) {9 [, }7 y/ N
    /*command_decoder*/
    % L( M/ E4 ~9 Q8 n# M/*send_command*/5 G" j6 e% w& D- x  d6 d$ O
    /* 测    试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */
    ; {; r7 c+ s/ ?4 h) D/* 测试现象:  */5 |/ G7 q  t. d, Y, H, m
    /* 历史记录:20016.02.18测试通过                                            */1 ?. _8 ~' ]$ N7 |8 H: T
    /* 北极狼          20016-02-18     Creat Inital version. (Version 1.0)      */4 T1 h, e& X8 Y3 y
    /****************************************************************************/
    ( Y  z/ H2 d  G" S) D8 ^. b9 N! i#include "comint.h"
    4 k4 f- R* `& E, g3 v! n7 {2 ^+ V/ f/ ^  |
    uint8_t  pint_buf[MAX_RINTL];   /* 串口接收缓冲区       */) b& P5 E8 v% r6 U
    uint8_t  pint_read;             /* 串口缓冲区读指针     */
    , i# p) g0 @: C7 t, W9 huint8_t  pint_write;            /* 串口缓冲区写指针     */
    3 q! L0 H! a! w" x  b3 Z  v6 zuint8_t  psend_int;             /* 串口发送允许标志     */; \7 \& i2 a9 _, k7 j3 V
    uint8_t  serial_flag = 0;       /* 串口接收数据标志位   */( {& y* Z) B. |- J7 p$ M

    , _  ^5 ?) Q* |3 v( ]
    , u# u( I5 Z* L9 Muint8_t  prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区    */+ ]% Y" H) G2 i& ]/ H4 k" `
    uint8_t  prec_num;                    /* 命令接收缓冲区字节数 */  g3 }9 a1 k8 N: \* g
    0 r% B8 p3 `, ?% k
    uint8_t serial_lengthl = 0;           /* 消息命令长度低8位    */
    2 `. G8 ]+ h" E) P. Y: Kuint16_t  serial_length = 0;          /* 消息命令长度16位     */
    6 d: H" O# S7 `  V, [; N
    1 J5 U- H0 m/ S8 o4 Puint8_t ADDRESS[2]={ZU,ZHAN};       /* byte0:通讯组地址, byte1:开发板地址 */
    # O7 i! z5 T5 A
    5 `" s# ?, R# S  V. @/* 串口发送一个字节 */
    ; X% g$ }" e3 q& [$ yvoid com_send_command(uint16_t Data)( n: x: c1 Z: K% D
    {. U/ O3 l6 j  V6 |
    UART0->THR = Data;# Q) E( l; n) H& F! Z& y/ g6 P
    while ((UART0->FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
    ) q( L7 S9 w3 a+ L}
    ! l  j: C* b0 d
    % [& |  ?0 X# K: T1 q1 e' C/* 串口接收数据处理 */6 V) C; p- n7 X) t) F8 F
    void com_command_receive(void)  _: Q3 C3 o0 M* h8 l/ ~5 c
    {& l, y! b8 {( _9 ~- c8 @6 K. L
        uint8_t var1,var4;# a+ }, H' i. q/ {
        uint16_t crc_data = 0;. e( {* `. f) b5 P
        var4 = pint_read;' O; |+ Y9 c* Z. w8 q
    . x& R9 @# ?3 W8 f3 }
        if (var4 != pint_write)1 d2 `) d  j' ]- r
        {% A  {& Z) \5 o; B- N
            var1 = pint_buf[var4];6 i) _. `: z; R3 p! v
            var4 = var4+1;
      R: d. G7 i' {0 e$ f7 I        if (var4 >= MAX_RINTL)
    2 |& z( c" c  l9 g4 _. j            var4=0;
    % J  h6 [, O! S8 w" |6 s7 R  {
    3 o" I, I( v/ u        pint_read = var4;$ U: t. F% W1 H& `1 E1 O$ x
    ' ~( G: g$ s  G8 T: x8 p
            switch(serial_flag)+ o& @  D) w+ T* [: c% A
            {3 Q- {  W* N  L8 G$ |& S& U
                case 0: /*收到起始位*/1 p! v* h" K2 Z+ `4 B0 S
                    if (var1 == SYN)
    3 I! `3 i; f' }$ c: k# A                {3 n  G; _; e8 C+ X3 V4 J) J
                        serial_flag = 1;
    * [7 \$ ?0 z# Q3 p! t# }//com_send_command(0x01); //测试
    ) n) s6 b' Z/ Y; |5 a                }
      V1 H% j3 P8 F; H0 _$ O8 K                else
    * G3 X* m/ d1 F0 ]% M# H, @  r                {9 m! H% Y& U! K: S
                        serial_flag = 0;
    5 ~0 z: t8 T( o# |                }2 M$ p# O3 N6 N! t& U( d
                    break;# w. z( q8 i) m; V; z5 L5 U2 d
    / J1 y5 O; c6 N9 y3 ]/ R
                case 1:/*收到起始位*/
    ; b$ \; s  i& O0 X                if (var1 == SYN)
    : P6 t6 T$ B3 E. O                {, n, K+ b4 i2 u7 B, R0 C
                        serial_flag = 2;" e1 [7 p' k1 \2 f1 {% O
    //com_send_command(0x02); //测试# d$ U7 _6 r% s  e- F9 @
                    }2 N' X( V6 W5 V; u+ t/ H" [
                    else6 B8 T  p% H# A9 x  ?9 |& F
                    {
    0 G1 ^& W; I+ K0 e7 Y8 n+ a& x1 b: T                    serial_flag = 0;
    4 |; i4 V- k( l! F: t- X, E, i# U                }# ?2 G; k+ W$ ], ]# X" {
                    break;
    ' g- D# n5 r. ?2 B; y5 ]. c$ y* e& F7 t7 K5 Y7 ^9 w2 v
                case 2:/*收到同步位*/, }/ N  F8 k7 w& F, ^
                    if (var1 == STX)
    & q) J- ~3 q4 B* l$ [/ O                {
    2 r# n' z8 ?8 D* m                    serial_flag = 3;3 v$ u/ b$ a" q  L2 Z( ]1 v. u
    //com_send_command(0x03);//测试
    ' X" J( K+ b3 V+ k                }
    4 ~0 q2 R# `0 Z, v3 @. u5 ~) p8 K                else6 H8 Z. `- @' A
                    {  [6 s- `. n% B8 o+ K1 I: E% o
                        serial_flag = 0;- S+ O" Q8 Y3 T- v0 |
                    }
    8 M5 c: `" g& X+ X/ W" G3 l. o                break;, a& h8 q; {) f0 J& K, \4 `

    ) S6 I1 Y) h& H/ k. A$ g* q            case 3: /*收到组地址*/- ~0 i/ c" w: l' F3 p$ M
                    if (var1 == ADDRESS[0])
    * n4 ^7 B. Q' A* ?  Q$ N                {2 L) T* s' R; F8 U( X
                        serial_flag = 4;
    1 k1 e; k' p6 ^; q( z/ c( N3 c                    prec_num = 1;
    ' w' K: v1 A- ?3 C+ U, @                    prec_buf[0] = var1;
    ' ^+ n: T$ H0 L! I! ?//com_send_command(0x04); //测试% D3 S( B/ c3 T* [! a. U2 d5 w
                    }
    + S, g- d! A7 C" `) }                else& }. `5 I" j' n7 m0 V8 Y/ `
                    {* o0 Z. |0 M$ K* J2 b7 l
                        serial_flag = 0;# Z& [+ n! b* g
                    }
    # b5 q% h1 {( z3 ~8 n) I                break;% l: a. O0 s) z8 N! Q3 i7 J

    % S4 [" C3 v7 ^2 ~, a            case 4:/*收到本机地址或者广播地址*/
    8 |; a' \, \0 B7 e                if ( (var1 == ADDRESS[1]) || (var1 == 0) )- Z9 C: d; |. @7 l* ~) Q$ f- _# j  W
                    {. K; O1 t5 G6 \; g3 n9 l
                        prec_num = 2;; C7 I3 M2 J8 O; S
                        prec_buf[1] = var1;
    * @+ H' ^# W4 o! F* Q( g                    serial_flag = 5;# J# o9 F) ^! ^4 _4 h
    //com_send_command(0x05); //测试
    0 U* G- P+ t# k                }
    8 v5 a! ]( B. X, D' s; X2 ~4 r                else
    % B3 |+ R$ I9 N$ U9 t' l" N) ]  ?                {+ c5 C) W% S7 ~* U3 q3 O
                        serial_flag = 0;6 b/ m8 O$ f+ g9 |# [
                    }
    ) F# t8 \) D& A) K# i                break;: f# Y$ y5 w$ X$ B9 _' R

    8 v) U* n. G4 I# J( W6 d% y            case 5:/*数据长度*/- v' Z, @6 s& M7 e* C
                    prec_num = 3;# Z2 t! W6 X: T* y" R# P* r
                    prec_buf[2] = var1;0 a3 x( z1 V$ A7 ]# N% I
                    serial_lengthl = var1;
    8 X: e2 ?+ p9 Y9 M                serial_flag = 6;/ h7 Y% ~$ L$ Y
    //com_send_command(0x06);//测试% x" o1 b* r4 l; a7 ]- }) `
                    break;
    , b: _' C; D8 j0 g$ W" U
    , h  Y0 G* n: x& S/ e            case 6:: ~! ?8 F3 V" A! H' j+ Z, T
                    prec_num = 4;
    . u8 W1 i0 J! S* ]/ O* b; {3 \# ^                prec_buf[3] = var1;
      h# t/ R) a! i- I                serial_length |= var1;
    3 }" }& e# M/ k5 H1 a6 ~0 G" p                serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;, c' M; F4 B) v9 W; T0 w
                    serial_flag = 7;6 W4 C  ?4 J/ L% Z
    //com_send_command(0x07);//测试
    # _" X- p" P; [4 B, B1 ^' r                break;
    5 s- X; E$ g8 p- Z3 u% j! ^3 S  {- j/ ]
                case 7:* r9 Z6 E/ {2 |; g
                    prec_buf[prec_num] = var1;$ u3 g& z0 l6 T8 ~" Z4 F2 ?. A0 `
                    prec_num++;
    % i& c% C' ]- Q2 c- }' G; k3 p                serial_length--;
    ) [' C' V! X& X/ K  T                if (serial_length == 0)# V2 d) |6 @6 ]% @* d1 p: w3 x/ R
                    {
    9 E( c1 n, S- ~( @0 g) C6 }                    crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 计算crc校验和(从组地址开始到ETX )*/
    % E8 o' h* _0 G$ `8 e+ i6 k" T9 E( A) [8 k* A% t5 j% X
                        if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校验和正确 */
    ; \6 z! @" B$ h                    {
    6 i' S0 l/ ]4 m. c6 a  o                        prec_num = 1;, F6 {9 h1 l: r+ J, |
                            var1 = 0;
      n' g; y% \' U6 L& H) p) S. b& F2 I( [
                            if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */  s0 ^. ?6 L3 L/ A( m7 d
                            {
    * y) d- A) j( t- l                            if (prec_buf[1] != 0x00) /* 如果不是广播地址则回应ACK*/
    7 d6 _: _# H9 n# i- T& ~com_send_command(0x49);//测试                                 msg_last_push(MSG_ACK,0);! V. `' t9 ~# s
    //send_command(ACK); //测试   
    4 T) L+ h0 z4 |! \/ E) G# R9 N  F1 q( Q0 r) l) v
                                command_decoder(); /* 如果校验和正确,则进行命令解码 */
    * P6 i2 u: G- B3 X. H                        }
    0 Z( V9 `& S% @5 W7 P+ o                        else; m! i' ?! Y0 w& l# X, @, s9 g/ [
                            {3 N& i3 u: [# S4 h% ^3 j; c
    & z% L9 L, o, e* G1 H, u, z
    send_command(NAK); //测试# {& e- \. G  _( a% ], ]
                            }
    - Y( p/ m: ~7 c5 M& I                    }
    " B. h1 f- @! _  m( A3 z                    else" S' R7 J6 Z( H# K3 \7 {
                        {4 P9 ~2 Z1 E$ D7 l7 r

    " r; \6 i" }, K1 G( V) k2 ^send_command(NAK); //测试: e. @+ q4 q& ]
                        }
    ) i0 ?) w4 Q$ z  m                    serial_flag = 0;
    7 Z$ J$ [& l7 W                    prec_num = 1;
    4 l1 M) j# ~0 l$ C                }
    . a9 @. J5 X6 k- Q                break;
      T: m1 i6 a9 o: V3 n7 u5 W0 u; [% z6 ?
                default:
      A. F2 G2 n3 D% O# f                serial_flag = 0;, `' t+ e) v  W  k; S( j5 X
                    prec_num = 1;8 q) ^  N, q$ R/ Z7 C) I
                    break;
    3 _; k( G2 ~- S        }: s8 L; u3 n4 Q# V7 `/ e6 q
        }3 y6 j+ R) X( C! Y
    }0 A( ]8 E, D( V4 q$ H
    /* 命令解码子程序 */; S/ k- S. @! T1 P
    void command_decoder(void)
    4 I7 O! g) K( c" w$ F/ r4 j$ l' H{
    2 u  r: ?' C2 k; r- H//    uint8_t i = 0;
    $ i( Z* }" P+ \% a" E5 w, L, Z
    8 [( Z# j$ }2 N9 `    if (prec_buf[4] == 0x31)       /* 设置报警阈值   */4 |% |- s5 p  a" R
        {  1 d6 n" I6 l: k
    com_send_command(0x11);//测试
    - Y4 Z6 ^/ s& q" r) F* Z/ N        return;
    2 @7 E: O# k3 A7 D4 U& i4 N' r* l    }
    . T" L& ]& O& T) k" W    else if (prec_buf[4] == 0x32)  /* 请求报警阈值 */" T  @4 l+ X; e+ X( f$ I
        {8 J3 P+ C! H# X9 {( B, @9 X1 L) n
    com_send_command(0x12);//测试?
    5 t! |* N/ K: |+ n        return;
    $ O2 w  R/ x' E2 N0 m$ U    }
    - F% O# Q* f; j9 Q( m6 Y! \    else if (prec_buf[4] == 0x33)  /* 修改当前时间 */- A$ L6 p: U( i; S/ D% W
        {
    . Q* g( P2 W. E; j+ R  y( L9 o& Tcom_send_command(0x13);//测试
    7 B" f9 |: ]. x4 K3 c3 {% {        return;
    4 @% F) T5 ]" {+ i1 j0 k    }
    3 c1 W8 n! y8 @    else if (prec_buf[4] == 0x34)  /* 请求当前时间 */2 a: `* Z7 H% \8 k+ \7 u
        {2 V; m, P* Q2 j" |* w
    com_send_command(0x14);//测试
    0 h& {) y5 U  {1 ^5 h5 ?& V        return;
    5 h! s. O! C1 |7 I. t    }
    # O6 U6 ~7 g( q6 u    else if (prec_buf[4] == 0x35)  /* 请求当前数据 */" j: q( S. }4 y8 A. l
        {
    3 ]% [2 w, K) F; U" f, z7 n! _$ Fcom_send_command(0xAA);//测试. s; s* v: R; p3 d# i
    //__nop();
    0 V' C7 f# q/ r% V- [; l8 qcom_send_command(0x15);//测试
    3 \' r7 _# u3 J" O  h        return;" [( K  g( _" D; r3 s& Z5 l
        }' |2 G8 o; O/ m2 {% @5 m
        else if (prec_buf[4] == 0x36)  /* 请求看门狗信息*/0 p: K1 A1 ?0 C4 |" \( _' l; {
        {
    ; c# s/ a" m$ j' c6 h3 ^5 O7 Lcom_send_command(0x16);//测试
    + i; o9 u) [, Y5 X2 r        return;1 O, |$ b9 ^, u0 r
        }9 Z) D2 w8 f. I
        else if (prec_buf[4] == 0x37)  /* 请求报警情况 */& I8 h; b7 j% I6 e% a2 ]
        {
    ' B2 U3 ]. K4 j7 {5 ncom_send_command(0x17);//测试6 Y7 O7 ^! B# Q. L- u1 t3 B
            return;2 Z1 i8 B1 x# U
        }- e1 Y/ Z5 a- Y' U5 P) Q  H3 Y
        else if (prec_buf[4] == 0x38)  /* 配置设备地址 */
    9 r  [& D% X# N8 k* x# ]    {
    1 f# W/ O7 J$ s/ a* Y3 t( _3 J' D3 S        ADDRESS[0] = prec_buf[5];  /* 通讯组地址   */
    9 x6 A* v' i6 j        ADDRESS[1] = prec_buf[6];  /* 开发板地址   */
    % W1 K6 ^) {1 Y4 l3 g' N+ Rcom_send_command(0x181);//测试8 L8 Z% ?8 ]: m1 K( z0 q4 T6 k
            return;
    # H* b5 A. w$ `    }
    ) E4 b  m& k% H" o8 p+ u& E    else if (prec_buf[4] == 0x39)  /* 请求设备地址 */
    ' m1 g5 {& {' p5 ^$ \4 v& i    {: n' o/ S- Z0 P% C
    com_send_command(0x19);//测试
    . \) W' x2 c( _) \0 ~' x$ C0 D9 s0 I        return;
    & K4 s/ A% ~( P. Y    }
    0 R4 v; l" [$ X    else if (prec_buf[4] == 0x3a)  /* 控制模拟量输出 */
    , h* h5 z6 h3 J# [& n( A; B    {6 s8 L- T6 t5 ?* i( z, E3 N
    com_send_command(0x1A);//测试?
    & h! x& F: J# G2 D+ c+ ]! \        return;1 z) S. H! S3 e2 Z8 n( L
        }
    ( s( Z% u# b* o" I+ B% C) r    else if (prec_buf[4] == 0x3b)  /* 控制开关量输出 */, e& }7 V  @. k2 K3 a. u- ]5 G
        {
    1 ?: H; [) v3 ^& Tcom_send_command(0x1B);//测试3 z% \8 [8 Q7 B
            return;
      V% g  N0 }# I3 h4 ^    }4 k. \6 c3 W' h( n) S, Z
    //if (prec_buf[4] == 0x00)       /* 如果是广播地址  */: ]! g3 ?1 e$ W' L  C# h, R' h  I" W
    //    {  - s7 s- i+ \! X5 j# h& q
    //com_send_command(SYN);1 N6 W2 O1 V: J) j% y
    //com_send_command(0x00);% a1 R: c! @, A; c( c
    //com_send_command(SYN);
    1 }% I. h/ u" n5 \//        return;; W% G. D" k; N# {0 K' r
    //    }+ S6 |; w: x0 W/ B0 z
    }( a3 r. i7 K5 ?

    6 q: [- u+ @0 E9 F. K: C/* 向PC主机发送消息帧,入口参数:消息类型 */+ z2 ~! V2 O9 F
    void send_command(uint8_t command)
    * G- o" j  d2 Q) P# y" ?: c6 g{
    ! @( |4 z+ I, |% |1 v, x    switch (command): P1 h& j7 j) b4 m2 K; S
        {
    3 p, T+ t* Y4 g# K1 S        case ACK:
    7 V# o' |# O3 ?( o2 d5 G* E* E            com_send_command(SYN);2 I4 a" L. y* q  Q2 T
                com_send_command(SYN);) M7 D- e/ N' r8 j
                com_send_command(ACK);! f- u# k$ N. N% }2 _
                break;* l2 `1 c& K* a: Z+ `

    8 U* F4 X% |1 G; Y7 a: n        case NAK:: q" b. C- ?0 ?2 a. h  a( |, Z
                com_send_command(SYN);
    $ @+ ^. O1 Q/ ^' I# P            com_send_command(SYN);
    % g% e& i8 a" T) x1 H            com_send_command(NAK);
    1 J3 a, b% j& A, e            break;! I5 O5 @7 G! p' i( |, k# p
    + B, z4 Y9 i& }
            default:* d5 z: u8 ]; S2 C. _
                break;- y' a* l" u; P! Y+ R" W
        }6 s6 p" B% k9 i" `
    }
    $ i: X3 l  f# W' \void buff_init(void)+ \: i7 ]5 o, T9 r7 |0 \
    {9 Q5 \+ {' Q2 x
        uint8_t loop;: l- O) m) D' L
        loop = UART0->RBR;   /* 清串口缓冲区   */
    / `, J5 B. X& [4 O$ u6 [; Y    for (loop=0; loop<MAX_RINTL; loop++)
    ' _! q' c! ]. s% V$ s" T" `2 K    {+ E3 W1 {/ s7 Y* k
            pint_buf[loop] = 0;
    + u9 Q/ I5 i% `0 c( [7 C    }
    # y$ u/ N! j/ s}# U! c3 ^) X7 {& {- `( }
    /*计算CRC校验和使用MTT(0X1021)
    3 L  Z8 q" U  D. V参数:( Z2 E9 O& [, p; b; l
    pBuff 为需计算CRC的缓冲区的头指针
    2 V1 o* ^  \# E) d6 XBufferLen 缓冲区长度(以字节计)6 G8 u1 ^8 U9 U9 k1 [
    */
    % Q' W$ J% n0 L. B8 m& S( @u_short CalCRC16_1021(uint8_t x[], u_short BufferLen)& Y. N: ?5 |% S
    {- O7 W4 f* b. }* |  ^1 [
        u_short i;2 v/ |6 `$ O) N4 r0 w; q) \
        uint8_t  j;& J" h/ Z# V" f! K" I" ]
        u_short crc16 = 0;. \4 e; u9 j5 r( J6 R
        u_short mask = 0x1021;
    + x( O* E; C" j6 P! w3 Z    uint8_t *pByteBuffer;
    * {. n% B/ D5 b5 b+ `( Y' e5 M4 U) C    uint8_t tmpbyte;
    + e+ s) d6 N" M* G2 L    u_short calval;- v, k0 v( o+ \0 P9 p) o) k  ~. }
    $ Z, Z! s( l* @3 ]
        pByteBuffer = &x[0];" L1 V* s2 y3 R2 \# r3 ]9 M
    7 |+ r! Y9 n$ O$ L4 ~7 h2 E1 }
        for (i = 0; i < BufferLen; i++)
    " l2 B# C1 v2 K! N2 s3 E    {4 Y* B9 o' m  R6 R- `  r
            tmpbyte = *pByteBuffer;2 f6 A( m# k1 _8 m' G) ]( p1 S% v
            calval = tmpbyte << 8;1 E2 g7 o$ S+ c% R; K% F
            for (j = 0; j < 8; j++)
    ' @" M) Y% @' ?* w* u( j2 E1 x        {
    4 E2 B6 s0 k; h8 k7 S$ {" }+ e            if ((crc16 ^ calval) & 0x8000)6 N# @$ L! x/ b7 Z+ h
                    crc16 = (crc16 << 1) ^ mask;: Q" w+ l) Y2 ~+ ~) D+ ^- {0 ]
                else% q7 d' Y8 L' ^
                    crc16 <<= 1;1 O  _8 m9 V8 t: b% V
    / a; a3 w% G. ^9 P
                calval <<= 1;
    ! E2 F1 E; K5 ]$ M! P9 r# E& [        }
    , x" p7 u: ]8 T- }. `$ Q. O7 K. y        pByteBuffer++;3 G3 z" x8 F- R. n' K
        }2 V+ k5 W6 K: s, [! k
        return crc16;
    & z+ I. @. k0 a. ?}4 ]/ O1 w- ]  ~. |

    & `; B* c, }) Q; d# C/*---------------------------------------------------------------------------------------------------------*/
    ( w. y( W7 `* g, H: h2 ^! o/* ISR to handle UART Channel 0 interrupt event                                                            */
    & h) M; E9 j/ Q) S/*---------------------------------------------------------------------------------------------------------*/
    - f$ h/ {$ {+ u# f" ?void UART0_IRQHandler(void)) ^9 w, ]' Y0 |
    {
    . J3 V, R) u$ ^- T' u2 @1 Z2 Z: x    uint8_t temp;
    . u! b% d4 N7 }' r7 H    uint8_t temp1;
    9 s, Z! t/ s2 L3 G6 X
    1 X! Q% K% j( {' N/ Z. fif(UART0->ISR & RDA_INT) //检查是否接收数据中断
    6 \( b5 r' r( H" x! u{
    5 R; r" R  z. f7 j8 Jwhile(UART0->ISR & RDA_IF)  //获取所有接收到的数据- Z9 T' Z# X0 D( h
    {8 x0 s9 X5 Q  d3 w3 E
    while (UART0->FSR & RX_EMPTY); //检查接收FIFO是否为空1 `5 o/ F  ]. A3 }; `
    temp1 = UART0->RBR; //读取数据
    2 W2 L! ?+ o3 z3 Htemp  = pint_write + 1; /* 判断是否可以写入 */) h7 V2 n0 P8 H$ A
    if (temp == MAX_RINTL). S+ Q; R" ~* _5 }
    {/ `  S, J; }; c* n$ G4 M
    temp=0;
    $ U% T& r+ N* y( R1 I8 c8 Y, S}% W& z! L" q  r
    if (temp != pint_read)( L' P" K/ u# R2 e$ v  y* t( s6 b
    {" e' B2 m$ O/ ]8 m6 o
    pint_buf[pint_write] = temp1; /* 读取数据 */' \- a3 ]; T+ J+ X
    pint_write = temp;5 H4 n' {! ?" K6 I$ S
    }
    & p5 b6 f# o5 Y+ N) K}
    - [' S9 _- t8 f, F: O/ w9 F- D- X}
    3 t$ h8 m2 \6 ?8 k2 d( z) U}
      ]/ h+ t$ f* E+ t: `0 u
    1 Z9 X! D! C' n& |COMINT.h
    & O' T" E+ X+ V2 T; P) F, M
    # a  U  M( v4 p% l4 y/ l/ Q#ifndef __COMINT_H__1 P  w$ m5 N) r. o
    #define __COMINT_H__
    ( t9 f0 B) u0 R7 X) @4 g0 d" S/ x+ ]" `7 Z4 v( p6 p( ^
    #include <stdio.h># m* ]7 Q* b2 C- Q; l
    #include "M051Series.h"3 C! }0 d) D) f$ j3 l
    : M( B& v2 ]/ Z+ n! ?# z% g& B# q  ?
    #define RXBUFSIZE 8//1024
    $ i  K7 U; W% Y7 R4 X#define TX_EMPTY(1<<22)
    4 O: _" j% t5 f! j* S6 V#define RX_EMPTY(1<<14)4 V- B7 F& M! I5 q) \2 W% N# j
    #define RDA_INT(1<<8)
    5 c& p! P8 X6 i3 e* p& t- ?#define RDA_IF(1<<0)& L: Z6 z# \" w1 J" i  s
    % y& W3 Q# T4 c$ Q
    typedefunsigned shortu_short;
    5 Y0 m: y# z- E9 t' v! x' d6 v4 z% H/ ^) a2 |4 }* _7 T
    #define ZU0x01 /*组地址*///通讯地址修改这两项
    8 U0 M0 A! c* n0 s: l# n0 Q$ z#define ZHAN0x02 /*站地址*///通讯地址修改这两项+ u3 z& d0 x( }) y  I8 [

      p0 f) ~' n; m* G& F) `; N#define MAX_RINTL       16   /* 串口接收缓冲区长度   */
    / q0 W# E2 ?: V4 I% m/ O1 P#define SYN           0x16   /* 通讯同步位*/
    5 q, I1 O% ~  m: d3 p# f  G( ^: x; f#define STX           0x02   /* 通讯起始位*/8 `$ p: s. F, Y7 I
    #define ETX           0x03   /* 通讯结束位*/
    , X6 s8 ?' X3 c. k2 V1 Z. f8 J: [/ b& W& N
    #define ACK           0x068 }( L' m' J7 E' Q
    #define NAK           0x15, ]' y6 i$ i$ e1 E% A7 F" k
    ( R' j( N8 R/ F9 Y2 T, L
    #define MSG_ACK          2    /* 正确应答信息         */
    3 b0 f" b4 B3 N# ], P1 f! [" ~8 z6 D" I#define MSG_NAK          3    /* 错误应答信息         */
    : ?" J+ F1 i) V* d/ w; S#define MAX_COMMAND_LEN  16   /* 串口接受命令长度     */
    / x( O& V( W. V1 O- Z% a" w# d7 G4 p$ u
    extern char str_test[25]  ;
    . C* t5 M* |; t) p: l$ O$ sextern uint8_t  pint_read;             // 串口缓冲区读指针     */
    $ ~& l$ n4 |2 ^extern uint8_t  pint_write;            // 串口缓冲区写指针
    2 Y, g$ P2 v, Q3 R5 e, C0 G//extern uint8_t  data  psend_int;             // 串口发送允许标志    , ?! V$ E2 K6 l1 u5 o
    extern uint8_t  pint_buf[MAX_RINTL];   // 串口接收缓冲区      
    . \8 {+ i: q$ m/ Pextern uint8_t serial_flag;              /* 串口接收数据标志位   */
    7 ~1 R: l$ |! \4 x1 e
    1 U6 L) i$ @  Sextern uint8_t  prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区 */
    , a/ F6 R2 C: H7 ^
    * B* ^0 k$ ?- R( C. Y- A# B/* 串口发送一个字节 */
    * i7 w5 E: G4 o1 \extern void com_send_command(uint16_t Data);* ]: j* |8 ~- X# i4 P$ [2 t. W1 K
    /* 串口接收数据处理 */
    " s' d+ C' ~1 d, y; `extern void com_command_receive(void);  }' F9 v4 `- r# e) m: I- ?
    /* 串口接收初始化 */
    9 ~9 p1 [6 d: Q3 W  Y6 Jextern void buff_init(void);/ _/ I! U0 j2 W

    7 O5 I" l3 _0 Z* h4 L4 B0 s6 `///* 串口接收一字节数据 */7 J* l2 K9 I8 r
    //unsigned char UartReadChar(void); //reentrant
    5 w# z; l$ |+ C" J' l1 b- e/*计算CRC校验和使用MTT(0X1021)
    , i* @7 A  X1 J: m! _; U参数:+ Q8 C+ N( t: r% D* [
    pBuff 为需计算CRC的缓冲区的头指针  \8 o- ~! I1 ]
    BufferLen 缓冲区长度(以字节计)
    6 i1 U2 W* g" k. p*/
    # b' Q; x# @  \6 ku_short CalCRC16_1021(uint8_t x[], u_short BufferLen);2 L6 w7 D9 n5 c) ~

    : @9 V! K+ L/ n" ?) P/* 命令解码子程序 */
    2 X+ ?3 O7 D: Y. b( Rvoid command_decoder(void);1 `4 |. i1 d8 i/ A* X
    /* 向主机发送消息帧,入口参数:消息类型 */
    ! _. o8 X  B" ]9 t/ D3 pvoid send_command(uint8_t command);* f* f5 `# z4 F; W! P5 Y) D6 c
    + T4 V& B  _! V* s
    #endif
    + L. ~  ~! ?9 g( S# W! r- J

    4 A# N" s% V$ [- D5 ~/ ~# f( n
    7 |& t! P0 m' E( ?2 P6 `0 [) }
    8 `1 N/ c, X& C  w3 }; Y& ~1 q) x2 S8 b/ [+ w8 o. }$ P1 P

    & V1 s& r1 a1 u" A; D+ h
    7 D# [! L% Z2 I* M& f
    , E8 l. W/ E9 I, E1 K
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-21 09:47 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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