📄 comm.c
字号:
#include "msp430x41x.h"
#include "string.h"
#include "general.h"
#include "protocol.h"
unsigned char CommPortChose;
unsigned char CommParity;
unsigned char UartRxByte;
unsigned char UartBitCount;
//unsigned char UartWaitBitTime;
unsigned char UartState;
//unsigned short UartTxBondRate;
void UartSend0(void);
void UartSend1(void);
void UartRxReady(void)
{
UartBitCount=9;
UartRxByte=0;
CommParity=UART_BIT_9_L;
/*RS485 RX Ready*/
//if(!(CommPortChose&(IR_PORT+IR_PORT_WITH_BATTERY)))
if(!(CommPortChose&IR_PORT))
{
RS485_RX_IFG&=~(RS485_RX);
RS485_RX_IE|=RS485_RX;
}
/*IR RX Ready*/
if(!(CommPortChose&RS485_PORT))
{
//IR_RX_OUT|=IR_RX;
/*IR RX with battery*/
//if(CommPortChose&IR_PORT_WITH_BATTERY)
//{
// IR_RX_OUT&=~(IR_RX);
// Delay(60);
//}
//IR_EN_OUT|=IR_EN;
IR_RX_IFG&=~(IR_RX);
IR_RX_IE|=IR_RX;
}
}
void UartReInit(void)
{
//UartWaitBitTime=UART_BIT_TIME_1200;
CommPortChose&=~(RS485_PORT+IR_PORT);
//CommPortChose=0;
UartState=UART_WAIT_START_BYTE1;
UartRxReady();
}
#pragma vector=PORT1_VECTOR
__interrupt void Port1(void)
{
if(RS485_RX_IFG&RS485_RX) CommPortChose|=RS485_PORT;
else if(IR_RX_IFG&IR_RX) CommPortChose|=IR_PORT;
//CCR0=TAR+UartWaitBitTime+(unsigned char)(UartWaitBitTime/2);
CCR0=TAR+UART_BIT_TIME_1200+(unsigned char)(UART_BIT_TIME_1200/2);
TACTL=TASSEL_1+MC_2;
TACCTL0=CCIE;
UartRxByteTime=0;
P1IFG=0;
//P1IE&=~(RS485_RX+IR_RX);
P1IE=0;
SystemIndication|=EVENT_SERIAL_PORT;
_BIC_SR_IRQ(LPM3_bits);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA (void)
{
unsigned char timerAtemp1;
//CCR0+=UartWaitBitTime;//27等于一个bit的时间长度,红外和RS485都用CCRO
CCR0+=UART_BIT_TIME_1200;
//read bit value here
if(CommPortChose&RS485_PORT) timerAtemp1=RS485_RX_IN&RS485_RX;
else timerAtemp1=IR_RX_IN&IR_RX;
if(UartBitCount>1)
{
UartRxByte>>=1;
if(timerAtemp1)
{
UartRxByte|=0x80;
CommParity=~CommParity;
}
}
else
{
if(timerAtemp1)
{
if(!(UART_BIT_9_H==CommParity)) UartState=UART_RXD_PARITY_ERR;
}
else
{
if(!(UART_BIT_9_L==CommParity)) UartState=UART_RXD_PARITY_ERR;
}
TACCTL0=0;
TACTL=MC_0;
}
UartBitCount--;
}
/*串口发送0*/
void UartSend0(void)
{
if(CommPortChose&RS485_PORT)
{
RS485_TX_OUT&=~(RS485_TX);
}
else
{
TACTL |=MC0;
P2SEL |= IR_TX;
}
}
/*串口发送1*/
void UartSend1(void)
{
if(CommPortChose&RS485_PORT)
{
RS485_TX_OUT|=RS485_TX;
}
else
{
TACTL &=(~MC0);
P2OUT |= IR_TX;
P2SEL &= ~IR_TX;
}
CommParity=~CommParity;
}
/*Send one byte(11bits)*/
void UartSendByte(unsigned short sData)
{
unsigned char sBitCount=11;
CommParity=UART_BIT_9_L;
sData<<=1;
sData|=0x0400;
RS485_EN_OUT&=~(RS485_EN);
if(CommPortChose&IR_PORT)
{
CCR0=(unsigned int)(IR_CAR_GEN/2);
IR_TX_CCR=(unsigned int)(CCR0/2);
TACTL=TASSEL_2+TACLR;
IR_TX_TACCTL=OUTMOD_4;
}
_DINT();
do{
if(sBitCount!=2)
{
if(sData&0x0001)
UartSend1();
else
UartSend0();
}else{
if(CommParity==UART_BIT_9_H)
UartSend1();
else
UartSend0();
}
sData>>=1;
//Delay(UartTxBondRate);
Delay(UART_BOND_RATE_1200);
}while(--sBitCount);
_EINT();
RS485_EN_OUT|=RS485_EN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -