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.

[参考译文] MSP430F2619S-HT:USCI A0/B0中断冲突。

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1504435/msp430f2619s-ht-usci-a0-b0-interrupt-conflict

器件型号:MSP430F2619S-HT

工具/软件:

您好:

我正在处理一个项目、其中 USCI A0用于中断驱动的 UART、而 USCI B0用于驱动 I2C 总线。目前我们 不使用中断从 I2C 总线读取/写入、而是使用繁忙等待和轮询。  

而不必过于深入或泄露太多源代码、是否有任何示例可能同时利用 Rx A0/B0的 Tx/USCI 中断? 我怀疑我是否有一个示例文件,我会发现我的工作明显的监督。   

如果没有明显的示例脚本、 我将编辑源代码并将其附加到此处。  

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

    编辑了下游源代码:

    void InitisaliseUART (void)
      UCA0CTL1 |= UCSWRST;
      UCA0CTL0 &=~(UCPEN | UCPAR | UCMSB | UC7BIT |UCSPB | UCMODE_3 | UCSYNC);                             

      P3SEL |=(TXD_PIN + RXD_PIN);
      P1OUT 且=~Ω RS485_RX_EN_PIN;
      P2OUT 且=~Ω RS485_DRV_EN_PIN;
      UCA0CTL1且=~UCSWRST;

      IE2 |=(UCA0TXIE + UCA0RXIE);
    }

    void 初始化 I2C (void)
      UCB0CTL1 = UCSWRST;                
      UCB0CTL0 |=(UCMODE_3 | UCSYNC | UCMST);      
      P3SEL |=(SDA_PIN + SCL_PIN);       
      UCB0CTL1 |= UCSSEL_2;   
      UCB0CTL1且=~UCSWRST;     
    }


    #pragma vector = USCIAB0RX_vector
    __中断无效 USCI_TX_ISR (void)
      if (IFG2 & UCA0TXIFG)    //如果 Tx 缓冲区为空
      {
        //从 Tx 循环缓冲区中弹出一个字节并将其缓存到 UCA0TXBUF
      }
      否则 IF (IFG2 & UCB0TXIFG)
      {
        P5OUT ^= LED3_PIN;
      }
    }

    #pragma vector = USCIAB0TX_vector
    __interrupt void USCI_RX_ISR (void)
      IF (IFG2 & UCA0RXIFG)   //如果 Rx 缓冲器中有字节
      {
         //读取 UCA0RXBUF 中的字节并将其粘在 Rx 循环缓冲区中
      }
      否则 IF (IFG2和 UCB0RXIFG)
      {
        P5OUT ^= LED1_PIN;
      }
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下代码运行时、它通常会卡在 UART Tx ISR 中。 如果我禁用 I2C 中断、UART 将按预期运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >#pragma  vector =  USCIAB0RX_vector
    >__interrupt  void USCI_TX_ISR  (void)
     
    看起来已经向后分配了 Tx/Tx 向量 Rx。 ("vector="适用于紧随其后的函数。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bruce 感谢您花时间回复、感谢 您捕捉到该错误。

    遗憾的是、这是我的疏忽、当我将源代码坚持在此页面上时、我似乎设法引入了该错误。  

    在实际的源代码中、我设法使它们正确无误。

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

    > 如果我禁用 I2C 中断、UART 将按预期运行。

    检查 IFG2:UCB0TXIFG 不会清除它。 (写入 UCA0TXBUF 会清除 UCA0TXIFG。)

    如果您对 I2C UCB0TXIFG 不感兴趣(中断)、则不应该在 IE2中启用它。

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

    您好 Bruce、  

    我感谢持续的支持。  

    因此、该计划是启用 UCB0 Tx/ISR Rx、并让它们将相关字节粘贴到两个新的循环缓冲区中或从这两个新的循环缓冲区中提取。 稍后、我们可以通过事件调度器来处理所述缓冲器中的内容。  

    我只是检查了这些中断例程可以通过切换 GPIO 上的一些 LED 来正确调用。 我想我还有一次监督 、因为 我没有与 UCB0RXBUF 和 UCB0TXBUF 做任何事情、所以我没有提供退出 ISR 的有效方法。 我会做出更改、让您知道我们的票价Slight smile

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

    感谢我的记忆--我回到了 UG [参考第 17.3.7.4节、加上例子17-1和17-2 ]。

    对于 I2C (仅限)、Tx 矢量服务 TXIFG 和 RXIFG;Rx 矢量服务其他(STT、STP、NACK)。

    [只是为了让事情保持活跃。]

    [编辑:添加了对(UG)示例的引用。]

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

    那么、那么多并发症呢? 这是一个令人激动的过程 我实际上没有意识到这种警告,所以感谢预警。  

    我猜在进行"Else  if (IFG2 & UCB0TXIFG)"检查之后需要进行一些额外的检查。  

    在我回来之前、我会先看看文档。 外带为 RTFM。  Sweat smileμ s

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

    我在很多年前就下到了这个兔子洞。 通过深入了解该代码、我可以在共享中断服务例程中看到大量注释。 提醒一下。

    它使用中断进行 I2C 和 UART 发送。

    具有 IV 寄存器的更高版本的 MSP430更适合使用。