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