📄 msp430f1611_9600_only.c
字号:
#define BP2400 0
#define BP4800 1
#define BP9600 2
#define BP19200 3
#define COM6_RXD BIT1 // RXD on P1.1 for com6
#define COM6_TXD BIT5 // TXD on P1.5 for com6
#define COM7_RXD BIT2 // RXD on P1.2 for com7
#define COM7_TXD BIT6 // TXD on P1.6 for com7
#define COM8_RXD BIT3 // RXD on P1.3 for com8
#define COM8_TXD BIT7 // TXD on P1.7 for com8
#define BaudRate BP9600 // 0-2400 1-4800 2-9600 3-19200
#define CheckMode 2 // 0-None 1-Odd 2-Even 10 bit
#if BaudRate==BP2400 // Conditions for 2400 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5 0x4E2 // ~ 0.5 bit length + small adjustment
#define Bitime 0x9C4 // ~ 2400 baud
#elif BaudRate== BP4800 // Conditions for 4800 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5 0x271 // ~ 0.5 bit length + small adjustment
#define Bitime 0x4E2 // ~ 4800 baud
#elif BaudRate== BP9600 // Conditions for 9600 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5 0x1A0 // ~ 0.5 bit length + small adjustment
#define Bitime 0x271 // ~ 9620 baud
#elif BaudRate== BP19200 // Conditions for 19200 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5 0x47 // ~ 0.5 bit length + small adjustment
#define Bitime 0x6C // ~ 19200 baud
#endif
//***********************************************************
#if CheckMode==0
const unsigned char BitTime[]={14, 13,14, 13,14,14,13, 14,14,13,14}
#else
const unsigned char BitTime[]={14, 14,13,14, 13,14,14,13, 14,14,13,14}
#endif
;
#define MaxBuffer 40 //各通道缓冲区的最大长度
#define TotalMaxBuffer 400 //接收和发送缓冲区的最大长度
#define plus_bufsize TotalMaxBuffer - MaxBuffer
#define max_save_number TotalMaxBuffer/MaxBuffer
struct Channel
{
unsigned RxErr:1; //接收错误标志
unsigned Rx_status:1; //一帧数据正在接收状态标志
unsigned Tx_status:1; //一帧数据正在发送状态标志
unsigned Rx_finish:1; //一帧数据接收完成
unsigned Tx_finish:1; //一帧数据发送完成
unsigned char BufferPtr; //数据指针
unsigned char CheckSum; //校验和
unsigned char Len; //收发数据的长度
unsigned char BitCnt; //位计数器
unsigned char Checkbit; //采用定时器收发数据的校验码
unsigned char RxBuf[MaxBuffer]; //接收缓冲区
unsigned char TxBuf[MaxBuffer]; //发送缓冲区
unsigned int RxTemp; //收数据字节寄存器
unsigned int TxTemp; //发数据字节寄存器
unsigned int IdleTime; //Idle时间
};
struct Channel com34,com5,com6,com7,com8;
unsigned char TotalRXBuf[TotalMaxBuffer];
unsigned char TX_TotalBuf[TotalMaxBuffer];
unsigned char * RXStart_Ptrt;
unsigned char * RXEnd_Ptr;
unsigned char * TX_PtrStart;
unsigned char * TX_PtrEnd;
unsigned char * TX_cmp;
unsigned char * RX_cmp;
unsigned char r_len;
unsigned char main_len;
unsigned char main_i;
unsigned char count;
unsigned char rx_number;
unsigned char tx_number;
unsigned int Rxmark; //com6,com7,com8对应接收标志
#define begin_TotalRX_add &TotalRXBuf[0]
#define last_TotalRX_add &TotalRXBuf[TotalMaxBuffer-1]
#define begin_TotalTX_add &TX_TotalBuf[0]
#define last_TotalTX_add &TX_TotalBuf[TotalMaxBuffer-1]
//**************************************************************
unsigned int RXTXData;
unsigned char BitCnt;
void com6_TX_Byte (void);
void com6_RX_Ready (void);
void com7_TX_Byte (void);
void com7_RX_Ready (void);
void com8_TX_Byte (void);
void com8_RX_Ready (void);
//******************************************************************************
#include <msp430x16x.h>
unsigned char Start = 0;
unsigned char i;
void main (void)
{
unsigned char ii,jj;
unsigned int kk;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1 |= XTS; // Configure load caps
CCTL0 = OUT; // TXD Idle as Mark
CCTL1 = OUT;
CCTL2 = OUT;
TACTL = TASSEL_1 + MC_2; // ACLK, continuous mode
P1SEL |= COM6_RXD+COM7_RXD+COM8_RXD; // P1.1/2/3 TA0/1/2 for RXD function
P1SEL |= COM6_TXD+COM7_TXD+COM8_TXD;
P1DIR |= COM6_TXD+COM7_TXD+COM8_TXD; // P1.5/6/7 TA0/1/2 for TXD output on P1
Rxmark = 0x0; // 接收标志清零;
com6.Tx_finish = 1; // set frame TX finish, enable ini RX
com7.Tx_finish = 1;
com8.Tx_finish = 1;
//------------------------ test oscfault falg ----------------------------
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_3; // MCLK= LFXT1 (safe)
//-------------------------------------------------------------------------
_EINT();
for (;;)
{
if (com6.Tx_finish == 1) // test if enable RX ini
{
com6_RX_Ready(); // COM6/com7/com8 ready to RX one Byte
}
if (com7.Tx_finish == 1)
{
com7_RX_Ready();
}
if (com8.Tx_finish == 1)
{
com8_RX_Ready();
}
_BIS_SR(CPUOFF + GIE); // Enter LPM0 Until character RXed
_NOP();
switch( Rxmark ) //com6,com7,com8对应接收标志
{
case 2: // ccr0 case deal
{
if (com6.Rx_status == 1)
{
com6.Rx_status = 0;
if ( com6.BitCnt == 0) //>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
if(com6.Checkbit == 0) //校验位和停止位检测
{
com6.RxBuf[com6.BufferPtr++]=com6.RxTemp;
}
TACCTL0 |= CAP; // ini RX next bit
if (com6.BufferPtr >= 0x12)
//if (com6.BufferPtr >= (com6.RxBuf[12]+ 15))
{
CCTL0 &= ~CCIE; // All bits RXed, disable interrupt
com6.BufferPtr=0; //com6 RX
CCTL0 &=~0x3000;
com6_TX_Byte();
}
}
}
else if (com6.Tx_status == 1)
{
com6.Tx_status = 0 ;
if ( com6.BitCnt == 0)
{
if (com6.BufferPtr <= 0x11)
//if (com6.BufferPtr <= (com6.RxBuf[12]+ 17)) //check send byte number
{
com6.TxTemp = com6.TxBuf[com6.BufferPtr++];
com6.BitCnt = 0x0b;
ii=com6.TxTemp; //add even bit start
kk=0;
for(jj=0;jj<8;jj++)
{
if(ii&0x80) kk^=0x100;
ii<<=1;
}
com6.TxTemp |=kk; //add even bit end
com6.TxTemp |=0x200; //add stop bit
com6.TxTemp = com6.TxTemp << 1; // Add space start bit
CCR0 = TAR; // Current state of TA counter
CCR0 += Bitime; // Some time till first bit
}
else
{
com6.BufferPtr=0;
CCTL0 &= ~ CCIE; // All bits TXed, disable interrupt
com6.Tx_finish = 1;
_NOP();
}
}
else
{
if (com6.TxTemp & 0x01) CCTL0 &= ~ OUTMOD2; // TX Mark
else CCTL0 |= OUTMOD2; // TX Space
com6.TxTemp = com6.TxTemp >> 1;
com6.BitCnt --;
}
}
} break;
case 4: //--------------------- ccr2 rx/tx -----------------
{
if (com7.Rx_status == 1)
{
com7.Rx_status = 0;
if ( com7.BitCnt == 0)
{
if(com7.Checkbit == 0) //校验位和停止位检测
{
com7.RxBuf[com7.BufferPtr++]=com7.RxTemp;
}
TACCTL1 |= CAP; // ini RX next bit
if (com7.BufferPtr >= 0x12)
//if (com6.BufferPtr >= (com6.RxBuf[12]+ 15))
{
CCTL1 &= ~CCIE; // All bits RXed, disable interrupt
com7.BufferPtr=0; //com6 RX
CCTL1 &=~0x3000;
com7_TX_Byte();
}
}
}
else if (com7.Tx_status == 1)
{
com7.Tx_status = 0 ;
if ( com7.BitCnt == 0)
{
if (com7.BufferPtr <= 0x11)
//if (com6.BufferPtr <= (com6.RxBuf[12]+ 17)) //check send byte number
{
com7.TxTemp = com7.TxBuf[com7.BufferPtr++];
com7.BitCnt = 0x0b;
ii=com7.TxTemp; //add even bit start
kk=0;
for(jj=0;jj<8;jj++)
{
if(ii&0x80) kk^=0x100;
ii<<=1;
}
com7.TxTemp |=kk; //add even bit end
com7.TxTemp |=0x200; //add stop bit
com7.TxTemp = com7.TxTemp << 1; // Add space start bit
CCR1 = TAR; // Current state of TA counter
CCR1 += Bitime; // Some time till first bit
}
else
{
com7.BufferPtr=0;
CCTL1 &= ~ CCIE; // All bits TXed, disable interrupt
com7.Tx_finish = 1;
_NOP();
}
}
else
{
if (com7.TxTemp & 0x01) CCTL1 &= ~ OUTMOD2; // TX Mark
else CCTL1 |= OUTMOD2; // TX Space
com7.TxTemp = com7.TxTemp >> 1;
com7.BitCnt --;
}
}
} break;
case 6: //--------------------- ccr2 rx/tx -----------------
{
if (com8.Rx_status == 1)
{
com8.Rx_status = 0;
if ( com8.BitCnt == 0)
{
if(com8.Checkbit == 0) //校验位和停止位检测
{
com8.RxBuf[com8.BufferPtr++]=com8.RxTemp;
}
TACCTL2 |= CAP; // ini RX next bit
if (com8.BufferPtr >= 0x12)
//if (com6.BufferPtr >= (com6.RxBuf[12]+ 15))
{
CCTL2 &= ~CCIE; // All bits RXed, disable interrupt
com8.BufferPtr=0; //com6 RX
CCTL2 &=~0x3000;
com8_TX_Byte();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -