工具/软件:
我们在具有两条独立通信总线的应用中使用 MSP430F2274。
- UCB 上的 I2C
- UCA 上的 UART
遗憾的是、它们都共享相同的中断矢量、需要对中断标志 IFG2 寄存器进行排序、确定触发中断的是哪个寄存器。
有时、当两个通信通道同时接收一个字节时、我们会发生冲突。 这会导致一些锁定问题和数据丢失。
我正在寻找有关如何处理此问题的建议。
提前感谢、
Gerald
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。
遗憾的是、它们都共享相同的中断矢量、需要对中断标志 IFG2 寄存器进行排序、确定触发中断的是哪个寄存器。
有时、当两个通信通道同时接收一个字节时、我们会发生冲突。 这会导致一些锁定问题和数据丢失。
我正在寻找有关如何处理此问题的建议。
提前感谢、
Gerald
通过查看 USCIAB0RX_VECTOR 的 ISR、我可以测试设置了哪个位。
处理完每个位后、我们将清除相应的位:
那么、如果这两个位都被设置并且得到 了处理、从而清除了该中断 、另一个中断位仍会触发同一个 USCIAB0RX_VECTOR 以再次触发?
如果 ISR 正在处理一个通信通道、而另一个通信通道接收到一个字节、会发生什么情况?
在不知道什么错的情况下,我会抛出一些意见从塑料部门:
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(任何已设置)“循环是有道理的、但我不确定这是否值得受益。