S SmartDocs
Série: MIPS430 c 190 linhas · Atualizado 2022-08-13

UART.c

MIPS430/DRINK/prj2/UART.c

#include <msp430f2272.h>
#include <String.h>
#include "ADC.h"
#include "Flash.h"
#include "I2C.h"
#include "Test.h"
#include "UART.h"

unsigned char UART_Rx[38];
unsigned char UART_Rx_Head=0;
unsigned char UART_Rx_Tail=0;
unsigned char UART_Tx[80];
unsigned char UART_Tx_Head=0;
unsigned char UART_Tx_Tail=0;
unsigned char UART_Cmd_LTH=0;
unsigned char UART_Cmd_Remain=0;
unsigned char UART_Cmd_Buff[20];
unsigned short UART_Cmd_Timeout=0;

void UART_Init(void)
{
	P3SEL |= 0x30;
	UCA0CTL1 |= UCSWRST;
	UCA0CTL1 |= UCSSEL_1;        //Clock = ACLK = 8MHz 
	UCA0BR0 = 0xD5;             //8.192M / 38400 = 213 = 0xD5
	UCA0BR1 = 0x00;
	UCA0CTL1 &= ~UCSWRST;
	IE2 |= UCA0RXIE;
}

unsigned char UART_CheckSum(unsigned char *data,unsigned char lth)
{
	unsigned char i,chs=0;
	for(i=0;i<lth;i++)
		chs+=data[i];
	return chs;
}

void UART_Tx_Fun(unsigned char *data,unsigned char lth)
{
	unsigned char i,chs,tx[50];
	tx[0]=0x02;
	tx[1]=lth+3;
	lth+=2;
	memcpy(&tx[2],data,lth);
	chs=UART_CheckSum(tx,lth);
	tx[lth++]=chs;
	for(i=0;i<lth;i++)
	{
		UART_Tx[UART_Tx_Head++]=tx[i];
		if(UART_Tx_Head>=sizeof(UART_Tx))
			UART_Tx_Head=0;
	}
}

void UART_Poling(void)
{
	unsigned short cmd;
	unsigned char data,chs,tx[40];
	while(UART_Rx_Head!=UART_Rx_Tail)
	{
		UART_Cmd_Timeout=0;
		data=UART_Rx[UART_Rx_Tail++];
		if(UART_Rx_Tail>=sizeof(UART_Rx))
			UART_Rx_Tail=0;
		if(UART_Cmd_LTH==0)
		{
			if(data==0x02)
			{
				UART_Cmd_Buff[0]=0x02;
				UART_Cmd_LTH=1;
			}
		}
		else if(UART_Cmd_LTH==1)
		{
			if(data<4 || data>10)
				UART_Cmd_LTH=0;
			else
			{
				UART_Cmd_LTH=2;
				UART_Cmd_Buff[1]=data;
				UART_Cmd_Remain=data-2;
			}
		}
		else if(UART_Cmd_LTH<sizeof(UART_Cmd_Buff))
		{
			UART_Cmd_Buff[UART_Cmd_LTH++]=data;
			if(UART_Cmd_Remain)
			{
				UART_Cmd_Remain--;
				if(!UART_Cmd_Remain)
				{
					chs=UART_CheckSum(UART_Cmd_Buff,UART_Cmd_LTH-1);
					if(chs==UART_Cmd_Buff[UART_Cmd_LTH-1])
					{
#if !TEST_LED
						P1OUT^=0x04;
#endif
						cmd=UART_Cmd_Buff[2];
						if(cmd==0x32)
							Item_Output_Reg(UART_Cmd_Buff[3]);
						else if(cmd==0x33)
							Item_Manage.Coin_Shutdown=0;
						else if(cmd==0x52)
						{
							unsigned short u16;
							memcpy(&u16,&UART_Cmd_Buff[3],2);
							Flash_Set_Current(u16);
						}
						
						if(cmd==0x30)
						{
							tx[0]=0x31;
							memset(&tx[1],0,30);
							if(Item_Manage.Out_Item)
								tx[1]|=0x01;
							else
								tx[1]&=0xFE;
							if(Item_Manage.Coin_Shutdown<COIN_POWER_ON)
								tx[1]&=0xFD;
							else
								tx[1]|=0x02;
							if(Item_Manage.Check_Pos)
								tx[1]|=0x04;
							else
								tx[1]&=0xFB;
							if(Item_Manage.Out_Item || Item_Manage.Check_Pos)
								tx[1]&=0xF7;
							else
								tx[1]|=0x08;
							memcpy(&tx[3],&Temperature,4);
							memcpy(&tx[7],Item_Manage.Status,24);
							UART_Tx_Fun(tx,31);
						}
						else if(cmd==0x50)
						{
							tx[0]=0x51;
							memcpy(&tx[1],&Current_Set.Threshold,2);
							memcpy(&tx[3],&INA226_Current_Max,2);
							memcpy(&tx[5],&INA226_Power,2);
							memcpy(&tx[7],&INA226_Current,2);
							UART_Tx_Fun(tx,9);
						}
					}
					UART_Cmd_LTH=100;
				}
			}
		}
		if(UART_Cmd_LTH>=sizeof(UART_Cmd_Buff))
		{
			UART_Cmd_LTH=0;
		}
	}
	while(UART_Tx_Head!=UART_Tx_Tail)
	{
		if(UCA0STAT&UCBUSY)
			break;
		UCA0TXBUF=UART_Tx[UART_Tx_Tail++];
		if(UART_Tx_Tail>=sizeof(UART_Tx))
			UART_Tx_Tail=0;
	}
	if(UART_Cmd_LTH)
	{
		UART_Cmd_Timeout++;
		if(UART_Cmd_Timeout>=200)
		{
			UART_Cmd_LTH=0;
		}
	}
	if(UCA0STAT&0x20)
	{
		UART_Init();
		data=UCA0RXBUF;
		UCA0STAT=0;
	}
}

#pragma vector = USCIAB0RX_VECTOR
__interrupt void Uart_Rx_ISR(void)
{
	unsigned char data = UCA0RXBUF;
	UART_Rx[UART_Rx_Head++]=data;
	if(UART_Rx_Head>=sizeof(UART_Rx))
		UART_Rx_Head=0;
#if !TEST_LED
	P1OUT^=0x08;
#endif
}