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.

[参考译文] MSP430F2274:Rx 中断冲突

Guru**** 2568565 points
Other Parts Discussed in Thread: MSP430F2274

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1571402/msp430f2274-rx-interrupts-collisions

器件型号:MSP430F2274


工具/软件:

我们在具有两条独立通信总线的应用中使用 MSP430F2274。

  • UCB 上的 I2C
  • UCA 上的 UART

遗憾的是、它们都共享相同的中断矢量、需要对中断标志 IFG2 寄存器进行排序、确定触发中断的是哪个寄存器。

有时、当两个通信通道同时接收一个字节时、我们会发生冲突。 这会导致一些锁定问题和数据丢失。

我正在寻找有关如何处理此问题的建议。

提前感谢、

Gerald

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

    F2 系列 USCI 中断有点迷宫、但我想(?) 这些指标都是明确的。

    您看到了哪种碰撞?

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

    尊敬的 Geral:

    我建议在其中一个通信处于活动状态时禁用另一个通信、反之亦然。

    此致、

    Diego Abad

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

    我希望,如果两者是独立的,那么它应该工作。 但如果维修一个需要对另一个做点事情、则可能会出现问题。 治疗高度依赖于依赖性。

    请记住、当中断得到服务时、GIE 将被清除、但如果需要、您可以在 ISR 中再次进行设置。

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

    I2C 通信 IF 用于板载硬件控制、 UART 用于 RS485 作为从器件。

    我们产品的主要功能要求 RS485 通信 优先于 I2C。

    当 I2C 处于活动状态且 收到 RS485 消息时会发生“冲突“、导致 RS485 消息无响应。  

    David 的答复可能会让人了解要寻找什么。 冲突可能不是问题、但我可能会清除两个中断并无法处理第二个中断。

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

    通过查看 USCIAB0RX_VECTOR 的 ISR、我可以测试设置了哪个位。

    • IFG2 和 UCA0RXIFG(用于 UART)
    • IFG2 和 UCB0RXIFG 用于 I2C。

    处理完每个位后、我们将清除相应的位:

    • IFG2 &=~UCA0RXIFG;用于 UART
    • IFG2 &=~UCB0RXIFG;用于 I2C

    那么、如果这两个位都被设置并且得到 了处理、从而清除了该中断 、另一个中断位仍会触发同一个  USCIAB0RX_VECTOR 以再次触发?

    如果 ISR 正在处理一个通信通道、而另一个通信通道接收到一个字节、会发生什么情况?

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

    任何设置和启用的中断标志都应在 RTI 之后产生另一个中断周期。

    需要注意的一点是、通常不需要按所示清除 RXIFG、因为读取 RXBUF 会自动执行该操作。

    GIE 在中断处理期间被清除、因此如果在 ISR 处于活动状态时触发另一个中断、那么直到从中断返回后才会处理新的中断。 除非您在 ISR 中设置 GIE。

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

    在不知道什么错的情况下,我会抛出一些意见从塑料部门:

    1) 当我看到明确清除 RXIFG 的代码时、它会在我的头部设置警报。 读取 RXBUF 可以雾化清除 RXIFG、因此显式清除它要么太早、要么太晚。 在某些情况下、用户会执行该操作、但这种情况很少见(可能在 ISR 之外)。 此外、编译器通常会生成(据我所知)是原子结构的 BIC、但允许使用读取/修改/写入序列来清除仅在“正确“时间到达的不相关 IFG。

    2) 我避免使用 IV 寄存器、特别是对于 USCI。 这些参数类似于 (1)、加上一些关于(固定)优先级的问题。

    3) I2C 有流控制,但 UART 没有。 在没有其他背景的情况下、我可能会优先考虑 UART。

    4) 一如既往:保持 ISR(路径)非常短。 例如、如果您在处理 I2C 时有一个 UART 字节到达、则在下一个 (UART) 字节到达和溢出之前、您有一个最后期限(根据比特率进行计算)。

    要回答您的问题:如果两个 IFG 都已设置(或者在执行 ISR 时设置了第二个 IFG)、并且您的 ISR 只 会清除一个 IFG、退出后将立即弹回到 ISR 中。 将 ISR 结构化为“ while(任何已设置)“循环是有道理的、但我不确定这是否值得受益。