MSP-EXP430F5529LP TI Launchpad UART串行通信问题

时间:2014-03-21 16:46:17

标签: serial-port uart msp430

我正在尝试将MSP-EXP430F5529LP外部串行端口(P3.4和P3.5)连接到外部串行设备。在Energia环境下,两者均设置为9600,8位,无奇偶校验,1位停止位。我已在配置文件中设置Serial1默认值,如上所示。我正在运行以下草图

    void setup()
{
  // put your setup code here, to run once:
  Serial1.begin(9600);
  Serial.begin(9600);
}

void loop()
{
  // put your main code here, to run repeatedly:

  Serial1.write(48);
  Serial.println(48,HEX); 
  delay(1000); //1 a second 
}

TI每秒传输一个字节,ASCII' 0' 0x30 0b00110000接收器正在接收一个但是它的0x06 0b00000110 - 我已经尝试了所有通常的奇偶校验和停止位的混乱,但我无法得到' 0' 0传输成功。我认为Energia支持MSP-EXP430F5529LP Serial可能存在一些错误,因为它几乎可以工作。是否有一些奇怪的字节交换事情?我已经验证了接收器的设置确实是9600N81。我应该在哪里看?

- 编辑 -

*(&(UCAxCTL1) + uartOffset) = UCSWRST;
    *(&(UCAxCTL1) + uartOffset) = UCSSEL_2;                                // SMCLK
    *(&(UCAxCTL0) + uartOffset) = 0;
    *(&(UCAxABCTL) + uartOffset) = 0;

以上代码在HardwareSerial.cpp中并设置所有默认值: 没有奇偶校验,奇校验(由于之前被忽略),LSB优先,8位,一个停止,UART模式,异步。(参见slau1.pdf第440页)。使用上面的草图,我有以下传输字符的映射和接收的内容。我目前感到困惑(我讨厌串行通信!!)

Output from MSP430     Received
0000 0001              0111 1111
0000 0010              0011 1111
0000 0011              0111 1110
0000 0100              0001 1111
0000 0101              0111 1101
...
0000 1000              0000 1111
...
0001 0000              0000 0111
....
0010 0000              0000 0011 

-EDIT 2- [求助]至少足以满足我的需求

我现在必须使用' fudge'固定。由于我只需要MSP430的输出,我修改了HardwareSerial.cpp

size_t HardwareSerial::write(uint8_t c)
{
    unsigned int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE;

    // If the output buffer is full, there's nothing for it other than to
    // wait for the interrupt handler to empty it a bit
    // ???: return 0 here instead?
    while (i == _tx_buffer->tail);

    //Fix wierdness
    ///////////////////////
    _tx_buffer->buffer[_tx_buffer->head] = 255-(c*2); //Originally was 'c' this formula was calculated by JWH
    ///////////////////////
    _tx_buffer->head = i;

#if defined(__MSP430_HAS_USCI_A0__) || defined(__MSP430_HAS_USCI_A1__) || defined(__MSP430_HAS_EUSCI_A0__) || defined(__MSP430_HAS_EUSCI_A1__)
    *(&(UCAxIE) + uartOffset) |= UCTXIE;
#else
    *(&(UC0IE) + uartOffset) |= UCA0TXIE;
#endif  

    return 1;
}

如果有人能解释为什么会这样,我会高兴地投票给你!

1 个答案:

答案 0 :(得分:0)

在USART模式下,串行端口可以以LSB或MSB优先模式传输数据。通常以LSB优先模式发送。看起来USART可能首先传输数据MSB。

方向由UCMSB设定(第5位) UCAxCTL0寄存器中的控制位。这一点需要明确。