关于MSP430F5438使用多个串口冲突的问题

2019-03-24 09:44发布

小弟初来乍到,今天碰到了这个问题,希望帮忙找找原因,万分感谢。
背景:和上位机通信,需要使用一个串口,我用的是UCA3(P10.4,5),还需要一个串口和另外的单片机通信,我使用的是UCA1(P5.6,7),通过芯片SP3232EEP进行RS232电平转换,每个串口用一个SP3232;现在的问题是,当单独使用一个串口时,无法收发数据,即将UCA1的SP3232芯片拆掉后,UCA3可以正常收发数据,或者将UCA3的SP3232拆掉后,UCA1可以正常收发数据,但是只要是两个SP3232都连上,就都无法收发数据,一个是收不到数据,另一个串口通过串口调试助手发现一直在发0;硬件电路如附件。程序如下(该程序只使用一个串口,两个SP3232都连上就无法收发数据,只连一个SP3232就可以正常收发)
#include<msp430f5438.h>
int s=0,i=0;
int BridgeVolts12[360];
int D;  //DAC幅值数字量
//函数Init_Clk(void)
//功能:初始化主时钟,MCLK=XT2,SMCLK=XT2
void Init_CLK (void)
{
   WDTCTL = WDTPW + WDTHOLD;  // 关看门狗
   P5SEL |= BIT2+BIT3;  //端口功能选择晶振
   UCSCTL6 &= ~XT2OFF;  //使能晶体振荡器
   UCSCTL6 |= XT2DRIVE_3;  //XT2驱动模式最高
   UCSCTL3 |= SELREF_2;  //FLL时钟参考源为REFOCLK
   UCSCTL4 |= SELA_2;  //选择时钟源,ACLK=REFO,SMCLK=MCLK=DCO
   do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除XT2,XT1,DCO错误标志                                                         
    SFRIFG1 &= ~OFIFG;
  }while(SFRIFG1&OFIFG);  // 检测振荡器错误标志
  UCSCTL4 |=SELS_5+SELM_5;  //SMCLK=MCLK=XT2=16MHz;
}
//函数Init_UART(void)
//功能:USCI_A3 UART模式初始化设置,以SMCLK=16MHz为参考时钟
void Init_UART(void)
{
  UCA3CTL1 |=UCSWRST;
  P10SEL |= BIT4+BIT5;  //使能USCI_A3通信模块的收发引脚
  //UCA3CTL1 |=UCSWRST;  //置位寄存器设置
  UCA3CTL1 |=UCSSEL_2;  //波特率发生器参考时钟为SMCLK,SMCLK=16MHz
  UCA3BR0=104;  //波特率设置为9600bps
  UCA3BR1=0;
  UCA3MCTL=UCBRS_0+UCBRF_3+UCOS16;  //调制器设置,选择过采样模式
  UCA3CTL1&= ~UCSWRST;  //完成USCI_A3初始化配置
  UCA3IE |=UCRXIE;  //使能USCI_A3接收中断
  //_EINT();
}

//函数Init_TimerA0(void)
//功能:初始化定时器A0
void Init_TimerA(void)
{
  TA0CTL = 0;  //将TA0控制寄存器清零,输入分频设为1
  TA0CTL |= TACLR;  //Timer_A clear
  TA0CTL |= TASSEL_2;  //TA0时钟源选为SMCLK;
  TA0CCR0  = 891; // SMCK=XT2=16MHz,设置计数器溢出时间
  TA0CCTL0 = 0;  //TA0捕获/比较寄存器清零
  TA0CTL |= MC_1;  //TA0增计数模式
  TA0CCTL0 |= CCIE;  //使能比较中断
}

#pragma vector=TIMER0_A0_VECTOR                             
__interrupt void Int_TimerA0(void)
{
  P2OUT = BridgeVolts12[s];
  //P1OUT = P2OUT;
  s++;
  if(s==360)
  {
    s=0;
  }
}

void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;
  Init_CLK();  //时钟系统初始化
  //P5DIR |= BIT4;  // 主电源打开
  //P5OUT |= BIT4;
  P8DIR |= 0xff;
  P8OUT |= 0x7a;
  //P1DIR |= 0xff;
  //P1OUT |= 0xff;
  P2DIR |= 0xff;  //设置P6输出
  P2OUT |= 0x00;
  Init_UART();  //通讯初始化
  //while(i<360);  //判断接收数据的个数
  //_DINT();
  Init_TimerA();  //定时器初始化
  _EINT();  //开总中断
  while(1);
}
#pragma vector=USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{
  switch (__even_in_range(UCA3IV,4))
  {
  case 0:break;
  case 2:
    //while(!(UCA3IFG&UCTXIFG));
    if(i<360)
    {
      while(!(UCA3IFG&UCTXIFG));  //判断上一次发送是否完成
      BridgeVolts12[i]=UCA3RXBUF;  //将接收到的数据存入数组
      i++;
      UCA3TXBUF=UCA3RXBUF;  //将接收到的数据压入发送缓冲寄存器,发送给PC,在串口调试助手中回显
    }
    else
    {
      while(!(UCA3IFG&UCTXIFG));
      P8OUT=UCA3RXBUF;
      UCA3TXBUF=UCA3RXBUF;
    }
    break;
  case 4:break;
  default:break;
  }
}



此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章