This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:HC-06不会显示和传输正确的信号

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/631189/msp430g2553-hc-06-does-not-reveive-and-transmit-correct-signal

部件号:MSP430G2553

您好,我正在尝试在MSP430G2553午餐板上驱动蓝牙HC-06。 我使用的示例代码如下所示:

运行代码后,我可以通过电话配对蓝牙,但无法接收或传输正确的信号。 无论我通过电话发送什么信件,我都会收到"0xFF",即UCA0RXBUF。 同样,我只能接收"0xFF",无论我在UCA0TXBUF上发送了什么信件。

我已经被绞死了3天了,但是找不到问题所在...

#include <MSP4S.h>

字符串1[8];
字符I;
字符j =0;

内部主(无效)

 WDTCTL = WDTPW + WDTHOLD;                //停止WDT
 P1DIR = 0xFF;                            //所有P1.x输出
 P1OUT = 0;                               //所有P1.x重置
 P2DIR = 0xFF;                            //所有P2.x输出
 P2OUT = 0;                               //所有P2.x重置
 P1SEL = BITS1 + BITS2;                    // WFP 1.1 = RXD,WFP 1.2 = TXD
 P1SEL2 = BITS1 + BITS2;                    // WFP 1.1 = RXD,WFP 1.2 = TXD
 
 UCA0CTL1 || UCSSEL_1;                    // CLK = ACLK
 UCA0BR0 = 0x03;                          // 32kHz/9600 = 3.41
 UCA0BR1 = 0x00;                          //
 UCA0MCTL = UCBRS1 + UCBRS0;              //调制UCBRSx = 3
 UCA0CTL1 &=~UCSWRST;                    //**初始化USCI状态机**
 IE2 |= UCA0RXIE;                         //启用USI_A0 RX中断

 __bis_sr_register(LPM3_bits + GIE);      //输入LPM3,中断已启用
}

// USCI A0/B0传输ISR
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USCIAB0TX_vector
__interrupt void USCI0TX_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USICAB0TX_vector))) USCI0TX_ISR (void)
#否则
错误编译器不受支持!
#endif

 UCA0TXBUF =字符串1[I++];                // TX下一个字符

 如果(i == sizeof string1)                 // Tx结束?
   IE2 &=~UCA0TXIE;                      //禁用USI_A0 TX中断
}

// USCI A0/B0接收ISR
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USCIAB0RX_vector
__interrupt void USCI0RX_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USICAB0RX_vector))) USCI0RX_ISR (void)
#否则
错误编译器不受支持!
#endif

 string1[j++]= UCA0RXBUF;
 如果(j > sizeof string1 - 1)
 {
   I = 0;
   J = 0;
   IE2 |= UCA0TXIE;                       //启用USI_A0 TX中断
   UCA0TXBUF = string1[I++];
 }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Hongmei,

    断开ez-430收割台行(J3)的RXD/TXD跳线,因为背信道连接很可能干扰设备通信。 您还应通过示波器或逻辑分析仪查看UART线路,以确保它们已正确发送。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ryan:

    非常感谢您的回复。 我已断开J3上的RXD/TXD。 但我仍然遇到同样的问题。 我已使用"回路"方法(将RX TX引脚连接在一起)测试了蓝牙模块,我可以收到我发送的任何信件。 因此,蓝牙模块工作正常。 我使用示波器来测试UART线路,但几乎检测不到信号。

    我也尝试过发送一封信,我设置 了UCA0TXBUF ='A';使用调试工具,我可以看到UCA0TXBUF的值是A(0x41),但每次运行代码时,蓝牙终端都会收到一个奇怪的符号。 而且,我不是一直从RX buf获得“0xFF”,有时,我得到0xC6或0xf8,但0xFF似乎是最常见的。 您是否知道其他哪些问题可能导致 UCA0RXBUF和UCA0TXBUF不断出错? 非常感谢。

    此致,
    洪美

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Hongmei:

    是否已正确连接外部晶体振荡器?您能否验证ACLK是否为32 kHz? 如果LFXT1未填充或不稳定,则VLOCLK将改为源ACLK,这对于UART通信是不足够的。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ryan:

    在洗衣房里没有外部水晶。 如果LFXT1不稳定,我可以使用DCO吗? 我尝试修改下面的代码以使用DCO,但我遇到了相同的问题...
    内部主(无效)

     WDTCTL = WDTPW + WDTHOLD;                //停止WDT
     DCOCTL = 0;
     DCOCTL = CALDCO_1MHz;      // 1 MHz DCO
     BCSCTL1 = CALC1_1MHz;
     P1DIR = 0xFF;                            //所有P1.x输出
     P1OUT = 0;                               //所有P1.x重置
     P2DIR = 0xFF;                            //所有P2.x输出
     P2OUT = 0;                               //所有P2.x重置
     P1SEL = BITS1 + BITS2;                    // WFP 1.1 = RXD,WFP 1.2 = TXD
     P1SEL2= BITS1 + BITS2;                    // WFP 1.1 = RXD,WFP 1.2 = TXD

     UCA0CTL1 || UCSSEL_2;                    // CLK = SMCLK
     UCA0BR0 = 104;                          // 1MHz/9600 = 104
     UCA0BR1 = 0;                          //
     UCA0MCTL = UCBRS0;              //调制UCBRSx = 1
     UCA0CTL1 &=~UCSWRST;                    //**初始化USCI状态机**
     IE2 |= UCA0RXIE;                         //启用USI_A0 RX中断

     __bis_sr_register(LPM3_bits + GIE);      //输入LPM3,中断已启用
    }

    此致,

    洪美

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    洪美

    没有填充外部晶体肯定是个问题,您的ACLK源是VLOCLK,频率~12 kHz,差异很大。 您可以改用DCO,但SMCLK只能运行到LPM0,并在LPM3中关闭。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ryan:

    非常感谢您帮助我找出问题并回顾CLK知识。 现在我正专注于使用DCO,因为我手上没有水晶。 我已将LPM3更改为LPM0,并将代码更改为仅读取RX值。 但我仍然遇到相同的问题... 请帮助我再次检查代码吗? 非常感谢。

    #include <MSP4S.h>
    字符A;

    内部主(无效)

     WDTCTL = WDTPW + WDTHOLD;                //停止WDT
     DCOCTL = 0;
     DCOCTL = CALDCO_1MHz;         // 1 MHz DCO
     BCSCTL1 = CALC1_1MHz;
     P1DIR = 0xFF;                            //所有P1.x输出
     P1OUT = 0;                               //所有P1.x重置
     P2DIR = 0xFF;                            //所有P2.x输出
     P2OUT = 0;                               //所有P2.x重置
     P1SEL = BITS1 + BITS2;                    // WFP 1.1 = RXD,WFP 1.2 = TXD
     P1SEL2= BITS1 + BITS2;                    // WFP 1.1 = RXD,WFP 1.2 = TXD

     UCA0CTL1 || UCSSEL_2;                    // CLK = SMCLK
     UCA0BR0 = 104;                           // 1MHz/9600 = 104
     UCA0BR1 = 0;                             //
     UCA0MCTL = UCBRS0;              //调制UCBRSx = 1
     UCA0CTL1 &=~UCSWRST;                    //**初始化USCI状态机**
     IE2 |= UCA0RXIE;                         //启用USI_A0 RX中断

     __bis_sr_register(LPM0_bits + GIE);      //输入LPM0,中断已启用
    }

    //回显RXed字符,请先确认TX缓冲区已就绪
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=USCIAB0RX_vector
    __interrupt void USCI0RX_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (USICAB0RX_vector))) USCI0RX_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

       A = UCA0RXBUF;
    }

    此致,
    洪美

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    洪美

    您的代码看起来很好,因为它直接来自示例代码。 请进一步描述您看到的问题。 是否输入了USCI接收ISR,且A中存储了什么值? 您是否确信TLV中存储的校准常数未被擦除?

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ryan:

    感谢您检查我的代码。 USCI接收ISR,A中存储的值为0x00,但UCA0RXBUF接收错误信号,例如:当我从电话发送数字“1”时,UCA0RXBUF显示“0xC7”的值, 数字“2”显示“0xFF”, 数字“3”显示“0xFF”,数字“4”显示“0xC7”,数字“0x5”。
    如果重置并再次运行代码,UCA0RXBUF收到的第一个值可能会更改,例如:我再次发送数字“1”作为第一个信号,数字“1”显示值“0xE8”,数字“2”显示“0xFF”, 数字“3”显示“0xFF”,数字“4”显示“0xC7”,数字“5”显示“0xC7”。
    该值似乎遵循了某种规则,但未显示正确的ASCII值。

    我不确定如何检查TLV中的校准常数,但反汇编中的值始终如下图所示:

    非常感谢,

    洪美

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hey Hongmei,

    请再次使用逻辑分析仪或示波器验证从您的HC-06设备发送的信号。 您可能希望通过背信道UART与PC通信来验证MSP430G2553的USCI的运行情况,但请记住为每个用例相应地切换J3上的RX/TX跳线。 我无法查看您尝试附加的图像。

    此致,
    Ryan