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.

[参考译文] MSP430F6721:通过 UART 连接 Arm M0 MCU 时会出现什么问题?

Guru**** 687780 points
Other Parts Discussed in Thread: MSP430FR2532, MSP430F6721
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/792858/msp430f6721-what-could-go-wrong-when-interfacing-with-arm-m0-mcus-via-uart

器件型号:MSP430F6721
主题中讨论的其他器件:MSP430FR2532

您好!

我们有两个通过 UART 相互通信的系统(A 和 B)。 系统 A 围绕 MSP430F6721构建、系统 B 围绕 MSP430FR2532或 NXP/STM32的 Arm M0+ MCU 构建。 基于 MSP430FR2532的系统 B 与系统 A 完全兼容。但是、基于 Arm M0的系统 B 在某种程度上无法正常工作。 在不同的时间(从数天到数周)之后、某些系统 B 似乎变得无响应。 循环通电系统 B 不会使其再次响应。 但循环通电系统 A 会达到这一目的。 RXD、TXD、RTS 和 CTS 引脚均用于连接系统 A 和 B

在这种设置中会出现什么问题? 作为一种时间解决方案、如果系统 B 不响应、我们可以重置系统 A、希望这能起作用。 但了解突出的原因仍然是很好的。

编辑:由于响应不灵敏、我的意思是系统 A 在向它发送请求后不接收来自 B 的响应、而 A 的其他部分、如其他 UART、LCD 工作正常。 由于电源循环 B 无法解决问题、而电源循环 A 可以解决问题、因此我假设 A 无法发送或接收来自 B 的通信  

提前感谢。

志勇

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

    msp430f6721的时钟源是什么? 如何配置 UART?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gary、

    感谢您的回复。 时钟以手表晶振为基准:

    //打开 XT1手表晶振,等待 XT1稳定
    UCSCTL6 &&μ~(XT1OFF);//
    UCSCTL6上的 XT1 |= XCAP_3;//内部负载电容
    UCSCTL3 |= SELREF_REFOCLK;//设置 DCO FLL 基准= REFO
    UCSCTL4 = SELA_XT1CLK | SELESS__DCOCLKDIV | SELM_DCOCLK;//设置 ACLK = XT1、SMCLK = DCOCLKDIV、MCLK = DCOCLK
    __bis_SR_register (SCG0);//禁用 FLL 控制环路
    UCSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx
    UCSCTL1 = DCORSEL_5;//选择 DCO 范围16MHz 操作
    UCSCTL2 = FLLD_2 | 121;// fDCOCLK = 4 *(121 + 1)* 32768 = 15、990、784Hz、fSMCLK = 4MHz
    __BIC_SR_register (SCG0);//启用 FLL 控制环路
    DO{
    UCSCTL7 &=~(XT2OFFG | XT1LFOFFG | DCOFFG);//清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG;//清除故障标志
    } while (SFRIFG1 & OFIFG); 

    下面是初始化 UART 的代码:

    P1SEL |= BIT2 | BIT3; //将 P1.2、P1.3设置为非 IO
    P1DIR |= BIT2 | BIT3; //启用 UCA0RXD、UCA0TXD
    UCA0CTLW0 |= UCSWRST; //**将状态机复位**
    UCA0CTLW0 |= UCSSEL_1; // CLK = ACLK
    UCA0BRW_L = 0x03; // 32kHz/9600=3.41 (请参阅用户指南)
    UCA0BRW_H = 0x00; //
    UCA0MCTLW = 0x5300; //调制 UCBRSx=0x53、UCBRFx=0
    UCA0CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**
    UCA0IE |= UCRXIE;

    再次感谢、

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

    对于 XT1、您可以检查布局、请参阅以下文档 www.ti.com/.../slaa322d.pdf
    对于软件、您可以参考此演示代码
    dev.ti.com/.../node

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

    我不认为 XT1的布局是个问题、因为在连接另一个 MSP430的两年多时间里、数百个系统 A 工作正常。 只有当我们需要与基于 Arm M0的系统连接时、问题才会出现。

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

    为什么使用 REF 作为 DCO 源? 为什么不使用 XT1?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    完全错过了这个部分。 更新它。 但是,为什么我们遇到了 Arm M0的问题,这让我很困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    老实说,我没有看到这种问题。 我建议使用我发送给您的演示代码、并使用 Arm M0器件进行测试。 唯一需要更改演示代码的是使 ACLK 源变为 XT1、以确保 MCLK 和 UART 具有相同的时钟源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MCLK 和 UART 使用不同的时钟源会产生什么后果? 系统 A 有另一个问题、不确定它是否相关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Zhiyong

    我不确定 MCLK 和 UART 的结果使用不同的时钟源。 我所做的只是为了降低风险。
    有关 UART 的勘误表、请参阅 USCI42 www.ti.com/.../slaz339ad.pdf、 但这似乎与您的问题无关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关 USCI37的更多详细说明? 系统 A 具有 I2C EEPROM。 UARTRXBUF 由 ISR 读取、因此当 I2C 在某个点处于活动状态时、很可能会读取。 不确定这是否相关、但绝对值得调查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Zhiyong

    这意味着如果在接收结束时没有从接收缓冲器 UCBxRXBUF 中读取之前的数据、总线将保持 SCL 为低电平而被挂起。 一旦 UCBxRXBUF 被读取、新数据就会被传输到 UCBxRXBUF 中、一个应答被发送到主器件、并且下一个数据就会被接收。 因此、当接收到数据时、应尽快读取 UCBxRXBUF。(或使 I2C 时钟变慢、以便 CPU 有更多时间读取数据)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

      可能是 RTS 和 CTS 死锁。  

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

    尊敬的 Peter:

    您能再详细说明一下吗? 我假设这种死锁同时涉及 A 和 B、因此关闭电源再打开 B 或断开 B 与 A 的连接/重新连接会打破这种死锁。  

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

    这种死锁是指两侧都处于不发送数据状态。

    Salae 这样的逻辑分析仪在这里非常有用

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

    已从字段中拉出一个执行此操作的系统 A。 UART TX 工作正常、但 MSP430不响应 RX 线上 B 的输入。 在看门狗引起复位后、系统 A 再次开始正常工作。

    什么可能导致 MSP430不处理 UART RX? RX 中断没有被置位?

    更新:问题是由错误引起的。 在某些罕见的情况下、MSP430上的 UART RX 可被代码永久禁用。 我们在与 Arm M0 MCU 连接时才开始发现问题的原因是实现方式与 MSP430FR2532不同、因此使错误更容易表现出来。 这个问题与通常与 MSP430的 M0硬件差异无关。

    感谢大家参与讨论。