2017-02-03 85 views
0

我试图在德州仪器MSP430 Launchpad上设置与HM-10芯片的UART通信,但是我遇到了一个非常基本的问题。为什么如果我从MSP430 Launchpad发送AT,HM-10不会发送OK?

我想达到的目标是通过UART发送“AT”到HM-10,并获得一个答案。顺便说一下,这是一个代码我发现here和我稍微修改我的目的。

#include "msp430g2553.h" 

const char string[] = { "AT" }; 
unsigned int i; 

void main(void) 
{ 
    WDTCTL = WDTPW + WDTHOLD; // Stop the Watch dog 

    //------------------- Configure the Clocks -------------------// 

    if (CALBC1_1MHZ==0xFF) // If calibration constant erased 
    { 
     while(1);   // do not load, trap CPU!! 
    } 

    DCOCTL = 0;    // Select lowest DCOx and MODx settings 
    BCSCTL1 = CALBC1_1MHZ; // Set range 
    DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation 

    //---------------- Configuring the LED's ----------------------// 

    P1DIR |= BIT0 + BIT6; // P1.0 and P1.6 output 
    P1OUT &= ~BIT0 + BIT6; // P1.0 and P1.6 = 0 

    //--------- Setting the UART function for P1.1 & P1.2 --------// 

    P1SEL |= BIT1 + BIT2; // P1.1 UCA0RXD input 
    P1SEL2 |= BIT1 + BIT2; // P1.2 UCA0TXD output 

    //------------ Configuring the UART(USCI_A0) ----------------// 

    UCA0CTL1 |= UCSSEL_2 + UCSWRST; // USCI Clock = SMCLK,USCI_A0 disabled 
    UCA0BR0 = 104;     // 104 From datasheet table- 
    UCA0BR1 = 0;     // -selects baudrate =9600,clk = SMCLK 
    UCA0MCTL = UCBRS_1;    // Modulation value = 1 from datasheet 
    //UCA0STAT |= UCLISTEN;   // loop back mode enabled 
    UCA0CTL1 &= ~UCSWRST;    // Clear UCSWRST to enable USCI_A0 

    //---------------- Enabling the interrupts ------------------// 

    IE2 |= UCA0TXIE;     // Enable the Transmit interrupt 
    IE2 |= UCA0RXIE;     // Enable the Receive interrupt 
    _BIS_SR(GIE);      // Enable the global interrupt 

    i = 0; 
    UCA0TXBUF = string[i];     // Transmit a byte 

    _BIS_SR(LPM0_bits + GIE);   // Going to LPM0 
} 

    //-----------------------------------------------------------------------// 
    //    Transmit and Receive interrupts      // 
    //-----------------------------------------------------------------------// 

    #pragma vector = USCIAB0TX_VECTOR 
    __interrupt void TransmitInterrupt(void) 
    { 
    P1OUT ^= BIT0;//light up P1.0 Led on Tx 
    if (i == sizeof string - 1) 
    { 
    UC0IE &= ~UCA0TXIE; 
    } 
    UCA0TXBUF = string[i++]; 
    } 

    #pragma vector = USCIAB0RX_VECTOR 
    __interrupt void ReceiveInterrupt(void) 
    { 
    // light up P1.6 LED on RX 
    if (UCA0RXBUF == 'O') 
    { 
     P1OUT ^= BIT6; 
    } 
    IFG2 &= ~UCA0RXIFG; // Clear RX flag 
    } 

根据datasheet我应该收到此命令的确定答案。

如果在接收缓冲区的“O”,我预计LED点亮我的船上,但是这不会发生。

使用的Code Composer,我也加入了断点到RX验证中断确实是有没有RX答案。

我相信这完全是一个软件问题,这就是为什么我把它放在这里。我正在使用跳线的正确旋转(http://xanthium.in/Serial-Communication-MSP430-UART-USCI_A),并将RX连接到TX,反之亦然。

如果您能指出我是否做了任何错误的想法或者我犯了什么错误,我将不胜感激。谢谢!

+1

1.您必须终止 “AT” 与CR(回车); 2.也许你应该修改'UCA0TXBUF =字符串[我++]' - >'UCA0TXBUF =字符串[++ i];' – linuxfan

回答

0

我认为对于将来与HM-10设备一起工作的每个人,我都想回答这个问题,因为它有我自己的迷你文学,这首先令人沮丧,但后来我很喜欢它给我带来的挑战。

一些问题是硬件相关的,所以这篇文章可能需要转移到嵌入式工程部分。 (大的后果 - 你不能用示波器检查它之前是100%确定)

知道你的硬件 - HM-10万吨的版本,它把我们的人需要一个附加分压器,因为它有一个3.3 V逻辑电平高而不是5V。 This website is a fantastic place to start。虽然,我们的结果是一个MLT-BT05这是一个clone of a clone。它的固件上没有iBeacon功能,所以如果你不想给循环上电,那么你应该避免这个。

关于编码位最重要的是检查\ n,\ r和\ n \ r,因为linuxfan在上面简单地提到了它的重要性,因为有些设备需要它。开始的最好的地方是AT,如果它的工作原理,然后用AT + HELP,找到的版本,通常AT + version命令,所以你可以100%的把握这片你有鉴别。

Currenetly它是在Arduino上进行原型开发的,但是一旦它在MSP430上完成,我将包含工作代码。

Arduino的代码:

#include <SoftwareSerial.h> 
SoftwareSerial bluetooth(9, 10); // RX, TX 
    char commandbuffer[50]; 
     int j = 0; 
void setup() 
{ 

    memset(commandbuffer, 0, sizeof(commandbuffer)); 
    analogWrite(12, 255); 
    analogWrite(11, 0); 
    // Start the hardware serial port 
    Serial.begin(19200); 
    bluetooth.begin(9600); 
    // un REM this to set up a Master and connect to a Slave 

    Serial.println("BLE CC41A Bluetooth"); 
    Serial.println("----------------------------------"); 
    Serial.println(""); 
    Serial.println("Trying to connect to Slave Bluetooth"); 
    delay(1000); 
    bluetooth.println("AT"); // just a check 
    delay(2000); 


    bluetooth.println("AT+NAMEHIST"); 
    delay(2000); 
    bluetooth.println("AT+ROLE0"); 
    delay(2000); 
    bluetooth.println("AT+INQ"); // look for nearby Slave 
    delay(5000); 
    bluetooth.println("AT+CONN1"); // connect to it */ 
} 
void loop() 
{ 
    bluetooth.listen(); 
    // while there is data coming in, read it 
    // and send to the hardware serial port: 
    while (bluetooth.available() > 0) { 
    char inByte = bluetooth.read(); 
    Serial.write(inByte); 
    } 
    // Read user input if available. 
    if (Serial.available()) { 
    delay(10); // The DELAY! 
    char temp = Serial.read(); 
    if (temp == '\n') 
    { 
     bluetooth.println(commandbuffer); 
     Serial.println(commandbuffer); 
     memset(commandbuffer, 0, sizeof(commandbuffer)); 
     j = 0; // Reset 
    } 
    else 
    { 
     commandbuffer[j++] = temp; 
    } 
    delay(500); 
    } 
1

我看到在中断程序TransmitInterrupt()的一个问题:你应该,因为使用的“i ++”你发送两次字母“A”使用UCA0TXBUF = string[++i];。关于sizeof(string)的测试也应该修改。

话,我就会信任太多的数据表。我认为,尽管数据表说了什么,发送到调制解调器的每个命令都必须由CR(\ r)终止,否则调制解调器如何能从“AT + RESET”识别出“AT”?我不太确定,但数据表看起来并不是很高质量的。无论如何,这是一个快速测试(在字符串的末尾添加\ r)。

最后,CTS和RTS信号也可以发挥作用。有些调制解调器希望RTS断言,其他调制解调器不在乎,和术语有时是令人困惑:当数据表说RTS,这是否意味着RTS的主机的调制解调器或RTS ?我希望这有助于你,你应该做一些科学尝试。

+0

谢谢你的提示,我尝试添加\ r和改变+ II,但是事实并非如此使它更好。 – boomkin

+0

您应该确认1)MSP430通过将其连接到PC输出您想要的内容,以及2)调制解调器真正理解(也将其连接到PC)。谨防电压水平。否则难以理解哪一方(msp/modem)有问题。 – linuxfan

相关问题