真心求助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串口的理解不到位,欢迎各位批评指正。 熟悉的坛友给他个例程吧。建议再看手册和例程。
建议分以下几步:
(1) MCU--PC 可以正常的收发;
---- 如果这个有问题的话,到Ti的官网下载串口的使用例程;
(2)读写MPU6050正常;
---IAR或CCS中直接设置断点,在线调试
(3)。。。基本上就可以正常工作了
liuerbin 发表于 2015-4-10 16:55
熟悉的坛友给他个例程吧。建议再看手册和例程。
帮我看下发送函数和中断那里的是否有问题,主要是逻辑上,我感觉是不是我对串口的理解不是很清楚,我真的看了很多遍了,没整明白。 祥子 发表于 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;
}
}
这就是官网的例程,我感觉是我对串口的理解不对,帮我看看我发送函数和中断那里是不是逻辑上有问题啊。。实在是没招儿了。。拜托了,新手无力!
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)); // 判断是否发送完 看看能不能进接收中断
//******************************************************************************
// 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
}
如果官方例程都不行,怀疑是板子坏了还是串口坏了 IFG2,IE2 这2个用的不对. 串口发送中断的概念需要好好理解啊。
串口发送中断是指完成一次串口发送(一般一个字节)发生的中断。
页:
[1]