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.

[参考译文] MSP430FR2633:使用 XT1BYPASS 旁路正常的 XT1操作、存在很多时钟问题。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/836294/msp430fr2633-bypassing-normal-xt1-operation-using-xt1bypass-lots-of-clock-questions

器件型号:MSP430FR2633

我们正在构建电池供电的 CapTIvate 器件、该器件必须在现场运行大约十年、因此功耗至关重要。 OUT 硬件团队设计了一个原型、提供192kHz 外部时钟、目的是不利用 DCO/FLL。 即、我们将直接从 XT1的192kHz 输入驱动 MCLK/ACLK。

正如您所知、时钟用途广泛、这会增加一些复杂度、尤其是考虑到我们尝试执行的操作可能并不常见。

 

无论如何、这看起来可以通过 XT1BYPASS 来完成:

驱动程序库提供了一个用于进入此模式 CS_BypassXT1 ()的接口:

 

根据 CapTIvate DC 生成的香草 BSP,我进行了以下更改:

1) 1)     添加了对 CS_BypassXT1()的调用。

2)     注释掉了对 CS_TurnOnXT1LFWithTimeout ()的调用。 (192kHz 冷冻机未通过此调用-我假设它超出此器件的范围?)

3)     3)选择 XT1CLK 作为 MCLK 和 ACLK 的时钟源(考虑到该部件不支持高速晶振、不确定是否可以在旁路模式下将192kHz 晶振用作 ACLK 的输入?)。

4)     注释了用于初始化 FLLREF 和 SMCLK 的调用(不确定这是正确的、但根据下图、SMCLK 只能来自 DCO 或高频晶体、 本部分不支持这一功能,但我不确定在使用旁路模式和192kHz 晶体时这是否是限制。)

5) 5)     根据192kHz 时钟的调试端子的波特率进行调整、以生成9600波特(并从 SMCLK 切换、我之前使用 SMCLK):

问题

时钟初始化如下。 我看到了几个问题。 1)我正在向终端打印一个“hello world”,它以更高的时钟速度/波特率工作。 现在还没有得到。 2) 2)主循环中对 CAPT_appHandler()的调用不会返回。

 

问题

1)     通过文档的形式,数据表提到了“LFXTBYPASS”,它似乎是指用户指南描述的“XT1BYPASS”。

2) 2)     如果处于旁路模式、SMCLK 和 ACLK 都可以由以192kHz 频率运行的外部晶振供源吗?

3) 3)     这在 CapTIvate 的时序需求范围内是否可行?

4) 4)     我有什么误解?

5) 5)     是否有使用旁路模式的示例? 我在 Resource Explorer 中没有看到任何内容。

非常感谢您的观看。

PS -我认为192kHz 对于 ACLK 来说可能太快了、即使在旁路模式下也是如此、因此我使用8作为分频器、并在24kHz 时钟的情况下通过 UART 波特率调整9600、但也无法打印。

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

    我在上面发布的波特率标志中有一个错误。  我更正了该帖子。  问题仍然存在!

    此外、作为一个侧注、我后退了一步并返回到工作代码、将我的 UART 设置为9600 (在 SMCLK 上)、确认我正在终端上接收数据、 然后尝试切换到用于 UART 的 ACLK (并调整了波特率寄存器)、并且我在终端上仍然没有获得良好的数据。  这些设置与上面所示的相同。

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

    Hallo Jason、

    我与设计人员联系、以阐明最大频率的规格。

    我的理解是、系统使用 SMCLK 运行、并且在使用 ACLK 时失败。 对吧?

    关于 CapTIvate 功能、我们使用专用于 CapTIvate 模块的内部振荡器。 仅当我们需要唤醒器件时、某些校准任务才需要外部时钟。

    我将在收到此信息后立即向您发送更新。

    重新分级

    Kostas

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

    您好 Kostas。   感谢您的回答。

    以下是这些问题的摘要:

    1) 1)我启用了旁路模式,以便我们将在 XT1上使用192kHz 输入,并且 似乎主循环中对 CAPT_appHandler()的第一次调用没有返回。  我们想知道、您在此速度下提及的前端校准是否存在一些限制、或者使用192kHz 时存在其他一些问题。

    2)作为检查其他功能、我还尝试使用已知工作的 UART 代码(之前使用的 SMCLK 为2MHz、115200波特)以9600波特使用 ACLK (因为我尚未启用 SMCLK)打印到终端。  我没有收到有效的输入。

    3)此外,为了调查终端问题2),我返回到工作 UART 代码,将波特率更改为9600 (仍然使用 DCO 提供的 SMCLK)并确认运行。  然后、我仅更改为源自 REFO 的 ACLK、更新了波特率设置、但未接收到良好的数据(正如我使用 SMCLK 时所得到的那样)。  因此、鉴于我们能够使用 SMCLK、我不确定为什么在9600时对 UART 使用 ACLK 会出现问题。  下面是使用我测试过的 ACLK 的最新初始化代码:

    EUSCI_A_UART_initParam param ={0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_ACLK;
    param.clockPrescalar = 3;
    param.firstModReg = 0;
    param.secondModReg = 146;
    param.parity = EUSCI_A_UART_NO_parity;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.oversaming= EUSCI_A_UART_LOW_FREQUENCY BAUDRATE_generation;
    
    if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)){
    返回;
    }
    
    EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);
    
    EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_receive_interrupt);
    
    //启用 USCI_A0 RX 中断
    EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_receive_interrupt);
    
    //启用全局中断
    _enable_interrupt ();
    

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

    Hallo Jason、

    感谢您的总结。

    在该频率下、ACLK 的使用似乎存在限制。

    我正与同事合作澄清问题、并将再次与您联系。

    此致

    Kostas

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

    Hallo Jason、

    在查看 DS 和用户指南时、我的解释是 ACLK 和 XT1CLK 也针对旁路模式指定了40kHz、

    因此、192kHz 频率下的运行将超出规格。

    DS:表6.7

    我正在与 IP 所有者合作、以验证这种解释。

    关于 CapTIvate 功能、CapTIvate 扫描过程(状态机)是使用内部 CapTIvate 16MHz 振荡器完成的、因此不会受到 LF 时钟的影响。

    但是、如果我们需要 CPU 参与处理 或更新数据、此过程将非常慢、这可能会导致延迟、具体取决于元件数量和其他功能等、尤其是在需要 CapTIvate 库操作的情况下。

    为了更好地理解、您能否提供一些有关应用的其他信息?

    关于该器件的时钟系统、它与上面给出的培训方框图不同。

    请查看用户指南图3-1

    我将再次提供更多详细信息

    此致

    Kostas

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

    谢谢。  我们期待设计团队的回应、我将更详细地查看图表。

    此应用是一款电池供电的器件、它将测量一系列焊盘、指示传感器相对于其环境的处置情况。  它大部分处于非活动状态、但需要在用例中唤醒并以快速采样率对传感器进行采样。  它还将定期报告其 OTA 状态。  设计团队的想法是、在旁路模式下使用此外部192kHz 时钟可实现最佳的功效。  我还在学习这个器件、不确定情况是否如此;使用 VLOCLK 和低功耗模式以及在唤醒时切换到高速模式似乎是合理的。

    您是否有任何意见来说明为什么我在上面列出的第3项中遇到问题、其中我使用的是带有 SMCLK 的9600 UART、但仅更改了(32kHz REFO)上的 ACLK 并更新了波特率?

    再次感谢你。

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

    Hallo Jason、

    感谢您的快速响应和提供的信息。

    我有一个问题要问: 器件上目前是否有未使用的时钟输入、该输入可用于其他用途?

    关于项目3)、容差在+- 3.5%的范围内。 我会将容差视为一个可能的原因。

    此致

    Kostas

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

    对于这个特定器件上的时钟输入、只有 XT1、它被192kHz 晶振输入占用。

    关于项目3)、您是否建议 REFO 可能对9600不够准确?

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

    Hallo Jason、

    我可以确认、XT1输入的最大值也是针对旁路模式指定的40kHz。

    这意味着192kHz 的运行将超出规格。

    一个仍然使用我尚未测试的192kHz 的想法。 使用该信号作为计时器的输入并使用 CCR 生成 PWM、例如192/6 =32kHz、情况如何? 这可以馈入 XT1。

    引脚 P1.0上的 TA0CLK 可被用作输入、引脚 P1.1上的 TA0.1可被用作输出

    正如我说过的、建议您进行测试、因为您有可用的备用计时器。

    关于 REFO、是的、这就是我的意思。 您能否使用稳定的源极信号对其进行测试?

    请告诉我您的看法

    此致

    Kostas

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

    您好 Kostas。  感谢您回来。  我认为我们将要做的是:

    1) 1)报废192kHz 外部振荡器。

    2) 2)使用 REFO 作为 FLLCLK 和 ACLK 的源。

    3) 3)将 FLL/DCO 配置为1MHz。

    4) 4)将 MCLK 从 DCO 中拉电流、并除以4以在250kHz 下运行。

    5) 5)从 MCLK/DCO 中为 SMCLK 供源并除以1以在250kHz 下运行。 (选择250k 以确保时钟足够快、从而在 UART 上可靠地生成9600波特)。

    6) I2C 将使用 MODCLK (5MHz)、因为总线速度不能超过 f/4 (250kHz 对于100kb 12C 来说不够快。)  

    7) UART (9600波特)将使用 SMCLK (MODCLK +/- 10%太高、UART 的错误率)。

    到目前为止、这种配置似乎可以正常工作、考虑到我们的通信需求、我认为这可能是我们功耗的最佳配置。  您在这里看到了任何潜在问题吗?

    顺便说一下、我是否理解文档中正确的 MODCLK 将由使用它的外设自动启用/禁用、而无需显式调用?


    #define MCLK_FREQ (1000000) #define SMCLK_FREQ (250000) #define ACLK_FREQ (32768) #define FLLREF_FREQ (32768) #define FLL_Ratio (MCLK_FREQ / FLLREF_FREQ)

    CS_initClockSignal (CS_FLLREF、CS_REFOCLK_select、CS_clock_divider _1);
    CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、 CS_clock_divider 1);
    CS_initClockSignal (CS_MCLK、CS_DCOCLKDIV_select、CS_clock_divider 4);
    CS_initClockSignal (CS_SMCLK、 CS_DCOCLKDIV_SELECT、CS_CLOCK_DIVIDER_1);
    
    //
    调整 DCO 参数
    //
    CS_initFLL ((MCLK_FREQ/1000)、FLL_Ratio);
    CS_clearAllOscFlagsWithTimeout (1000); 



    void uC_I2C_Init (void)
    {
    //初始化主设备
    EUSCI_B_I2C_initMasterParam param ={0};
    param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_MODCLK;
    param.i2cClk = 5000000;
    param.datarate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
    param.byteCounterThreshold = 1;
    param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
    EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、&param);
    }
    

    void uC_UART_Init (void)
    {
    //配置 UART
    // SMCLK = 2MHz、波特率= 115200
    // software-dl.ti.com/.../index.html 上计算的设置
    
    EUSCI_A_UART_initParam param ={0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
    param.clockPrescalar = 1;
    param.firstModReg = 10;
    param.secondModReg = 0;
    param.parity = EUSCI_A_UART_NO_parity;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.oversaming= EUSCI_A_UART_oversaming_BAUDRATE_generation;
    
    if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)){
    返回;
    }
    
    EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);
    
    EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_receive_interrupt);
    
    //启用 USCI_A0 RX 中断
    EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_receive_interrupt);
    
    //启用全局中断
    __ENABLE_INTERRUPT();
    
    } 

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

    您好 Jason、

    感谢您为解决该问题所做的积极贡献。

    您的实施似乎是一个很好的解决方案。 对于小幅改进、我还有一些其他问题。

    -应用的预期温度范围是多少?

    -使用晶体是否完全不能讨论?

    -使系统大部分处于睡眠模式,考虑上述 VLO 选项会怎么样?

     我将在收到以上答案后尽快回复您。

    谢谢

    此致

    Kostas

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

    您好 Jason、

    我错过了关于 MODCLKREQEN 的最后一个问题。

    这也是我的解释。 激活将由外设直接完成。

    请将 MODCLKREQEN 位置位、默认情况下它被置位为0。 (请参阅 UG 表3-12)

    此致

    Kostas

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

    1) 1)器件在现场的工作温度会有所不同。  它在部署时将在室外、因此不受气候控制。  大多数温度范围或高温区域、温度范围约为-20°C 至60°C。

    2) 2)使用外部晶体并不是讨论中的问题。  我假设问题是在这些温度范围内使用 REFO 和/或 MODCLK?  如果是这种情况、我们可以解决外部晶体的 REFO 问题、但这会使 MODCLK 成为一个开放性问题、因为我们仍然需要使用它来获得 I2C 速度。

    3)是的、我们绝对会在两次激活之间使用睡眠模式。  激活可能来自电路板上几个器件(可能是电容垫和备份)的离散信号。

    4) 4)是的、我看到的图表似乎表明外设可以发出请求、但不能明确表示它是隐式发生的。  ADC 部分确实会在不需要时断电、但不清楚这是可能正在使用它的所有外设的一个特性:

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

    Hallo Jason、感谢您的快速响应。

    您的假设正确、我对 REFO 温度漂移有一些担忧。 晶振将是安全的解决方案、并且可以在 LPM 期间实现 UART 通信。

    关于 MODCLK、我的理解是、如果 MODCLKREQEN 位置位、那么激活将由外设自动完成、如 ADC 部分所述。 我将要求设计人员进行确认。 感谢您提出问题。

    我假设您在主模式下使用 I2C。 是这样吗? 如果是这种情况、MODCLK 可以工作。

    关于时钟频率的另一个建议、值得为功率预算进行数学运算。 也可以选择:

    在较高频率下仅使用 DCO 作为源、以便在 LPM 期间激活并切换到晶体时能够支持 I2C 数据速率、这会怎么样呢? 较高的 DCO 速度会增加执行期间的电流消耗、但会缩短活动时间、尤其是对于需要执行大量代码的实现。 这在您的案例中是否有意义?

    此致

    Kostas

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

    谢谢、Kostas。

    是的、我们已经讨论了根据需要更改时钟速度、并且可能会在某些时候研究、例如通过 UART 进行固件更新。  对于正常运行、我认为我们必须按照下面的部分将 DCO 速度提高到400kHz。

    I2C 通信不是很频繁、因此我认为节省的电量不会很大、但如果我们最终得到时间和代码空间、这可能是一个很好的优化。

    我想我有我需要的一切。  非常感谢您对此的参与。

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

    Jason、

    感谢您的大力合作。

    如果您有任何疑问、请随时联系论坛。

    此致

    Kostas