[求助] msp430f4152定时器A的比较/捕获中断,模拟UART串口

18633013902   2016-5-26 12:00 楼主
接收引脚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;
  }
}

回复评论 (1)

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复