wangziqidai 发表于 2015-4-10 16:43:47

真心求助MSP430的串口问题,调了一周没调通,快哭了。

本人小硕一枚,现在在做一个数据采集系统,用MSP430F247采集惯性敏感元件(MPU6050)的数据,采集到的数据通过串口发送出来。现在问题是采集到的数据存在数组里,通过串口发的时候发不出来,用示波器看UCA0TXD也没有信号。程序如下,请大家帮忙看看,谢谢。有做这块的也可以加Q交流一下,共同成长,进步。int main(void)
{      
    WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
    Init_CLK();   //初始化时钟
    Init_Port();
    Init_UART();
    Init_IIC();    //IIC初始化
    MPU9255_Init();    // //MPU9255初始化
    _EINT();//打开全局中断控制
    while(1)
      {
                MPU9255ReadAcc(Accel);
                Uart_Putchar(Accel);
                Uart_Putchar(Accel);
                Uart_Putchar(Accel);
                MPU9255ReadGyro(Gyro);
                Uart_Putchar(Gyro);
                Uart_Putchar(Gyro);
                Uart_Putchar(Gyro);
      }      
}
void Init_UART()
{
UCA0CTL0 = 0;
UCA0CTL1 |= UCSWRST;                      // Set SW Reset
UCA0CTL1 |= UCSSEL_2;                         // Use SMCLK
UCA0BR0 = 0xA0;                           // 4MHz/416=9600KHz
UCA0BR1 = 0x01;                           //9600
UCA0MCTL=0xC0;
P3SEL |= 0x30;                      //P3.1 3.3作为IIC的SDA和SCL端口,P3.4 P3.5作为调试串口的TXD和RXD端口
P3DIR |= BIT4;
P3DIR &=~BIT5;                      //Setting P3.5 input
UCA0CTL1 &= ~UCSWRST;                     // Resume operation
IFG2 &=~UCA0TXIFG;      //因为UCA0TXIFG默认为1,如果不置0,下面的发送中断使能会直接进入中断函数
__bis_SR_register(GIE);      
}
void Uart_Putchar(unsigned char c)
{

while((IFG2 & UCA0TXIFG));//待发送为空
UCA0TXBUF=c;
IE2 |= UCA0TXIE;
}




#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
IFG2 &=~UCA0TXIFG;
IE2 &= ~UCA0TXIE;
}
目的很简单,就是把Accel,Gyro里面的数据通过串口发送到PC机显示出来,是不是我对430串口的理解不到位,欢迎各位批评指正。

liuerbin 发表于 2015-4-10 16:55:43

熟悉的坛友给他个例程吧。建议再看手册和例程。

祥子 发表于 2015-4-10 17:55:43


建议分以下几步:
(1) MCU--PC   可以正常的收发;
    ---- 如果这个有问题的话,到Ti的官网下载串口的使用例程;

(2)读写MPU6050正常;
   ---IAR或CCS中直接设置断点,在线调试

(3)。。。基本上就可以正常工作了

wangziqidai 发表于 2015-4-10 18:43:21

liuerbin 发表于 2015-4-10 16:55
熟悉的坛友给他个例程吧。建议再看手册和例程。

帮我看下发送函数和中断那里的是否有问题,主要是逻辑上,我感觉是不是我对串口的理解不是很清楚,我真的看了很多遍了,没整明白。

wangziqidai 发表于 2015-4-10 18:45:59

祥子 发表于 2015-4-10 17:55
建议分以下几步:
(1) MCU--PC   可以正常的收发;
    ---- 如果这个有问题的话,到Ti的官网下载串 ...

官网的例程也整不对啊,

#include <msp430.h>

char string1;
char i;
char j = 0;

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
P1DIR = 0xFF;                           // All P1.x outputs
P1OUT = 0;                              // All P1.x reset
P2DIR = 0xFF;                           // All P2.x outputs
P2OUT = 0;                              // All P2.x reset
P3SEL = 0x30;                           // P3.4,5 = USCI_A0 TXD/RXD
P3DIR = 0xFF;                           // All P3.x outputs
P3OUT = 0;                              // All P3.x reset
P4DIR = 0xFF;                           // All P4.x outputs
P4OUT = 0;                              // All P4.x reset
UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41
UCA0BR1 = 0x00;                           //
UCA0MCTL = UCBRS1 + UCBRS0;               // Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
IE2 |= UCA0RXIE;                        // Enable USCI_A0 RX interrupt

__bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, interrupts enabled
}

// USCI A0/B0 Transmit ISR
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCIAB0TX_VECTOR))) USCI0TX_ISR (void)
#else
#error Compiler not supported!
#endif
{
UCA0TXBUF = string1;               // TX next character

if (i == sizeof string1)                  // TX over?
    IE2 &= ~UCA0TXIE;                     // Disable USCI_A0 TX interrupt
}

// USCI A0/B0 Receive ISR
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCIAB0RX_VECTOR))) USCI0RX_ISR (void)
#else
#error Compiler not supported!
#endif
{
string1 = UCA0RXBUF;
if (j > sizeof string1 - 1)
{
    i = 0;
    j = 0;
    IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
    UCA0TXBUF = string1;
}
}

这就是官网的例程,我感觉是我对串口的理解不对,帮我看看我发送函数和中断那里是不是逻辑上有问题啊。。实在是没招儿了。。拜托了,新手无力!

梁国俭 发表于 2015-4-10 18:51:34

P10SEL = 0x30;                           // 选择RS232引脚功能
    P10DIR |= BIT4;
    P10DIR |= BIT5;
    UCA3CTL1 |= UCSWRST;                      // 复位UART状态机
    UCA3CTL1 |= UCSSEL_1;                     // CLK = ACLK
    UCA3BR0 = 0x06;                           // 32kHz/4800=6.67
    UCA3BR1 = 0x00;                           //
    UCA3MCTL = 0x6e;                        // UCBRFx=0x0e,UCBRSx=0x06
    UCA3CTL1 &= ~UCSWRST;                     // 启动UART
    UCA3IE |= UCRXIE;                         // 数据接收中断使能



UCA3TXBUF = str;
   while (!(UCA3IFG & UCTXIFG));                              // 判断是否发送完

yangchang66 发表于 2015-4-14 18:53:21

看看能不能进接收中断
//******************************************************************************
//   MSP430x24x Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A0 RX interrupt triggers TX Echo.
//   Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
//   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//
//                MSP430F249
//             -----------------
//         /|\|            XIN|-
//          | |               |
//          --|RST          XOUT|-
//            |               |
//            |   P3.4/UCA0TXD|------------>
//            |               | 9600 - 8N1
//            |   P3.5/UCA0RXD|<------------
//
//B. Nisarga
//Texas Instruments Inc.
//September 2007
//Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include "msp430x24x.h"

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
{
    while(1);                               // If calibration constants erased
                                          // do not load, trap CPU!!
}   
BCSCTL1 = CALBC1_1MHZ;                  // Set DCO
DCOCTL = CALDCO_1MHZ;
P3SEL = 0x30;                           // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSSEL_2;                     // SMCLK
UCA0BR0 = 104;                            // 1MHz 9600; (104)decimal = 0x068h
UCA0BR1 = 0;                              // 1MHz 9600
UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
IE2 |= UCA0RXIE;                        // Enable USCI_A0 RX interrupt

__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

//Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF;                  // TX -> RXed character
}

yangchang66 发表于 2015-4-14 18:55:51

如果官方例程都不行,怀疑是板子坏了还是串口坏了

helloshi 发表于 2015-4-16 13:00:15

IFG2,IE2 这2个用的不对.

xieguangye 发表于 2015-4-16 15:53:21

串口发送中断的概念需要好好理解啊。
串口发送中断是指完成一次串口发送(一般一个字节)发生的中断。
页: [1]
查看完整版本: 真心求助MSP430的串口问题,调了一周没调通,快哭了。