关于用定时器TA模拟串口通信的问题

楼主
关于用定时器TA模拟串口通信的问题
大家好,之前看过坛子里的一片关于定时器TA模拟串口通信的文章,这两天我自己也想实验一下,可是接收到的数据都是乱码。看看定义的内容和实现的方法和之前看过的那篇文章是一样的,百思不得其解,想在这里请教一下大家。我先把我的代码贴上来。外部信号源是通过232转TTL芯片接入到430里的。

1 #include "msp430x54x.h"
2 #define TBIT1 104 ///采用1M的时钟,转成9600的波特率,1位时间
3 #define TBIT0_5 52 //半位的时间
4 unsigned char R_DATA;
5 unsigned int T_DATA;
6 int TR_COUNT;
7 unsigned char R_Last;
8 unsigned char aRecvData[1024];//接收数组
9 void main()
 {
10  WDTCTL = WDTPW + WDTHOLD;
11  P1DIR&=~0x02;//TA0.0 设置捕捉模式中的输入源对应的IO口为输入状态
12  P1SEL|=0x02;
13  R_DATA=0;
14  TR_COUNT=8;
15  for(int a=0;a<1024;a++) aRecvData[a]=0;
16  TA0CCTL0 = CCIE+CM_2+SCS+CCIS_0+CAP;// ;  下降沿触发,同步捕获          
17  TA0CCR0 = TBIT1;                         
18  TA0CTL = TASSEL_2 + MC_1;         // SMCLK,增计数模式  
19  _EINT();
20  while(1){}
    }
21  #pragma vector=TIMER0_A0_VECTOR
22  __interrupt void TIMER0_A0_ISR(void)
  {    
23  TA0CCR0=TA0CCR0+TBIT1;
24  if(TA0CCTL0&CAP)
    {
25  TA0CCTL0&=~CAP;
26  TA0CCR0=TA0CCR0+TBIT0_5;
27  }else{
28  R_DATA=R_DATA>>1;
29  if(TA0CCTL0&SCCI)
    ;
30  else R_DATA|=0x80;
31  TR_COUNT--;
32  if(TR_COUNT==0)
   {
33  R_Last=R_DATA;
34  TR_COUNT=8;
35  TA0CCTL0 = CCIE+CM_2+CCIS_0+SCS+CAP;//
36  aRecvData[iRecvIndex++]=R_Last;
    }     
   }  

}
1楼
依然没人理我
2楼
重新修改一下我的问题


大家好,之前看过坛子里的一篇关于定时器TA模拟串口通信的文章,这两天我自己也想实验一下,可是在TA的时钟源选择ACLK的时候,波特率设为300,1200,2400,4800接收到的数据都是正确的。TA的时钟源选择SMCLK的时候,在上面几种设置的波特率下接收到的数据就都是乱码。我的问题是:

[color=#FF0000]定义的内容和实现的方法是一样的,为什么选择时钟源不同时就会产生问题。是选择时钟源时需要另外的设置吗?[/color]

百思不得其解,想在这里请教一下大家。我先把我的代码贴上来。外部信号源是通过232转TTL芯片接入到430里的。

1 #include "msp430x54x.h"
2 #define TBIT1 104 ///采用1M的时钟,转成9600的波特率,1位时间
3 #define TBIT0_5 52 //半位的时间
4 unsigned char R_DATA;
5 unsigned int T_DATA;
6 int TR_COUNT;
7 unsigned char R_Last;
8 unsigned char aRecvData[1024];//接收数组
9 void main()
{
10 WDTCTL = WDTPW + WDTHOLD;
11 P1DIR&=~0x02;//TA0.0 设置捕捉模式中的输入源对应的IO口为输入状态
12 P1SEL|=0x02;
13 R_DATA=0;
14 TR_COUNT=8;
15 for(int a=0;a<1024;a++) aRecvData[a]=0;
16 TA0CCTL0 = CCIE+CM_2+SCS+CCIS_0+CAP;// ; 下降沿触发,同步捕获
17 TA0CCR0 = TBIT1;
[color=#FF0000]18 TA0CTL = TASSEL_2 + MC_1; // SMCLK,增计数模式 ,(这个地方TASSEL_2 换成TASSEL_1即ACLK时接收数据没问题 )[/color]
19 _EINT();
20 while(1){}
}
21 #pragma vector=TIMER0_A0_VECTOR
22 __interrupt void TIMER0_A0_ISR(void)
{
23 TA0CCR0=TA0CCR0+TBIT1;
24 if(TA0CCTL0&CAP)
{
25 TA0CCTL0&=~CAP;
26 TA0CCR0=TA0CCR0+TBIT0_5;
27 }else{
28 R_DATA=R_DATA>>1;
29 if(TA0CCTL0&SCCI)
R_DATA|=0x80;
30 else ;
31 TR_COUNT--;
32 if(TR_COUNT==0)
{
33 R_Last=R_DATA;
34 TR_COUNT=8;
35 TA0CCTL0 = CCIE+CM_2+CCIS_0+SCS+CAP;//
36 aRecvData[iRecvIndex++]=R_Last;
}
}

}

电脑版 Page created in 0.0469 seconds width 2 queries.