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.

[参考译文] LP-MSPM0G3507:UART Tx 中断处理

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398101/lp-mspm0g3507-uart-tx-interrupt-handling

器件型号:LP-MSPM0G3507
主题中讨论的其他器件:MSPM0G3507SysConfig

工具与软件:

大家好!

我使用的是 TI MSPM0G3507电路板。 我已将 UART 配置为正常模式、波特率为19200。

UART 配置:

硬件 FIFO (TX- FIFO 和 RX- FIFO)已禁用并启用 TXINT 和来自 IMASK 寄存器的所有错误中断。

示例:我要通过 UART 发送缓冲区[]={1、2、3、4、5}字节的数据。  

示例代码:

空 Tx_Isr (空)

  UART->TXDATA = buffer[index++];
}

void UART0_IRQHandler (void)

  开关(UART0->CPU_INT.IIDX)
   {
    案例 UART_CPU_INT_IIDX_STAT_TXIFG:
      {
        Tx_Isr ();
        休息;
       }
     案例 UART_CPU_INT_IIDX_STAT_EOT:
      {
        UART0_EOT_CALLBACK ();
        休息;
      }
     默认值:
     {
      休息;
     }
   }
}
最初我收到帧错误和制动错误、然后是
我的 TXINT 只能一次性推送 TX 线上的一个字节"1"。 要从缓冲区发送剩余数据、TXINT 应该会多次出现。
我们是否必须使用 EOT 中断而不是 TXINT?
我在数据表中找不到清晰的信息、并检查了使用 TX 中断传输数据的 MSPM0 SDK 2.00.01.00示例。 请提供帮助。
谢谢。   
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我做什么:

    反向通道 UART 的中断处理程序:

    void UART_0_INST_IRQHandler(void) {
      switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
    
      case DL_UART_MAIN_IIDX_RX:
        RXdata = DL_UART_Main_receiveData(UART_0_INST);
        // DL_UART_Main_transmitData(UART_0_INST, RXdata);
        break;
    
      case DL_UART_MAIN_IIDX_TX:
        if (TXData[TXChar] != '\0') {
          DL_UART_Main_transmitData(UART_0_INST, TXData[TXChar++]);
        } else {
          TXChar = -1;
        }
    
        break;
    
      default:
        break;
      }
    }

    请注意、在 RX 处理程序中添加了注释的代码、我直接从 echo 示例中提取出来。

    Echo 示例适合您吗?

    我如何启动它:

    void StartSerialTX(char *str) {
    
      while (TXChar != -1) {
        // wait for previous tx to finish
        Delay(10);
      }
    
      strcpy(TXData, str);
    
      TXChar = 0;
    
      DL_UART_Main_transmitData(UART_0_INST, TXData[TXChar++]);
    }

    在你的代码中、我看不出你怎么停止了? 似乎它只是在内存发送数据时一直在旋转。

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

    此外,您不需要在 switch ()内使用花括号。 编译器可以自行计算代码流。 它所做的是吸取另一层压痕。

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

    在这里、我们如何停止传输、以及它何时停止? 是否有任何与 EOT (传输结束)中断专门用于传输数据相关的东西?

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

    我从来没有使用过 EOT,你不能使用它,因为它现在不能发送多少数据。

    对您来说、它可以非常简单

    #define bytes_to_send (5)

    和传输中断中:

    if (index < bytes_to_send) //一旦索引达到5、它将停止发送

     tx_isr ();//最好在中断中消除额外的函数调用,只需把代码放在这里。

    }

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

    您好!

    以下是用于通过 EOT 中断发送消息的演示代码。

    e2e.ti.com/.../Touchvsion_5F00_UART_5F00_TX_5F00_interrupt_5F00_C.zip

    此致、

    Zoey

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

    唯一区别是此代码经过测试。 我们不需要启用 TXINT、仅启用 EOT 即可。  

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

    有。

    这用于我们的客户、客户已经对此进行了测试。

    此致、

    Zoey

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

    此示例在 CCS 中工作、我会执行相同操作、但 EOT 中断并不总是出现、因此无法发送整个缓冲区数据。

    EOT 中断就足够了、或者我们是否还需要启用 TXINT。

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

    是的、EOT 就足够了。

    您能发现这种情况会导致 EOT 中断不发生吗? 我的客户和我以前从未见过这种现象。

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

    我在参考手册中可以找到这篇文章、如果我们不使用 FIFO、那么在 TXDATA 寄存器为空时将设置 TXINT。 我想每次发送字节后、我们都应该获得 TXINT。  

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

    现在、EOT 中断将出现、我的中断配置存在一些问题。

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

    #include "ti_msp_dl_config.h"
    
    volatile uint8_t gSendData[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
    uint8_t i=0;
    int main(void)
    {
        NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
        NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
    
        SYSCFG_DL_init();
    
        //Start to transmit
        // DL_UART_transmitData(UART_0_INST,gSendData[i++]);
        while (1) {
            __WFI();
        }
    }
    
    void UART_0_INST_IRQHandler(void)
    {
        switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
            case DL_UART_MAIN_IIDX_TX:
                if(i < 6)
                {
                    DL_UART_transmitData(UART_0_INST,gSendData[i++]);
                }
                else
                    DL_UART_Main_disableInterrupt(UART_0_INST,DL_UART_MAIN_IIDX_TX);
    
                break;
            default:
                break;
        }
    }

    我也试过使用 TXINT、如果我们是 TXINT 而不是 EOT、我们无需首先发送1字节。 它现在正常工作。

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

    TXINT 正在工作。

    我要在 UART 初始化期间启用所有错误中断、我可以在 TX 中断到来之前先看到帧错误和中断错误。 问题可能是什么?

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

    您想要什么错误? 您要检查的错误数据是否错误?

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

    我启用的这些错误中断。

    我最初遇到帧错误和中断错误。 理想情况下、我不应该得到。

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

    好的。

    但发送的数据是错误的(数据可能包含中断错误或帧错误?) 数据  

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

    我没有从我的设备接收任何数据、当前我只是从我的设备发送。 在发送期间、如果我启用了这些错误、我会观察到这些错误。  

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

    这些错误中断仅在接收到错误数据时发生。

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

    大家好、我是使用 TXINT 通过 UART 发送5次0x55数据。 我的第一个字节始终损坏。

    我的第一个字节是0x56、而不是0x55。 问题可能是什么?  

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

    您好!

    存在低异常电压、我认为这可能是由 TXINT 或硬件 干扰导致的。

    此致、

    Zoey

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

    我在使用 CCS 中的代码时没有发现此问题、我在我的环境中使用的代码当时我可以看到此问题、您认为任何引脚配置(推挽/开漏、上拉/下拉)会在 TX/Rx 引脚上导致此问题吗?

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

    您使用哪些引脚并使用了 SysConfig? 也可以将同一个文件复制到 CCS 中进行检查

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

    必需的  

    和以下配置。

    TX-推挽、禁用上拉/下拉。

    RX-推挽、禁用上拉/下拉。

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

    您使用哪种 IDE?

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

    您能否上传您的项目来让我检查一下?

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

    #include "ti_msp_dl_config.h"
    
    volatile uint8_t gSendData[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
    uint8_t i=0;
    int main(void)
    {
        NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
        NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
    
        SYSCFG_DL_init();
    
        //Start to transmit
        // DL_UART_transmitData(UART_0_INST,gSendData[i++]);
        while (1) {
            __WFI();
        }
    }
    
    void UART_0_INST_IRQHandler(void)
    {
        switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
            case DL_UART_MAIN_IIDX_TX:
                if(i < 6)
                {
                    DL_UART_transmitData(UART_0_INST,gSendData[i++]);
                }
                else
                    DL_UART_Main_disableInterrupt(UART_0_INST,DL_UART_MAIN_IIDX_TX);
    
                break;
            default:
                break;
        }
    }

    这里我可以发送一个数据帧、例如:A[]={1、2、3、4、5}发送最后一个字节后、我们将禁用中断。

    如果我想再次发送下一个数据帧、例如:A[]={1、2、3、4、5}、我将启用 Tx-中断、但第二次没有发生 Tx-中断。

    但是、当我写入第一个字节 UART0->TXDATA=a[0]时、然后在 Tx 中断到来之后、我能够推送剩余的数据。

    通常、Tx 中断应在不将第一个字节写入 TXDATA 寄存器的情况下出现。 这会在上电模式下发生、但在运行时模式下则不会发生。

    需要有关此方面的帮助、何时会发生 TXINT 以及它是如何工作的? 参考手册中提及的关于 TXINT 的信息不太清楚。

    谢谢。

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

    您好!

    由于我们之前没有使用过这个中断、我会自行检查并向您更新。

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

    您好!

    根据 用户指南、 如果未启用 FIFO、则在 TXbuffer 为空时触发 TXINT。

    根据您的解释、如果您想发送下一帧、应手动发送第一个数据。

    我已经做了这方面的测试、结果是:

    您必须在前一帧的最后一次数据传输完成前重新启用中断、以便第二个帧将自动进入中断。 简而言之、TXINT 将在数据传输完成后检测是否启用中断以及 TXBuffer 是否为空。 如果同时满足这两个条件、将重新进入 TXINT 中断状态。