UART通信程序-中断方式


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








  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值