TA的每日心情 | 开心 2019-11-19 15:19 |
|---|
签到天数: 1 天 [LV.1]初来乍到
|
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 |
|