程序从F249上移植过来的,发送正常,但是接收不正常。RX脚有波形,但是进不了TimerA中断
#include "SimuUartRS485.h"
#define Bitime 27
#define Bitime_5 12 /*1200bps*/
#define TXD BIT0
#define RXD BIT1
#define RS485RD(level) P10OUT = ((unsigned int)level) ? (P10OUT|BIT0) : (P10OUT&~BIT0)
/***********************************
//
// ClrA8RxBuf
//
***********************************/
void ClrA8RxBuf(void)
{
memset(RxA8Buf ,0,RXA8LEN);
RxA8BufCount = 0;
}
/***********************************
//
// ClrA8TxBuf
//
***********************************/
void ClrA8TxBuf(void)
{
memset(TxA8Buf ,0,RXA8LEN);
}
/***********************************
//
// TXD_Byte
//
***********************************/
void TXD_Byte(void)
{
unsigned int j;
_EINT();
Uart8BitCnt = 0x0A;
TA0CCR0 = TA0R;
TA0CCR0 += Bitime;
RXTXData |= 0x0100;
RXTXData = RXTXData << 1;
TA0CCTL0 = OUTMOD0+CCIE;
j=0;
while ( TA0CCTL0 & CCIE )
{
if(j++>20000) break;
}
}
/***********************************
//
// InitRXD
//
***********************************/
void InitRXD(void)
{
Uart8BitCnt = 0x08;
TA0CCTL0 = SCS+CCIS_1+OUTMOD_1+CM_2+CAP+CCIE;
}
/**********************************
//功能: 485串口初始化
//输入:无
//返回: 无
**********************************/
void UartA8Init_485(void)
{
P10DIR |= BIT0;
RS485RD(0);
P1SEL |= RXD;
P1DIR &= ~RXD;
P8SEL |= TXD;
P8DIR |= TXD;
TA0CTL = TASSEL_1 + MC_2 + TACLR;
InitRXD();
}
/**********************************
//功能: 485串口发送数据
//输入:Len 数据长度 *pBuf 数据内容
//返回: 无
**********************************/
void UartA8Send_485(unsigned int Len, unsigned char *pBuf)
{
unsigned int i;
RS485RD(1);
Delay_ms(3);
for(i=0;i<Len;i++)
{
RXTXData = *pBuf++;
TXD_Byte();
}
Delay_ms(3);
InitRXD();
RS485RD(0);
}
/**************************************
***功能:串口中断程序 ***
***入口:无 ***
***出口:无 ***
**************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TA0_ISR (void)
{
TA0CCR0 += Bitime;
// RX
if (TA0CCTL0 & CCIS0)
{
if( TA0CCTL0 & CAP )
{
TA0CCTL0 &= ~ CAP;
TA0CCR0 += Bitime_5;
}
else
{
RXTXData = RXTXData >> 1;
if(TA0CCTL0 & SCCI)
RXTXData |= 0x80;
Uart8BitCnt--;
if(Uart8BitCnt == 0)
{
InitRXD();
if(RxA8BufCount==0)
{
RxA8Buf[RxA8BufCount++]=RXTXData;
UartA8Start=1;
}
else
RxA8Buf[RxA8BufCount++]=RXTXData;
if(RxA8BufCount>RXA8LEN-2)
RxA8BufCount=0;
UartA8Time=0;
}
}
}
// TX
else
{
if(Uart8BitCnt == 0)
TA0CCTL0 &= ~CCIE;
else
{
TA0CCTL0 |= OUTMOD2;
if(RXTXData & 0x01)
TA0CCTL0 &= ~OUTMOD2;
RXTXData = RXTXData >> 1;
Uart8BitCnt--;
}
}
}