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.

[参考译文] MSP430F5505:与时钟相关的问题非常奇怪、会影响 GPIO 的行为

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1497239/msp430f5505-very-weird-clock-related-problem-impacting-the-behavior-of-a-gpio

部件号:MSP430F5505

工具/软件:

我会尽量详细地解释这个问题。

系统:

电容式触控传感器连接到 MSP430F5505 MCU。 用户将手指放在传感器上、传感器会进行一些处理(其中包含 ASIC)。 当传感器准备好发送数据时、它会将 RDY 信号拉至低电平。 RDY 信号作为输入馈送到 MCU。

时钟配置:

4MHz 有一个外部晶体用于为 MCU 提供时钟。 MCU 中有三个主时钟-主时钟、子主时钟和备用时钟。 I2C 外设从其 SCL 的子主时钟获取时钟。

XT2 (4MHz)-> FLL (这里我们进行乘法并发送 MCLK=SMCLK = 24MHz)-> DCO -> MCLK 和 SMCLK

问题:

在主循环中、只要我们进入、我就有一个如下所示的测试代码:
```μ s
静态易失性 uint32_t GETmclk = 0;
静态易失性 uint32_t GETsmclk = 0;
静态易失性 uint32_t GETaclk = 0;

while (1)

__ no_operation ();
__ no_operation ();
GETsmclk = UCS_getSMCLK ();
GETmclk = UCS_getMCLK ();
GETaclk = UCS_getACLK ();
__ no_operation ();
}
```μ s
当我注释在 while 循环中编写的代码时、RDY 引脚的行为就像悬空一样。 仅当用户触摸传感器时、引脚才应变为低电平、但在未注释代码的情况下、即使用户未触摸传感器、引脚也会变为低电平。

所以我想:"嘿,让我把 RDY(输入引脚)拉高",它有效。 使用软件启用上拉引脚后即可正常工作。 但还有另一个问题:

当我使用 REFOCLOCK 运行 SMCLK、并且 SMCLK 以低得多的速度运行时、即使 GPIO 引脚未被拉高、也不会出现问题。

所以我想:当 SMCLK 来自 DCO 时、我来尝试减少 SMCLK。 这没有解决问题。 我想知道发生了什么。

为什么在主循环中读取 SMCLK 和 MCLK 对 PIN 悬空有帮助? 它是否以某种方式与时钟同步? 为什么从 REFOCLOCK 为 SMLCK 提供源会有所帮助?

clock init 如下所示:
```μ s
静态 void initClock (void)

GPIO_setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_P2 | GPIO_PIN3);
UCS_setExternalClockSource (0、XT2_FREQ);
UCS_TURNOnXT2 (UCS_XT2_DRIVE_4MHz_8MHZ);

while (UCSCTL7和(XT2OFFG | DCOFFG))

UCSCTL7 &=~(XT2OFFG | DCOFFG);
SFRIFG1 &=~OFIFG;
}

UCS_initClockSignal (UCS_FLLREF、UCS_XT2CLK_SELECT、UCS_CLOCK_DIVIDER_4);
UCS_initFLLSettle (MCLK_kHz、MCLK_FLLREF_RATIO);
UCS_initClockSignal (UCS_SMCLK、UCS_DCOCLK_SELECT、UCS_Clock_divider_1);
//由于我们不使用 ACLK、因此我们可以将其禁用。
UCS_disableClockRequest (UCS_ACLK);

//配置 USB PLL

USBKEYPID = 0x9628;//解锁 USB 配置寄存器
USBPLLDIVB = 0;//将 XT2除以1 (XT2 = USB PLL 的4 MHz 输入)
USBPLLCTL = UPLLEN | UPFDEN;//启用 USB PLL 和频率检测器
//等待 USB PLL 锁定
while (USBPLLIR 和 USBOORIFG);
USBKEYPID = 0x9600;//锁定 USB 配置寄存器

}

#define MHz ((uint32_t) 1000000)
#define XT1_FREQ ((uint32_t) 32768)
#define XT2_FREQ ((uint32_t)(4*MHz))
#define MCLK_FREQ ((uint32_t)(24*MHz))
#define SMCLK_FREQ ((uint32_t) MCLK_FREQ)
#define XT1_kHz (XT1_FREQ / 1000)
#define XT2_kHz (XT2_FREQ / 1000)
#define MCLK_kHz (MCLK_FREQ / 1000)
#define SCALE_FACTOR ((uint8_t) 4)

#define MCLK_FLLREF_RATIO (MCLK_kHz/(XT2_kHz/比例因子)
```μ s

总结如下:

-当 while (1)内的内容被注释掉时(即
GETmclk = UCS_getMCLK ()和相关行)、RDY 行开始
就好像它是浮动的。
-在 RDY 上启用内部上拉可稳定它并防止错误
进行触发。
-对 SMCLK 使用 REFO (而不是 DCO @ 24 MHz )也可以防止 RDY
防止错误地变为低电平、即使没有上拉电阻也是如此。
-降低 SMCLK 频率,同时仍从 DCO 提供它
无法解决问题。
-读取时钟值的行为(如 UCS_getSMCLK ())
主环路以某种方式稳定 RDY 线路行为。

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

    当您未使用 RDY (输入)引脚上的内部上拉电阻时、是什么将其上拉? 您的电路(或传感器)是否有自己的上拉电阻?

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

    您好 Bruce。 传感器的电路上有一个物理上拉电阻器。 它拉至 VCC。 VCC 为3V3、使用4.7k Ω 电阻器。  

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

    如何确定 RDY 引脚已(或似乎已)悬空? [我通常可以通过用手指触摸悬空的针脚来得到反应。] 我试图区分浮动和弹跳等。

    我可以问这是什么传感器吗? 也许有一条线索。 它是否安装在非常靠近 MCU 的位置?

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

    我可以向您展示信号是什么样子。 RDY 引脚变为低电平会向传感器提供芯片需要处理数据的信号(恐怕无法告诉您名称)。 它模拟了人类的触感,芯片认为"嘿,我现在需要处理数据"。

    则 MCU 不是很接近。  

    另外,当我在主 while 循环中调用"UCS_getSMCLK ()"时,我在此注释中描述的问题似乎已"消失"。 我在6MHz (SMCLK)上进行此测试。  

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

    这有点令人费解。 考虑:

    1)我很确定,要在24MHz 运行,你需要设置 PMMVCORE=3 ,但我在这里看不到。 您可以尝试添加:

    > PMM_setVcore (PMMCOREV_3);

    2)我曾认为 getSMCLK 将所有内容视为只读,但有一种情况——如果设置了 XT2OFFG——它将清除它和 OFIFG。 这只是半个理论,因为没有其他证据表明 XT2是摇摆的。

    3)观看 SMCLK 可能会有所帮助(可能通过计时器输出引脚?) 看看 XT2是否确实令人摇摇欲坠。

    4)作为一个"后备站",在 main ()的第二行设置一个断点,看看你是否得到(未注意到)重置。

    5)您是否相当确定 I2C 时钟分频器(BR1/0)正确? I2C 出现故障似乎可能会导致传感器的 RDY 行为不稳定。

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

    非常感谢 Bruce 的所有努力。 问题已经解决、让我尽可能地描述一下。

    传感器侧的 RDY 引脚使用一个4.7k Ω 电阻器和一个100nF 电容器上拉至 VCC。 RDY 引脚是"开漏低电平有效实现"。  该 RC Ckt 的充电时间约为470uS。 为了使 MCU 检测到它如此高、电压需要至少为1.5V、最大为2.10V。 假设它检测到2.10V 电压。

    现在、未满足充电时间或我们需要等待引脚稳定并被读取为高电平的时间。 在这种情况下、输入不是施密特触发器。在这种情况下、它是输入引脚、而不是更改引脚上的中断。

    因此、当我在检查 RDY 输入引脚的状态之前读取时钟频率时、在它通知 MCU 之前得到了稳定时间-"嘿、我现在很高。" 我用一些延迟替换了"读取时钟频率"部分、结果有效。 所以我尝试了不同的值、100us 延迟似乎很完美。 这就是为什么"读取时钟频率"有效的原因。 实际上、它需要一些时间来使引脚保持稳定并向 MCU 报告其电压。 当我删除或注释 "读取时钟频率"代码时、RDY 引脚的时间不够、并且报告了任何电压、因此产生了悬空行为。  

    另一件事:添加内部软件上拉电阻器是有效的。 原因是内部上拉电阻、通常为35K 欧姆、并联添加该上拉电阻、有效电阻为3.8k 欧姆。 因此、我们降低了电阻、充电时间缩短了。  

    因此、在当前代码中、我已启用软件内部上拉、并在读取引脚的状态之前添加了100us 延迟。