UART通信程序,附带自己定义的协议
uart.c
#include "_ffmc16.h"
#include "uart.h"
/** UART protocol **/
/*
HEAD LENGTH CMD DATA BBC
AA N=1+n 1 X1~Xn verify = ~(CMD+DATA)
*/
UCHAR rx_count; /* rx counter */
UCHAR tx_count; /* rx counter */
UCHAR data_rx[RX_LEN]; /* store reception data */
UCHAR data_tx[TX_LEN]; /* store transmission data*/
volatile UCHAR tmp;
UCHAR ok[] = "OK:";
UCHAR er[] = "ER:";
/***********************************************************
Function : uart_init
Description : uart init
Parameter : void
Return : void
Date : 2014.3.15
Authot : Puls
************************************************************/
void uart_init()
{
IO_ICR.word = 0x6501; // usart0 rx (101) "level 1"
IO_ICR.word = 0x6601; // usart0 tx (102) "level 1"
IO_UART0.SMR0.byte = 0x04; // UART reset
IO_UART0.SMR0.bit.MD = 0x0; // Asynchro MoDe Enable : MD = 0
IO_UART0.SCR0.byte = 0x14; // error flag clear, 8bit data , no parity, 1 stop bit
IO_UART0.ESCR0.byte = 0x00; // Synch_UART0 normal mode
IO_UART0.ECCR0.byte = 0x00; // Synch_UART0 normal mode
/************* baud rate set ***************************************/
// baund rate generator
IO_UART0.BGR0.word = 34; /* v = [Φ / b] - 1*/
/********************************************************************/
IO_UART0.SMR0.bit.SCKE = 0; // Synchro MoDe : Clock disable
IO_UART0.SMR0.bit.SOE = 1; // Serial Output Enable
IO_UART0.SCR0.bit.TXE = 0; // tx disable
// IO_EIER0.bit.LBSOIE=0; // tx interrupt disable
IO_UART0.SSR0.bit.TIE=0; // tx interrupt disable
IO_UART0.SCR0.bit.RXE = 0; // rx disable
IO_UART0.SSR0.bit.RIE = 0; // rx interrupt disable
}
/***********************************************************
Function : usart_rx_interrupt
Description : uart reception interrupt
Parameter : void
Return : void
Date : 2014.3.15
Authot : Puls
************************************************************/
__interrupt void usart_rx_interrupt(void)
{
UCHAR data_head;
if((IO_UART0.SSR0.bit.ORE == 1 ) || (IO_UART0.SSR0.bit.FRE == 1))
{
IO_UART0.SCR0.byte = 0x16; /* error flag clear */
tmp = IO_UART0.SSR0.byte; /* dummy read access */
uart_tx(er);
}
else
{
data_rx[rx_count] = IO_UART0.RDR0; /* Interrupt flag clear first */
tmp = IO_UART0.SSR0.byte; /* dummy read access */
rx_count++;
if(data_rx[0] == DATA_HEAD) /* head of data compare with DATA_HEAD */
{
if(data_rx[1]+3 == rx_count)
{
IO_UART0.SCR0.bit.RXE = 0; /* rx disable */
verification(); /* data of reception verify */
rx_count = 0;
}
}
else
{
tmp = IO_UART0.SSR0.byte; /* dummy read access */
}
}
}
/***********************************************************
Function : usart_tx_interrupt
Description : uart transmission interrupt
Parameter : void
Return : void
Date : 2014.3.24
Authot : Puls
************************************************************/
__interrupt void usart_tx_interrupt(void)
{
if(tx_count < strlen(data_tx))
{
IO_UART0.RDR0 = data_tx[tx_count]; /* Int flag clear */
tmp = IO_UART0.SSR0.byte; /* dummy read access */
tx_count++;
}
else
{
tx_flag = FALSE;
enable_tx(DISABLE);
enable_rx(ENABLE);
}
}
/***********************************************************
Function : usart_rx
Description : uart reception data
Parameter : str[] is reception data
Return : void
Date : 2014.3.24
Authot : Puls
************************************************************/
void uart_tx(UCHAR str[])
{
UCHAR i;
UCHAR n;
for(i=0; i<strlen(str); i++)
{
data_tx[i] = str[i];
}
data_tx[i] = ':'; /* strier end flag */
tx_count = 0;
/* UART 是异步通信 使用发送的时候接收必须停用 */
enable_rx(DISABLE);
enable_tx(ENABLE);
}
/***********************************************************
Function : verification
Description : uart reception data verify
Parameter : void
Return : void
Date : 2014.3.18
Authot : Puls
************************************************************/
void verification()
{
UCHAR len;
UCHAR i;
UCHAR verif = 0;
UCHAR total = 0;
len = data_rx[1]; // seconed byte is length of data
verif = data_rx[len+2]; // last byte is verify of data
for(i=0; i<len; i++)
{
total += data_rx[2+i]; /* N = 1 + n */
}
verif = ~verif;
if(total == verif)
{
data_analyze(); /* virify success then data are analyzed */
}
}
/***********************************************************
Function : data_analyze
Description : data analyze
Parameter : void
Return : void
Date : 2014.3.24
Authot : Puls
************************************************************/
void data_analyze()
{
UCHAR cmd1;
cmd1 = data_rx[2]; /* */
IO_UART0.SCR0.bit.RXE = 1; /* rx enable */
switch(cmd1)
{
/* */
case 1:
test1(); /*这里是你要实现的功能,自己可以写自己想要的功能,
功能,执行成功后会发送 ok */
uart_tx(ok);
break;
/**/
case 2:
test2(); /* 自定义功能 执行成功会发送 ok */
uart_tx(ok);
break;
default:
uart_tx(er);
}
}
/***********************************************************
Function : enable_rx
Description : uart interrupt enable and uart reception enable
Parameter : void
Return : void
Date : 2014.3.16
Authot : Puls
************************************************************/
void enable_rx(UCHAR en)
{
UART0_SCR0_RXE = en; // rx enable
UART0_SSR0_RIE = en; // tx interrupt enable
}
/***********************************************************
Function : enable_tx
Description : uart interrupt enable and uart transmission enable
Parameter : en is
Return : void
Date : 2014.3.16
Authot : Puls
************************************************************/
void enable_tx(UCHAR en)
{
UART0_SCR0_TXE = en; // tx enable
// IO_EIER0.bit.LBSOIE = en; // tx interrupt enable
UART0_SSR0_TIE = en; // tx interrupt enable
}
/***********************************************************
Function : uart_data_init
Description : uart init
Parameter : void
Return : void
Date : 2014.3.16
Authot : Puls
************************************************************/
void uart_data_init()
{
rx_count = 0;
tx_count = 0;
uart_init();
enable_tx(DISABLE);
enable_rx(ENABLE);
}
/***********************************************************
Function : strlen
Description : get lenth of the str
Parameter : str is strings
Return : len is lenth of str
Date : 2014.3.28
Authot : Puls
************************************************************/
UCHAR strlen(UCHAR *str)
{
UCHAR len = 0;
while(*str++ != ':')
len++;
return len;
}
/*****************************************************************************/
/* Main application to control the program flow */
/*****************************************************************************/
void main(void)
{
uart_data_init();
// Allow all interrupt levels
//__set_il(7);
// Enable interrupts
__EI();
while(1); // waitier interrput
}
uart.h
#ifndef _UART_H
#define _UART_H
#define LOW 0
#define HIGH 1
#define ENABLE 1
#define DISABLE 0
#define RX_LEN 30 /* */
#define TX_LEN 100 /* */
#define DATA_HEAD 0xAA /* head of data */
#define TRUE 1
#define FALSE 0
typedef unsigned char UCHAR;
typedef unsigned int UINT;
void uart_init();
void uart_data_init();
void enable_tx(UCHAR en);
void enable_rx(UCHAR en);
void uart_tx(UCHAR str[]);
void data_analyze();
void verification();
extern __interrupt void usart_rx_interrupt(void);
extern __interrupt void usart_tx_interrupt(void);
#endif