接收引脚RXD1 P7.6/TA0.2
发送TXD1 P5.0/TA1.1
程序如下所示,出现的问题是接收端收到的总是0xFF,示波器检测接收引脚可以测到电平(测到的电平为用串口调试助手发送的数据),硬件检查没有问题,现在实在检查不出是哪出问题了…
//波特率的设置
#define BitTime24_05 0x4E8 //半位
#define BitTime24_10 0x9D0 //1位 时钟/波特率=6029312Hz/2400bps
#define BitTime24_15 0xEB8 //1.5位
#define BitTime24_20 0x13A0 //2位
void MSP430F4152_CLK_Init(void)
{
////时钟配置
DelayMs(20);
FLL_CTL0|=XCAP11PF; //dco用做MCLK或SMCLK前需要预分频,LFXT1为低频模式
SCFI0|=FN_2; //fDCOCLK = 1.4-12MHz
SCFQCTL=91; //(91+1)*32768*2=6.029 312M
SCFI0|=FLLD_2;
FLL_CTL0|=DCOPLUS;
DelayMs(10);
}
void Uart1_Init(void) //把USART1配置为串口模式 开发送和接收中断
{//配置模拟串口
WDT_Stop();
TACTL = TASSEL_2 + MC_2; // 连续计数模式 CLK=SMCLK=6029 312 + TAIE
RXD1_SEL|=RXD1; //选择为外部模块功能
RXD1_DIR&=~RXD1; //设置接收引脚为输入模式
TXD1_SEL|=TXD1;
TXD1_DIR|=TXD1;
Flag_COM1_RX=1; //当前处于接收模式
}
void RX1_Ready(void)
{
RX1ByteData=0; //擦除上次的接收缓存
RX1ByteCount=0x08;
CCTL2=CAP+SCS+CM_2+CCIE+ CCIS_0; //捕获 同步捕获 下降沿捕获 开捕获/比较中断 从CCI2A捕获输入 + CCIS_0
}
while(1)
{
LPM3;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1(void)
{
switch(TA0IV)
{
case TA0IV_TACCR1: break;
case TA0IV_TACCR2:
if((TACCTL2 & CCIS0)||(TACCTL2 & CCIS1)==0) //判断是否处于接收模式
{
if(TACCTL2&CAP) //判断是捕获还是比较模式
{
TACCTL2&=~CAP; //捕获模式,将捕获功能改为比较功能
TACCR2+=BitTime24_15; //开始捕获位再加1.5位时间 0xEB8
}
else
{
switch(RX1ByteCount)
{
case 0x08: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x01; RX1ByteCount--; break; //先收低位 0x9D0
case 0x07: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x02; RX1ByteCount--; break;
case 0x06: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x04; RX1ByteCount--; break;
case 0x05: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x08; RX1ByteCount--; break;
case 0x04: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x10; RX1ByteCount--; break;
case 0x03: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x20; RX1ByteCount--; break;
case 0x02: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x40; RX1ByteCount--; break;
case 0x01: TACCR2+=BitTime24_10; if(TACCTL2&SCCI) RX1ByteData|=0x80; RX1ByteCount--; break;
case 0x00:
TACCTL2&=~CCIE; //接收完,关捕获/比较中断 关COM0中断
break;
}
}
}
//TX0
else
{
switch(TX1ByteCount)
{
case 0x0a: TACCR2+=BitTime24_10; TXD1_OUT&=~TXD1; TX1ByteCount--; break; //起始位 0
case 0x09: TACCR2+=BitTime24_10; if(TX1ByteData&0x01){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x08: TACCR2+=BitTime24_10; if(TX1ByteData&0x02){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x07: TACCR2+=BitTime24_10; if(TX1ByteData&0x04){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x06: TACCR2+=BitTime24_10; if(TX1ByteData&0x08){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x05: TACCR2+=BitTime24_10; if(TX1ByteData&0x10){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x04: TACCR2+=BitTime24_10; if(TX1ByteData&0x20){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x03: TACCR2+=BitTime24_10; if(TX1ByteData&0x40){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x02: TACCR2+=BitTime24_10; if(TX1ByteData&0x80){TXD1_OUT|=TXD1;} else{TXD1_OUT&=~TXD1;} TX1ByteCount--; break;
case 0x01: TACCR2+=BitTime24_10; TXD1_OUT|=TXD1; TX1ByteCount--; break; //停止位
case 0x00:
break;
}
}
break;
case TA0IV_TAIFG: break;
}
}
此帖出自
小平头技术问答
http://bbs.eeworld.com.cn/thread-491370-1-1.html
一周热门 更多>