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

 NuMicro M0516-PC通讯协议

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    NuMicro M0516-PC通讯协议
    7 K% L- H7 o6 V* G
    ' L# J$ s  x( ]' |* I+ R
    main.c
    8 r; B3 C0 L$ M8 [. a; r2 F( G+ c9 C* m/****************************************************************************/$ z+ o6 b. E( k/ i& k1 |1 v5 o
    /*                                                                          */
    + P: j8 e6 r4 Y  {) E7 ?/*                Copyright (c) 2016, 老马工作室                            */1 Y" T. @6 H/ B% ]5 `+ n
    /*                     All rights reserved.                                 */
    / H/ M, o" _% P) v/*                                                                          */, P1 V" X# v' M/ h/ B# K
    /*      Email:pcwebmaster@163.com                                           */% {8 ]$ P0 o) G  D, J2 t
    /****************************************************************************/! a% m; M+ m" H# s) A$ ]
    /****************************************************************************/# d; W- Z, y+ ^8 \# L) ?) `
    /* 文 件 名:comint.c                                                       */
    ; c4 q1 S' M& \. z+ x- [/* 版    本:Version 1.0                                                    */
    $ z& U7 K' k  K/* 描    述:串行口中断带通讯协议测试                                       */
    , I) B& o) V% c/* 主控芯片:NuMicro M0516*/, [0 _0 }2 t: X& X& j
    /* 晶振频率:11.0592MHz          */
    : U! f: G4 F* H  F/* 作    者:pcwebmaster(北极狼)                                            */
    ' x9 _3 s) H( M2 |5 b1 g/* 函    数:                                                               */' m* |" T- n# z2 b  k
    /*         system_init                                                     *// O0 H3 b+ W" J9 g3 s$ D* ~
    /*         com_send_command                                                */
    0 M# M% }4 L7 l  s/*         com_command_receive*/
    6 K" M7 p9 p5 A. r% n* N/*CalCRC16_1021*/
    ( s+ U4 C4 K* m, z* x  m* S2 J7 R/*command_decoder*/; M3 y! ^2 P, ]) U7 o0 [- C! ?* S# q
    /*send_command*/+ i/ ?6 x& `. r4 L1 j. ~  z& i
    /* 测    试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */9 b+ w; z3 V1 ?* S) H
    /* 测试现象:  */
    # e+ @1 s* N4 S3 B/* 历史记录:20016.02.18测试通过                                            */
    7 L+ ^& ^& C  B; N  K; Y$ U/* 北极狼          20016-02-18     Creat Inital version. (Version 1.0)      */8 N6 e4 I( ?/ m: s. @7 m* P  x* R) m5 k  @
    /****************************************************************************/
    , Y- o& p( Z! {( s+ W3 Y  `5 p$ y' t* F" I#include <stdio.h>9 P9 f9 t' s2 E0 z" l- X7 @4 T
    #include "M051Series.h"% Z; z/ j$ i9 c4 s$ N- ]7 m
    #include "comint.h"
    1 Z; R* y1 Z6 \9 h$ A, ]0 ^, D+ T#define PLL_CLOCK           500000007 S. Z/ v3 `* G4 ~0 x, Q

    3 |0 W% s  S& V, |; V" d4 a/*---------------------------------------------------------------------------------------------------------*/
    - F6 \4 t3 ^1 D: R+ r/* Global variables                                                                                        */
    # d+ ]. W1 E7 R+ P" x2 o% v/*---------------------------------------------------------------------------------------------------------*/( P/ s6 K$ d) r% A, Q  w

    ' h0 A' c  I: ^; Cvoid SYS_Init(void)
    3 h6 C. E+ d3 |6 T{! y& o& p  V" z! E
        /*---------------------------------------------------------------------------------------------------------*/
    , {6 n. ]& `1 T0 x& e    /* Init System Clock                                                                                       */
    ' }" Q5 f6 p; q; t6 W. L    /*---------------------------------------------------------------------------------------------------------*/  _/ x2 q; P% u' {4 Y/ T2 Z0 ~
        /* Enable Internal RC 22.1184MHz clock */
    5 ~6 V2 F" W6 g2 `) }3 U9 o8 P    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);0 g; d, V6 T) o( ]8 M: L
        /* Waiting for Internal RC clock ready */8 ^% @9 Y7 K7 X- N: u1 s
        CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
    ( ^5 E0 Z( N5 e8 `' g1 h  s4 b    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    . k0 ~/ b5 ~4 l) }5 E& X    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));/ w; w! C. T5 v4 h0 T0 q9 I% s
        /* Enable external XTAL 12MHz clock */# C! I( Z4 ^. X  p7 P
        CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);- W- I7 k9 Z- j" O6 t
        /* Waiting for external XTAL clock ready */$ w( e$ }1 [  _: m
        CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);( B7 n" B) K6 s- I
        /* Set core clock as PLL_CLOCK from PLL */7 G3 x9 m8 I$ @2 |
        CLK_SetCoreClock(PLL_CLOCK);
    5 }( Y9 ~% m$ K    /* Enable UART module clock */) I4 y# g% k3 D( ?9 f
        CLK_EnableModuleClock(UART0_MODULE);
    1 H; V+ R: ^$ ]5 b+ @2 z    /* Select UART module clock source */9 ?7 M* Y8 {& I1 q0 Z
    //    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));CLK_CLKSEL1_UART_S_HIRC
    $ J9 C, B# o% ?+ j" ?    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_CLKDIV_UART(1));: S, e" X2 b7 G8 A0 u6 P
        /*---------------------------------------------------------------------------------------------------------*/+ e- W4 i3 R. q+ ]) ~
        /* Init I/O Multi-function                                                                                 */( f  |! {4 x! [  O. ?$ ]0 p: @- ]
        /*---------------------------------------------------------------------------------------------------------*/2 b+ C( A6 Y1 T8 p# f/ ^
        /* Set P3 multi-function pins for UART0 RXD and TXD */
    ! O# Y6 d4 a- G7 S/ w# r7 U    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    , r0 G' _8 h+ N3 Y. g1 x: @    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);. H' F: o; C% R3 s& ?/ M5 ^6 o) n
    }% C! d6 ~; z  Q0 H$ q! ]

    ' Z( U6 B: F: {+ l: v* u4 O7 y6 cvoid UART0_Init()
    1 J/ |- J. w. U. N" }& C# U{
    - q3 K; x6 ^3 S& Z1 Q2 g    /*---------------------------------------------------------------------------------------------------------*/
    ( P- L+ \, ]) o& j/ Z% `    /* Init UART                                                                                               */
    8 `6 g+ a) @  A3 ]# w6 ~  g& w    /*---------------------------------------------------------------------------------------------------------*/
      {0 O3 E7 y% S    /* Reset IP */
    ' f3 F7 p: J5 V    SYS_ResetModule(UART0_RST);9 {" g) {1 ]1 H
        /* Configure UART0 and set UART0 Baudrate */- R. |+ Y5 U1 M& L; w: r3 s, e
        UART_Open(UART0, 115200);8 a& g3 U& b: x6 l; c
    //UART_Open(UART0, 9600);
    6 h9 Y+ `5 @) B" z4 o; L. m    /* Enable Interrupt and install the call back function */( T( z& h) e2 z+ j+ U
        UART_ENABLE_INT(UART0, (UART_IER_RDA_IEN_Msk));// | UART_IER_THRE_IEN_Msk | UART_IER_RTO_IEN_Msk));3 _- v- o5 g; Q. y( v3 v
        NVIC_EnableIRQ(UART0_IRQn);! ?2 g! W8 |% ]5 Q* ~
    //    while(g_bWait);" n+ e3 T5 ]" \  W! n# G4 g9 ~- T9 k
    }0 _6 P5 M6 O; F8 W7 N
    . N/ Q; `9 u9 r
    void Uart0Send(int32_t Bytes)
    ! @% h" ^6 v$ K. s- n{8 ?# ]7 `1 b/ z' L
    UART0->THR = Bytes;8 B/ O* T, T% _- d" j5 Y3 G% R( N
    while ((UART0->FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
    ' _! R) K  a+ w' O}  i! k# y) e  O: C6 M0 S
    /*---------------------------------------------------------------------------------------------------------*/! F* ]8 v- S9 e$ |
    /* MAIN function                                                                                           */4 a; @+ j  h9 L+ H
    /*---------------------------------------------------------------------------------------------------------*/9 k- v8 P1 J" Q+ z; N7 q0 A
      w: V8 T+ K( g  d) _6 `; D
    int main(void)2 @' h0 U6 o) `6 i" [
    {
    4 \  e7 P( V( A4 q//int8_t  i,j;    7 {6 J5 m8 n. v6 w1 Z7 Y1 \. G
        SYS_UnlockReg();/* Unlock protected registers */    ' F6 r8 A7 e4 B) H0 p0 G% V
        SYS_Init();/* Init System, IP clock and multi-function I/O */   
    ' Z3 d+ m/ V5 O    SYS_LockReg();/* Lock protected registers */    # ]/ N" t/ L% H0 ?' ]8 T. U4 q
        UART0_Init();/* Init UART0 for printf and testing */& o( \* w. d% d
    buff_init();
    ' k$ A1 G4 ?8 S  F! A    /*---------------------------------------------------------------------------------------------------------*/
    3 a; R* Q4 `$ {, y, {0 y) M    /* SAMPLE CODE                                                                                             */& k4 @0 @! p$ ~( V. u6 ^$ g4 d7 J
        /*---------------------------------------------------------------------------------------------------------*/: u8 p0 S! n. T7 a% c) O
        printf("\n\nCPU @ %dHz\n", SystEMCoreClock);; `& d  X6 g4 l+ _  ?
    printf("\r\n 世界,你好!\r\n");  
    8 U$ d' J$ o: W8 G3 V! H9 kprintf("\r\n USART0测试正常! \r\n");
    ! c* m3 @7 Y% j, W, C# ^) \4 Lwhile(1)/ z' X- E3 I% B0 p( r
    {: B, b. M( a1 b+ N- ~6 c( F2 K0 D3 k( G
    com_command_receive();
    6 ]0 }+ |2 o; u4 d) y8 T! R% h( _}
    : @5 s! t$ @/ C  p}
    + G5 i- Z3 ]5 @% t
    $ B4 J- U3 e4 ^' UCOMINT.C. p. c8 R) R! r1 Y! H. D3 c" z: t
    /****************************************************************************/
    7 Q" s% B7 }+ @, t2 V- P/*                                                                          */9 y' r" g# q& `1 d2 C
    /*                Copyright (c) 2016, 老马工作室                            *// d" r- q4 u6 @
    /*                     All rights reserved.                                 */. J) a/ B& N2 W+ ]/ E& j
    /*                                                                          */
    & a: [" v$ B4 o6 O8 d/ |9 \2 @/*      Email:pcwebmaster@163.com                                           */. G8 j- F3 A- R' B" @* F3 g5 I! z9 d# `
    /****************************************************************************/& B6 k  Z# f2 {& l' E) J* j3 [% c% R
    /****************************************************************************/" L" b; C1 z6 Q2 ^; @; h6 {# t
    /* 文 件 名:comint.c                                                       */" k" o# h8 [6 N  o( \* `) w3 s
    /* 版    本:Version 1.0                                                    */" P, c, C1 m/ E" R* ]9 i
    /* 描    述:串行口中断带通讯协议测试                                       */' t5 V+ f  }1 ~! t
    /* 主控芯片:NuMicro M0516*/6 G6 Y, t: x+ p4 F' b- ~) Z0 p
    /* 晶振频率:11.0592MHz          */
    2 j) e1 {3 Y1 h! m9 S/* 作    者:pcwebmaster(北极狼)                                            */. r4 `" e* ~8 o
    /* 函    数:                                                               */+ F5 ~: q- C- M& X8 d2 z
    /*         system_init                                                     */
    " |( S, N7 V: z8 |/*         com_send_command                                                */9 S% ^" |' r+ s$ _' f
    /*         com_command_receive*/) T& j3 v# h* e. z6 b; w
    /*CalCRC16_1021*/
    + C5 l& t1 V# l+ n/*command_decoder*/
    & `2 V- ?/ C* ]$ ~) v& t& ]/*send_command*/0 O9 A. c' F, b1 j. [1 q
    /* 测    试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */; }& R% z. e' @- j) V" Q4 ^
    /* 测试现象:  */
    * t8 A4 g' S8 n. E/* 历史记录:20016.02.18测试通过                                            */" a# c# C, Q! n" ^7 C3 k  R
    /* 北极狼          20016-02-18     Creat Inital version. (Version 1.0)      */
    $ {6 \1 n5 o0 C! }9 m/****************************************************************************/
    : |5 p+ P9 y0 [9 K+ V#include "comint.h"& N0 C! m+ N. N- i! Y5 \- {; K
    ) P6 f( y1 J9 c% C. s/ _
    uint8_t  pint_buf[MAX_RINTL];   /* 串口接收缓冲区       */, t  u6 {! B2 p1 M
    uint8_t  pint_read;             /* 串口缓冲区读指针     */$ {( l: F, f1 U( I: @
    uint8_t  pint_write;            /* 串口缓冲区写指针     */$ r  a( {* W0 I+ l+ Z9 D% F9 x
    uint8_t  psend_int;             /* 串口发送允许标志     */
    2 f. I+ E! M& }- G) M1 Q& c( Buint8_t  serial_flag = 0;       /* 串口接收数据标志位   */- {6 [2 L' A% n4 \* P! E
      {: X% {: ~1 [7 Y/ B
    " H; c$ `  e1 G
    uint8_t  prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区    */
    1 S" h, A, }8 Y9 C! |* ?& @  Nuint8_t  prec_num;                    /* 命令接收缓冲区字节数 */
    3 ]; n' u1 \$ m$ {# R
    0 r, ~$ i, r4 s4 ~* d% q( nuint8_t serial_lengthl = 0;           /* 消息命令长度低8位    */
      f. H6 M7 Y# h: Duint16_t  serial_length = 0;          /* 消息命令长度16位     */
    % }0 }2 R  Z; H$ ^* t4 b% Q7 \. f: S8 {7 _6 C
    uint8_t ADDRESS[2]={ZU,ZHAN};       /* byte0:通讯组地址, byte1:开发板地址 */4 m2 |2 R; A9 N% H! v, X( P

    0 h  v) X8 J0 l( k% i9 ?4 q% T) @! y/* 串口发送一个字节 */
    + x  b8 d  a& c, V! q+ avoid com_send_command(uint16_t Data)
    " d, V: a' l* Y: F! C& C{
    # r, W- ]) B; G" [UART0->THR = Data;- P$ w3 K% |6 p/ i7 G7 H" k/ Q
    while ((UART0->FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
    9 L2 b* ?1 V: N5 e0 t- Z}2 l% x$ @) U: n" b) _& d# b$ o  J

    ) S, ^0 j# S& z+ \$ _; z/* 串口接收数据处理 */, F( a9 r. c4 e! T5 ?0 `
    void com_command_receive(void)
    : G# M5 t$ e/ b' V  ^: Q) \{; |5 }$ r6 E& R
        uint8_t var1,var4;
    ! C; d/ |; |7 U) G    uint16_t crc_data = 0;, q& T9 b/ b: s/ X) |
        var4 = pint_read;
    5 H- e; t& v; z- l. [. o
    & O1 ]4 g4 K' {, l    if (var4 != pint_write)' z$ K2 L! m: F2 x6 {8 z% q( L) r! r
        {) `3 H: C" b, |# k8 n8 ?
            var1 = pint_buf[var4];
    0 k& E( U+ s' e' t+ r" }- y0 p- ~# H7 _        var4 = var4+1;* `6 z6 |7 @( w8 _$ U- ]
            if (var4 >= MAX_RINTL)0 o; b; S& p- N+ _3 K4 i/ r
                var4=0;
    + `- D% W' I) Z: K4 V" U4 ^
    7 A4 V, g; T. x/ s# `! ]        pint_read = var4;$ a5 P, q; c) H6 D9 l
    * o  `" h/ M0 g7 \; U3 [# |
            switch(serial_flag)1 s# A9 }5 t& ~2 y, E
            {
    $ B" b' u8 W" u4 G, T# s6 g! G            case 0: /*收到起始位*/) l$ `8 E) L4 {
                    if (var1 == SYN)3 m5 V/ m+ ^1 l* u# I
                    {
    4 A5 m# {) s8 m, t; A) ~                    serial_flag = 1;5 r" l3 Z8 m1 B5 C/ t. \
    //com_send_command(0x01); //测试2 I3 |  ~  c# v; h
                    }! {& n1 t4 B& Z; k1 I# P, z. u
                    else
    3 B  k4 `- J5 V3 d9 \                {  ~& A5 F# g3 C; Z+ M& c
                        serial_flag = 0;4 a+ }3 n. A2 R2 m' s+ m
                    }
    4 u" _) X0 H9 c# H7 X$ v                break;
    , R; Y2 C4 w) m+ w
    1 X! a% W: [7 G: T            case 1:/*收到起始位*/
    9 O8 R( K* M$ D                if (var1 == SYN); p3 a! [7 E3 \5 I. D
                    {1 L; r/ m8 ?) ^" o& O9 u
                        serial_flag = 2;3 m* b& d# N# J+ m
    //com_send_command(0x02); //测试
    6 ?! K3 w' ]" v& @0 s9 k                }  o2 v+ q: B0 l& T! b  Z* {% H
                    else
    6 s2 m5 f- o9 n& `* D8 \                {
    " H% K8 l8 t; c+ m- m/ h. S6 b$ R                    serial_flag = 0;
    5 P) e* x5 n$ p* v# ^  s                }& C% ]* c6 h! U  b
                    break;9 `) I" Y3 E+ K+ Z  f# e

    " u5 |2 g' F* D3 _0 Y            case 2:/*收到同步位*/( e" z# I1 Z+ ^# q$ P( G
                    if (var1 == STX)
    4 }# T2 R" i* ?! j, G$ \                {9 I; T8 H1 `" M4 e5 ^- H
                        serial_flag = 3;' c$ I7 l* r) I/ u* e# R
    //com_send_command(0x03);//测试6 l3 K) A% b+ e& Y# V0 j; `
                    }
    & t" G3 y3 X! b8 }                else% q% i* o4 g# }: g3 R+ C
                    {( _( u7 O% ^0 K" i
                        serial_flag = 0;- a4 O- s5 M$ N1 b" b. k& m- i7 `" q
                    }( j; ]8 D0 [8 L7 c4 R
                    break;
    5 f" r1 n7 ~$ i5 h0 y
    5 U6 k* R. n& _: O6 m6 x1 v* K) a            case 3: /*收到组地址*/
    ' \6 G/ i4 K( v" c" i2 d                if (var1 == ADDRESS[0])
    / I. l7 V; u3 s! T1 P& l                {
    3 O3 ?% k! ?# Q' e2 }4 R                    serial_flag = 4;' O" U2 x! U) S9 m
                        prec_num = 1;
    ; p4 q0 a" y+ M: u; ~                    prec_buf[0] = var1;; q6 _7 N8 v, A+ k
    //com_send_command(0x04); //测试. [2 {  R% h( m. M6 X, p
                    }9 t. k. n+ ^) w% k; x2 o  q
                    else
    % `9 O$ e, d- _8 W; P                {
    , a1 Y/ p7 U3 ?" L                    serial_flag = 0;
    , @& u3 Q5 O' L; m                }: n; S/ S) S, A/ l4 K5 I5 T0 a
                    break;
    ( ^) |" y5 \( |% J& d# M; U
    ( o/ v' Z, s5 E/ S9 n; u, f            case 4:/*收到本机地址或者广播地址*/
    : }6 H! f) ?) s; Y                if ( (var1 == ADDRESS[1]) || (var1 == 0) )
    4 `9 q0 ~8 R; `- q                {
    6 T9 o" \. B4 v3 f- l. Q- o                    prec_num = 2;* z: y4 E. ?6 V& a: D, @- o: G7 Q) U
                        prec_buf[1] = var1;
    6 D/ o$ J6 E* O6 N+ X( k                    serial_flag = 5;
    3 V4 n$ C" `4 j//com_send_command(0x05); //测试
    9 }7 A5 T; j' ~, i                }; z2 ?' O# h: k9 M8 H
                    else4 k, \" T- P; _
                    {
    + q1 n9 ]9 G  R5 z" `                    serial_flag = 0;
    ' O+ u) o) Y  I- ~' e5 K( E4 Y                }
    ! ^" g/ m5 O# u$ z) m  e. Y5 }                break;
    ' a4 Y9 T- V0 }4 B- ]
    7 W* [3 t1 f8 ~- [: C            case 5:/*数据长度*/$ M, ]0 r& _- g9 T2 }( e
                    prec_num = 3;
    . B! G0 a4 \  }1 J                prec_buf[2] = var1;# R+ l/ W: t; ~
                    serial_lengthl = var1;' b  C' f' d1 j) x0 L. t8 w6 F
                    serial_flag = 6;
    % c. H: T5 T* g6 u# ~1 z2 f1 _' S//com_send_command(0x06);//测试
    5 E; r& u( P( l6 w4 e+ v& b                break;! W' L' k# J' c* ]
      v: X& T5 J! ]5 _- m3 U' f
                case 6:( Y+ x7 n* y' q) ~
                    prec_num = 4;
    3 h; I) d9 }' c+ s- J  Y3 t2 n                prec_buf[3] = var1;
    $ m- k( \( {: G                serial_length |= var1;
    4 {, M5 I; t/ _; z0 Q7 S                serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
    1 q* C- R$ z6 ], d                serial_flag = 7;
    5 G  l1 l5 H/ Y7 S. q//com_send_command(0x07);//测试2 R* d6 l5 m1 u5 u" b6 T+ L
                    break;
    " B5 |5 H; j& E9 E# m* C4 B. W3 Z2 B3 H* t- `
                case 7:2 `% q7 A6 F9 X; Z# `1 j" o
                    prec_buf[prec_num] = var1;
    / m* q- n2 G; c& ?; S                prec_num++;' j0 ?5 \2 U! @% b
                    serial_length--;5 U+ }% v, X: ^* j4 Z
                    if (serial_length == 0)
    ' C0 [6 P0 E3 H- V" C3 D                {
    ! H6 h$ z2 W* r! Z                    crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 计算crc校验和(从组地址开始到ETX )*/3 {  i" L+ Y$ e! @( q0 i
      j! k  _; i# P' K4 r& M
                        if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校验和正确 */0 W! M' C, X) z" i- S9 L
                        {* |' N1 M* K- G( k9 e
                            prec_num = 1;
    ( s% J  t2 @3 z9 {2 s                        var1 = 0;
    / i. |5 E; o+ ]
    % Z4 L$ {  {2 J3 Y                        if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */! Z7 w& x. |2 {* ^0 t& A* h% n
                            {
      h* p" F; J: I9 }& p$ e( ~                            if (prec_buf[1] != 0x00) /* 如果不是广播地址则回应ACK*/
    % d0 o0 p0 Q0 I! icom_send_command(0x49);//测试                                 msg_last_push(MSG_ACK,0);. a" [# F1 G; w& n' U$ v
    //send_command(ACK); //测试   
    ! E, z; h( M, @$ o! l" s+ l, ]2 y4 a
                                command_decoder(); /* 如果校验和正确,则进行命令解码 */  S( Q4 z& j0 F, A, K
                            }
    ) m" j3 P3 v( B2 J8 H                        else- M) t6 f% Q8 R' |" r' P4 c
                            {
    ( }# |, h& N" p# z( p
    , b3 k0 s9 ~# G# L4 F5 w0 L% Bsend_command(NAK); //测试
    * x2 w. ]& t( ^& ^! \" y                        }) j/ b: s( V  i  D
                        }
    / x- }4 r, M, I, Y  |, v                    else
    / M0 z% s3 Q! p  O! j2 O                    {) o" D' h7 v! z" |: `% f- ~& ?" A% f
    5 ?9 E/ }' p5 q6 w
    send_command(NAK); //测试
    7 B  G1 B1 H- d6 L( u                    }
    7 ~' w  Y3 f+ C9 }0 `6 F                    serial_flag = 0;( a: ~7 m& d4 C) a$ X; K
                        prec_num = 1;, R+ y  W2 U- }( i8 {
                    }
    0 y9 x5 \- K% Z                break;  m4 w  R* T! y) X

    + J7 W2 a% b  H            default:) y9 p4 `2 \' e- y
                    serial_flag = 0;2 d0 D9 ?. k  E( v0 l
                    prec_num = 1;* x. `- [8 ~! b3 G2 k; t3 v
                    break;0 \1 t, N' ^8 J5 {% E
            }/ Z( U% i9 _' C, d0 D* K
        }
    , Z2 }& h  ]/ ?4 C) D/ l; e}: w9 O# t7 r# N& ?5 O4 A7 J5 Y
    /* 命令解码子程序 */. A+ g' W% R0 ?0 y" @, i; M
    void command_decoder(void)  ~1 N' A8 M9 s  Y
    {
    0 }, g$ ~8 w6 X$ g+ i//    uint8_t i = 0;4 ^1 \0 x' X5 L2 H, Z6 ^
    5 y, g/ U; q! y5 Y
        if (prec_buf[4] == 0x31)       /* 设置报警阈值   */- T7 J. N+ o, S5 h" E
        {  " o& X+ t8 }2 U
    com_send_command(0x11);//测试2 H& ^6 B# C/ d/ a" i) M
            return;/ g9 I2 M( d. L, k
        }9 Q! q. s8 ^. ~, [
        else if (prec_buf[4] == 0x32)  /* 请求报警阈值 */
    & [/ B, U. }$ T, b    {0 Q* u5 X( L2 y9 V
    com_send_command(0x12);//测试?
    7 A/ J1 b6 \+ N! t        return;
    8 F# r% G+ b, L. l4 e. H8 L    }
    : u/ I( `- J& S! I/ Y. E    else if (prec_buf[4] == 0x33)  /* 修改当前时间 */9 B6 \1 a, C' n
        {
    $ j; P/ _4 \, W0 c8 @' [9 Scom_send_command(0x13);//测试- J' l3 x$ K- p) f, e6 U
            return;" ~4 `9 h8 l. Q: a) g: u; I; G$ E
        }  W& A6 H, Q1 q: Q
        else if (prec_buf[4] == 0x34)  /* 请求当前时间 */
    - g5 N' Y1 a9 N    {& m. b/ i3 O: F. K, M
    com_send_command(0x14);//测试
    - \, z- M/ s+ r7 Q* l) y+ z        return;
    " {  a- w, G4 n( o    }
    ! E* Y5 D4 H( [# @- q    else if (prec_buf[4] == 0x35)  /* 请求当前数据 */! k7 D) r) Q3 ?7 o7 e# P; k  S0 c
        {" f% |4 p1 I2 V; H, e/ u! m
    com_send_command(0xAA);//测试
    ) G4 f% k1 ~1 o* @8 M. ~0 h7 }' `//__nop();; S* E+ ]% L. s: _  U8 E
    com_send_command(0x15);//测试
    ! t" f7 [: ], i' f4 X7 G        return;6 ?- G. D: }0 x+ X1 C- P
        }
    " v: \2 G. E8 J: x1 I% j9 S2 Y* T    else if (prec_buf[4] == 0x36)  /* 请求看门狗信息*/- n/ h, |! P6 B+ K- Y$ }7 H( Z
        {3 S4 C, ]& q" p( U  j% y" d# t7 \
    com_send_command(0x16);//测试' x: E  P! s1 P
            return;  ?, ~; t( N7 @8 p9 Z4 h
        }9 z3 @5 V( N+ ]- g
        else if (prec_buf[4] == 0x37)  /* 请求报警情况 */  S( \$ v# o( m1 ~( L
        {
    . v* P0 N+ x* T; _+ a& rcom_send_command(0x17);//测试- m  w1 [3 O$ D! ^4 a8 s
            return;
    ; N& b5 S& N* S8 s7 \! A    }
    # r5 J1 f& y9 M( u' v4 R* ?* a    else if (prec_buf[4] == 0x38)  /* 配置设备地址 */6 v, @! T3 i. i
        {0 K/ F6 w5 o3 k. l7 c$ R
            ADDRESS[0] = prec_buf[5];  /* 通讯组地址   */1 E: `' A1 A. D- }( h* J
            ADDRESS[1] = prec_buf[6];  /* 开发板地址   */" i  p+ m; Q! x
    com_send_command(0x181);//测试
    # Y$ `3 g& u, Z2 j& Q. k7 W# o        return;$ I. A' Z+ \: }/ U2 D& A4 p. A
        }% G) F! H) |7 H
        else if (prec_buf[4] == 0x39)  /* 请求设备地址 */
    3 j$ c$ s' e/ p    {
    ) U4 ~0 s" e! B- c, o- rcom_send_command(0x19);//测试/ z% l7 s. ^; r3 _3 s$ Y2 W9 k
            return;
    & O+ u, }2 ~* E4 I    }
    6 {/ Z( `" W( ^0 X    else if (prec_buf[4] == 0x3a)  /* 控制模拟量输出 */
    # e4 i( Q# l+ ?& |4 C    {
    - z% ~. i! B3 q; Icom_send_command(0x1A);//测试?% Z! V6 q; f' f" G! q$ J# G
            return;
    ) k+ X3 H, H' f* |1 c3 l* h    }/ x' Q8 l/ y2 T( \
        else if (prec_buf[4] == 0x3b)  /* 控制开关量输出 */9 K, M. ?; ~3 Z* U; E
        {
    2 D/ ^3 \7 z5 h$ H3 B/ V8 W& ycom_send_command(0x1B);//测试+ E: m2 l9 s; c8 \; t  Y- c( Y
            return;8 {; W3 `' p5 w3 |  E$ a
        }& U, z# b& j+ I7 V
    //if (prec_buf[4] == 0x00)       /* 如果是广播地址  */8 w# F0 q( n" P; ^1 v) \  L
    //    {  7 V  j. u% @+ e7 g" y: _% r) i
    //com_send_command(SYN);
    2 p: N+ p' c6 f: [5 m9 ^2 ~' S' G- V//com_send_command(0x00);
    . t& s/ K4 J: T- Z! C//com_send_command(SYN);  T9 K5 ^# N% g) ]3 |
    //        return;$ e$ Z9 L2 N* _
    //    }
    . |9 ?1 P; F4 p4 V  @* z8 O1 x- q}9 p' |+ \5 N0 b7 q

    3 x5 [7 s# _( E/ P4 f& J* v# H/* 向PC主机发送消息帧,入口参数:消息类型 */% x, z! }# `" }5 r( c
    void send_command(uint8_t command)
    2 z. X! j! r, |{/ V* Q! ]8 V3 @9 W8 S
        switch (command)8 m4 ~* P) `- P+ `: H3 V
        {  B! Y) p8 k- f4 W7 v. ]4 G
            case ACK:( x- a3 D1 f& C6 K1 p8 }
                com_send_command(SYN);
    5 b4 s) a5 D- W, ~1 }" f            com_send_command(SYN);' Z, }/ ?4 X  t0 ]$ k
                com_send_command(ACK);1 ?7 _3 ?5 E( l! c  @$ S% ?
                break;/ s* v6 [/ y6 q8 y6 Y) a5 ^7 |8 S
    5 K) z' x+ p/ s, ?2 L9 x  h  b& P
            case NAK:" n4 V1 U" I1 |! z) k* E  X& g* K: z
                com_send_command(SYN);& T  b6 K, t- b% l& r! v. j' g' F
                com_send_command(SYN);6 ~3 O( \9 D$ p; l# s. K: `$ o
                com_send_command(NAK);
    . \5 i+ \7 H. y" ]9 w$ I            break;+ E% m; Y9 D% _" K, e7 ~

    ) f. Q/ E# h/ U, J1 j  k        default:! c+ M4 d, r9 @# D, A
                break;! G, E- o& W1 T5 g/ e, x* H
        }
    # X& O  @' g5 H4 F, [}& F+ U8 [1 _# t7 n/ I
    void buff_init(void)4 j8 s2 R0 l6 z0 B* z
    {! J' I2 h: G9 m& T, H# ^* l
        uint8_t loop;# Q% W1 s# s( p2 f" P7 q5 d
        loop = UART0->RBR;   /* 清串口缓冲区   */' n; Q$ s  j, H7 F+ X
        for (loop=0; loop<MAX_RINTL; loop++)
    & L' k4 ~% F: u. z    {
    3 L6 q: H" F$ \$ ~2 x        pint_buf[loop] = 0;- j7 X+ N  ?1 R* _
        }
    " G- O  {! z+ i( @7 F0 x}
    9 U6 b, E+ C; _# z6 I/*计算CRC校验和使用MTT(0X1021)3 K/ O( {5 A* Z
    参数:% ^2 H# ~4 t: A: X* o; h, y/ t
    pBuff 为需计算CRC的缓冲区的头指针! g. V, ?+ B9 a& B9 o
    BufferLen 缓冲区长度(以字节计)
    ' a1 G4 {  D0 O" S*/
    4 w& Q2 h2 W; u6 J0 b' b" Cu_short CalCRC16_1021(uint8_t x[], u_short BufferLen)' {+ T5 K. z0 m
    {) X: M$ l' i4 V* C+ G9 G" b
        u_short i;- E7 e# j5 A' c5 {3 V0 K
        uint8_t  j;5 B0 ?( U7 I3 ^  `* V9 y) T
        u_short crc16 = 0;
    , v/ J5 |6 W7 q# U$ E    u_short mask = 0x1021;* j, ?6 p. X# C; B% f: [9 W6 {
        uint8_t *pByteBuffer;
    - Z; P3 w+ p: v6 D' t  ~    uint8_t tmpbyte;% O) v& s4 ~# b* ~' b: U( w
        u_short calval;- x% w4 i* N) ~- \8 p+ P7 @0 C

    * X: o" Y. n, v3 a5 f    pByteBuffer = &x[0];
    2 D  y  T& s0 a  w& E5 C1 h/ E$ j7 t3 H( K" ?+ {( m9 v" ]1 j
        for (i = 0; i < BufferLen; i++)" e8 x4 F' A+ m3 e" n
        {/ H: j# `* p3 f# |
            tmpbyte = *pByteBuffer;
    1 |! r# J# P$ R3 V5 k( l7 _        calval = tmpbyte << 8;7 L$ ?% T* i5 `2 d; h
            for (j = 0; j < 8; j++)
    + I4 ^) d) \8 e+ {. _% g        {( ~% T8 }4 P, F; j1 o
                if ((crc16 ^ calval) & 0x8000). `; C6 c6 ?8 z" Q/ Y
                    crc16 = (crc16 << 1) ^ mask;
    3 W: T" n  L# f; P0 N$ U0 U. S3 G            else9 H. c7 N2 l$ [6 p3 s2 x
                    crc16 <<= 1;2 J" C! m7 f; s8 p* p; `

    2 P1 K0 \3 w- R2 R            calval <<= 1;
    " @( ^* d5 u7 x        }
    ! X; }) b4 ~/ d% f/ \5 X        pByteBuffer++;. o6 C9 O* d# j
        }
    * f* N- P) K, I3 J' @3 n    return crc16;
    ' W6 r+ l1 h& H& k& }' v: }}7 v3 F2 {; `! M  C( \# O

    ( t- l8 U6 J! K; K- _/*---------------------------------------------------------------------------------------------------------*/3 M( T- Z3 [2 @5 y7 s+ f8 Q- v  T
    /* ISR to handle UART Channel 0 interrupt event                                                            */
    6 X4 E; X# ^4 {2 R  `% b0 F2 [/*---------------------------------------------------------------------------------------------------------*/; w; g3 {0 S% l4 t; k
    void UART0_IRQHandler(void)9 H* l+ @# Q" ]
    {# d; r$ X% O& t, A) n6 b: M
        uint8_t temp;8 f$ R9 N; ^6 |3 x! M& x$ f
        uint8_t temp1;
    ) l$ W. Z( J5 o9 V4 x) N2 `* V2 y
    if(UART0->ISR & RDA_INT) //检查是否接收数据中断+ P, C+ u  ~- v4 `
    {) n0 ?" a: Q& Q0 U! v
    while(UART0->ISR & RDA_IF)  //获取所有接收到的数据& K* }( D; [" c5 h% m4 d
    {  h  k$ B$ q3 g
    while (UART0->FSR & RX_EMPTY); //检查接收FIFO是否为空9 z& t& _. O9 {8 N. k' r4 d
    temp1 = UART0->RBR; //读取数据( z: h3 t9 P+ [5 ~& b& w3 t3 g
    temp  = pint_write + 1; /* 判断是否可以写入 */: t; Z) d# Y$ l3 x$ _
    if (temp == MAX_RINTL)! k* i$ z7 X% ^3 \/ p. L
    {8 I1 \6 H( L* c% q
    temp=0;
    ( A$ N% e. _5 a4 J" {1 q2 B}- i7 O3 f5 ~, ?! y' Z0 t! D
    if (temp != pint_read)& i' |0 f. m1 u) ]# W
    {6 r9 Z1 O0 f2 X5 @9 l$ @9 @
    pint_buf[pint_write] = temp1; /* 读取数据 */
    ! ?4 M5 N; H) q: r, v  v* ^/ ?) jpint_write = temp;  q+ H3 T$ ~; J$ K* M
    }
    4 w4 l# X) r: [}
    0 x8 R; B% q2 {}
    / R, n4 @2 ]5 J}/ q9 M6 m( c8 L8 u

    5 }2 _1 K6 c2 }2 ^" @: lCOMINT.h
    , _# k- o0 `# N2 @# O2 [
    0 U8 j& ?: j0 Z# d  q0 |#ifndef __COMINT_H__" r! ]$ y$ R+ D" m& ]3 J$ c
    #define __COMINT_H__
    3 x& p7 {* K3 }9 T# ]: X) {4 s/ A& Z. {' L9 |" A; @: ?
    #include <stdio.h>+ \$ S9 z0 K7 e8 N) z* W
    #include "M051Series.h"
    : ], b- P% [/ c6 L# s) K2 H
    0 o" i! P* Q3 e#define RXBUFSIZE 8//10247 y1 A; G, u$ c8 q
    #define TX_EMPTY(1<<22)8 V. ~$ V1 t: `- f- \
    #define RX_EMPTY(1<<14)+ T3 R- p5 R9 n3 I4 V( A3 }
    #define RDA_INT(1<<8)
    3 W9 _) x: k8 P  E: o" ^#define RDA_IF(1<<0)
    6 }/ x" |$ y1 R' T; `: v, Z$ b- m& G' m" }
    typedefunsigned shortu_short;
    % v8 D" S5 B/ ^* j7 L6 B  p3 u2 Q7 s) [* \  o* w& U. p, o9 W5 B( Q
    #define ZU0x01 /*组地址*///通讯地址修改这两项% m7 x  O# h& S/ _" H1 e  a
    #define ZHAN0x02 /*站地址*///通讯地址修改这两项2 i) F  Y" O9 V1 N
    7 T- K/ u8 l# T! g+ T! J/ E" @( `
    #define MAX_RINTL       16   /* 串口接收缓冲区长度   */* E4 K" J, h. O+ v4 @) C
    #define SYN           0x16   /* 通讯同步位*/$ Y2 }; W/ S) x% U( ]' i- y+ W
    #define STX           0x02   /* 通讯起始位*/. {9 Y* _4 w- a8 ]4 N: k
    #define ETX           0x03   /* 通讯结束位*/
    ; q' z( \# g, W& V! @* v) j' A! z9 w( L; b/ e0 n- X- V
    #define ACK           0x06
    * g- V: r) C/ O) |#define NAK           0x15
    / g  b( Q/ _  H! t. X. V) J4 M& I; g8 d2 y7 w/ T0 d
    #define MSG_ACK          2    /* 正确应答信息         */
    ; w, D; z. j# E$ E#define MSG_NAK          3    /* 错误应答信息         */% J: G, |% f1 G& m- S; q
    #define MAX_COMMAND_LEN  16   /* 串口接受命令长度     */: Y7 z+ D0 g$ x- v1 p- G

    1 r' ~- W+ {8 A% P; }) Sextern char str_test[25]  ;4 t: P  }' Z7 ]! ~3 w
    extern uint8_t  pint_read;             // 串口缓冲区读指针     */0 M2 |" k* T$ s2 }. B* p$ j
    extern uint8_t  pint_write;            // 串口缓冲区写指针
      s. X* j  Y/ K& T$ _//extern uint8_t  data  psend_int;             // 串口发送允许标志    $ d6 S6 Q# x5 |. d
    extern uint8_t  pint_buf[MAX_RINTL];   // 串口接收缓冲区      
    % l6 `* T/ _. G, yextern uint8_t serial_flag;              /* 串口接收数据标志位   */4 }7 `/ d; R) N& [

    2 s3 I( |, {' R5 W% d" Bextern uint8_t  prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区 */
    ' {. w" M0 `# l' X( N
    + R, c9 {# g3 Y. \/* 串口发送一个字节 */% S$ X: O0 Q9 w2 f! _5 i0 K# P& {
    extern void com_send_command(uint16_t Data);
      G" Y( ~1 L0 j) ]/* 串口接收数据处理 */
    + @8 M3 m' f* I" [1 aextern void com_command_receive(void);
    0 g9 Q4 o( `7 O* d0 Y' w. V% Q) t/* 串口接收初始化 */
    * s. y  a4 ]! B, U( {extern void buff_init(void);. m, T5 S% ~( n% B, _7 }& z
    2 t6 u6 G, `1 i7 P8 X9 k! V/ q
    ///* 串口接收一字节数据 */
    - h' ^0 y$ F" s$ P" t. c//unsigned char UartReadChar(void); //reentrant4 J7 e$ K) M: p/ B8 o$ I7 T
    /*计算CRC校验和使用MTT(0X1021)2 L& {  r' t% F3 D3 h
    参数:0 j5 K0 m6 k& a2 C" b
    pBuff 为需计算CRC的缓冲区的头指针# }( k% n$ B: f+ h9 k, }) h; Y) d
    BufferLen 缓冲区长度(以字节计)
    : `& W  _  R1 s8 w*/
    # G2 R2 }: N- j1 Fu_short CalCRC16_1021(uint8_t x[], u_short BufferLen);6 X5 l8 ~1 q. H0 [: }  q
    ! _3 t6 B' Q# B$ `
    /* 命令解码子程序 */
    " V) A+ I1 ?2 y+ ~# Rvoid command_decoder(void);
    6 r1 N- q7 F. |3 d1 p5 o( N/* 向主机发送消息帧,入口参数:消息类型 */
    ) @& f0 ^! _4 gvoid send_command(uint8_t command);
    3 @/ L/ e; t9 L7 Y4 z' b/ r  E' G  u9 b6 I; |4 l
    #endif+ a: K/ l4 h# G4 I) X
    # H) @" y  t2 u! t, A

    5 f1 Y, P+ A$ C, v2 b* [. X3 _. [1 j! v: X0 X

    1 e) q4 X* L( `: R$ f8 `! u) w/ ?  T6 B6 c# ~3 S, b. e* a* ^3 X+ Y1 X

    4 L% @" \6 `2 c6 w5 q

    ! X- @0 J! Y- A5 e
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-24 18:52 , Processed in 0.203125 second(s), 23 queries , Gzip On.

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

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

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