⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 单相复费率MSP430硬件时钟参考代码,MSP413设计方案
💻 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 + -