Serie: MIPS430
c
190 líneas
· Actualizado 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
}