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.

[参考译文] MSP430F5438A:有关实现 USCI39#39的问题建议的权变措施

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1109977/msp430f5438a-question-about-implementing-usci39-s-suggested-workaround

器件型号:MSP430F5438A

大家好、TI 论坛、

我正在研究一个需要将 MSP430F5438A 用作 I2C 目标的应用。 因此、勘误表 USCI39适用于我、我需要针对此问题实施变通办法。 建议的权变措施是、"在 GIE 被置位前、禁用 UCSTTIE、UCSTPIE 和 UCNACKIE。 在 GIE 被置位后、本地中断使能标志可被再次置位"。 如果我执行此变通办法、禁用或重新启用 UCSTTIE、UCSTPIE 和 UCNACKIE 的行为是否可能会清除任何未处理的中断或在禁用时防止发生中断标志? 或者、中断标志是否会被保留和/或在 IE 被禁用时仍然有效、并且一旦 IE 被重新启用、一个中断实际上可以被生成和处理?

其次、根据 此论坛帖子、重新启用 IE 寄存器后似乎需要额外的 NOP、这可能取决于 MCU 的运行速度。 在我的应用中、我计划以25MHz 运行、因此如果确实如此、这将是一个好兆。 是否有任何新信息可能表明根据 MCU 速度需要额外多少个 NOP?

最后、同样根据链接的论坛帖子、RETI 指令似乎可以触发此行为。 既然是这样、有人知道一种强制编译器用一系列指令替换 RETI 指令的方法吗?这些指令将禁用 IE 寄存器、启用 GIE、重新启用 IE 寄存器、然后从中断返回?

提前感谢您的任何帮助!

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

    通常、GIE 设置位于系统初始化中。 我建议您先设置 GIE、然后初始化 I2C。 因此您可以解决该问题。

    如果您需要禁用全局中断并在任务激活时间中启用全局中断、请告诉我、那么您需要考虑 USCI39。

    那么"禁用或重新启用 UCSTTIE、UCSTPIE 和 UCNACKIE"的操作只会影响相关的 USCI 外设、不会影响其他外设。

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

    您好、伊斯天、

    感谢您的回复。

    [引用 userid="372580" URL"~μ C/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp430-low-power-microcontroller-forum/1109977/msp430f5438a-question-about -implementing-usci39-s-puggested-workarite/4114078#4114078"]如果您需要在全局中断时启用中断、请考虑启用中断、然后在全局中断服务请求中。]

    这也是我的第一个想法。 但是、我在该代码中使用来自不同模块的中断、并且、正如我从论坛帖子(https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/462451/msp430f5335-crashing)中学到的、只要 MCU 进入中断例程 GIE 被禁用、然后在它离开时重新启用。 因此、通过在代码中简单地使用中断、我就会遇到 USCI39问题。

    [引用 userid="372580" URL"~μ C/support/microcontrollers/msp-low-power-microcontrollers-group/msp430low-power-microcontrollers-forum/1109977/msp430f5438a-question-implementing-uscic39-s-puggested-workarite/414078#4114078"]然后启用 USCSTCIE 或禁用其他外设不会影响相关的操作[引用 UCSTCIE 和 USCI]。

    我的问题没有得到完全回答。 让我用一个示例以不同的方式询问它。

    在周期0中、GIE = 0、UCSTPIE = 1、UCSTTIE = 1、UCSTPIFG = 1、 并且 UCSTTIFG = 0。

    在周期1中、我设置 UCSTPIE = 0且 UCSTTIE = 0。 这是否强制 UCSTPIFG = 0?

    在周期2中、我设置 GIE=1

    在周期3中、我设置 UCSTPIE = 1且 UCSTTIE = 1。 这是否强制 UCSTPIFG = 0?

    我的另一个问题是、如果 GIE = 0、UCSTPIE = 0、UCSTTIE = 0、UCSTPIFG = 1、UCSTTIFG = 0、然后发生 I2C 启动条件、UCSTPIFG 是否会设置为0、即使 GIE、UCSTPIE 和 UCSTTIE = 0、UCSTTIFG 也会= 1?

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

    1.从您给出的链接中查看,如果您使用 muti IRQ 而不控制 IRQ 时序,则为是。 这个问题可能会发生。 但是、从描述中可以看出、GIE 是由软件设置的、这让我有点困惑。 我建议您在实际条件下进行一些测试。 或者、您可以直接控制 IRQ 时序、或者 使用 UCTXIFG、UCRXIFG 代替这两个标志来避免它。

    不 会、它不会强制  UCSTPIFG = 0。 接收 到 START 条件、它将自动 清零该位。

    3.不确定、当您启用 GIE 时、它将进入 IRQ。 它可以在 IRQ 中被清除。 但从硬件方面来说、它不会清除该位。

    4.是的。   UCSTPIE 和 UCSTTIE 用于使能相关中断、  它们与标志设置没有关系。 您甚至可以通过直接使用 while (1)来判断和处理无 IRQ 的状态。