首页 > 解决方案 > CC430 UART 读取问题 - 接收中断标志始终为“0”

问题描述

我正在尝试建立 UART 通信。我可以将数据从 CC430F6137 发送到其他 MCU。但是我无法处理接收操作。我确定其他 MCU 通过 UART Tx 引脚发送数据,但我无法从 CC430 Rx 引脚获取这些数据。

我的代码是:

#include <stdio.h>
#include <msp430.h>
#include "cc430x613x.h"

char buffer_0[5] ;
char terminal_read();

int main(void)
{
  WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
  UART_open();
  UCA0IE |= UCRXIE ;

  while(1)
  {
    terminal_read();
    // __delay_cycles(1e5);
  }
  return 0;
}

char terminal_read()
{
  char c ;
  while (!(UCA0IFG & UCRXIFG));
  c = UCA0RXBUF ;
  printf("%c" , &c);
  return UCA0RXBUF;
}


void terminal_write(char *info)
{
  unsigned int i;

  unsigned int len = strlen(info) ;
  for(i=0;i<len;i++)
  {
    UCA0TXBUF=info[i];
    __delay_cycles(10000);
  }
}

void UART_open()
{
  P1SEL |= BIT5 + BIT6;
  //UART Settings
  UCA0CTL1 |= UCSWRST;
  UCA0CTL1 |= UCSSEL0 ; // ACLK
  UCA0BR0=3; //UCA0BR0 = 3 ; //32Khz / 9600 –&gt;> 3
  UCA0BR1=0; //UCA0BR1=0; // BAUD 9600; ( UCABR1 * 256 ) + UCABR0 = UCABRx see "slau259e.pdf"
  
  UCA0MCTL=UCBRS0 + UCBRS1 ; // see "slau259e.pdf" page 602 //
  //UCA0MCTL =| BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
  // |------- UCBRFx --------------|----UCBRSx----------|UCOS16|
  // for 9600 baudrate at 32kHz UCBRFx = 0 , UCBRSx = 3 , UCOS16 = 0
  // | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
  // 0b00000110 = 0x06 = 6
  UCA0CTL1 &=~ UCSWRST;//
  // UCA0CTL1 |= UCDORM;
}

void UART_close()
{

  P1SEL &= ~(BIT5 + BIT6);
  P1DIR |= BIT5 + BIT6;
  P1OUT &= ~(BIT5 + BIT6);
  UCA0CTL1 |= UCSWRST;
  UCA0CTL1 &=~ UCDORM;

}

char* String_int(int data)
{
  char* ret_data;
  ret_data = ltoa(data , buffer_0 , 10 );
  return ret_data;
}

我的代码有什么问题?我总是将 UCRXIFG 读为“0”。所以'terminal_read'函数总是卡在这条线上。

标签: cinterruptuartmsp430

解决方案


由于您在terminal_read()函数中轮询中断标志,因此您不需要使用UCA0IE |= UCRXIE;启用中断。因为这将导致 CPU 转到您的代码未提供的中断向量。相反,删除UCA0IE |= UCRXIE; 并继续投票。

此外,仅当您连接了 JTAG 调试器时, printf()才会转到调试窗口的终端,否则可能会卡住。我同意彼得的观点,如果您没有附加调试器,它可能会卡在这里。尝试将其移除并更换为 LED 闪光灯,这样您就知道terminal_read()没有卡住。


推荐阅读