搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2015-4-10 16:43:47 | 显示全部楼层 |阅读模式
本人小硕一枚,现在在做一个数据采集系统,用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[0]);
                Uart_Putchar(Accel[1]);
                Uart_Putchar(Accel[2]);
                MPU9255ReadGyro(Gyro);
                Uart_Putchar(Gyro[0]);
                Uart_Putchar(Gyro[1]);
                Uart_Putchar(Gyro[2]);
        }      
}
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串口的理解不到位,欢迎各位批评指正。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-4-10 16:55:43 | 显示全部楼层
熟悉的坛友给他个例程吧。建议再看手册和例程。

出0入0汤圆

发表于 2015-4-10 17:55:43 | 显示全部楼层

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

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

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

出0入0汤圆

 楼主| 发表于 2015-4-10 18:43:21 | 显示全部楼层
liuerbin 发表于 2015-4-10 16:55
熟悉的坛友给他个例程吧。建议再看手册和例程。

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

出0入0汤圆

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

官网的例程也整不对啊,

#include <msp430.h>

char string1[8];
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[i++];                 // 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[j++] = UCA0RXBUF;
  if (j > sizeof string1 - 1)
  {
    i = 0;
    j = 0;
    IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
    UCA0TXBUF = string1[i++];
  }
}

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

出0入0汤圆

发表于 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[i];
     while (!(UCA3IFG & UCTXIFG));                                // 判断是否发送完

出0入0汤圆

发表于 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
}

出0入0汤圆

发表于 2015-4-14 18:55:51 | 显示全部楼层
如果官方例程都不行,怀疑是板子坏了还是串口坏了

出0入0汤圆

发表于 2015-4-16 13:00:15 | 显示全部楼层
IFG2,IE2 这2个用的不对.

出0入0汤圆

发表于 2015-4-16 15:53:21 | 显示全部楼层
串口发送中断的概念需要好好理解啊。
串口发送中断是指完成一次串口发送(一般一个字节)发生的中断。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 18:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表