【问题标题】:MSP-EXP430F5529LP TI Launchpad UART Serial comms issueMSP-EXP430F5529LP TI Launchpad UART 串​​行通信问题
【发布时间】:2014-03-21 16:46:16
【问题描述】:

我正在尝试将 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”成功地。我认为 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- [已解决] 至少足以满足我的需求

我现在必须使用“软糖”修复。因为我只需要 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;
}

如果有人能解释为什么会发生这种情况,我很乐意投票给你!

【问题讨论】:

    标签: serial-port uart msp430


    【解决方案1】:

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

    方向由 UCMSB(位 5)设置 UCAxCTL0 寄存器中的控制位。这一点需要清楚。

    【讨论】:

    • 感谢您的评论。我已经尝试了两种方法,但都没有修复。我添加了更多关于传输内容和接收内容之间关系的详细信息。解决方案目前正在躲避我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2019-06-15
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多