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.

[参考译文] MSP432P401R:UART 1MHz 获取溢出错误

Guru**** 2586255 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/614109/msp432p401r-uart-1mhz-get-overrun-error

器件型号:MSP432P401R

您好!

需要有关以下问题的帮助。

设置2个 EVA 板一个是 MSP432P401R 另一个是 TI 的 TM4C。

这两个器件都运行稍作修改的 UART 回波示例。 UART 频率1MHz。

TM4C UART 发送器 MSP432是接收器。

TM4C 正在发送256字节的数据包、同时激活 DMA。

MSP432遇到 UART 溢出错误。

我使用 UART freq 运行、一切都好。。。

问题:为了消除接收器侧的 UARToverrun 错误、可以采取哪些措施?

谢谢

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

    让我们运行几个测试、然后我们将返回给您。

    谢谢、

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

    两个发送器板和接收器板之间是否实现了任何形式的流量控制? 请注意、TM4C 器件可能以较高的系统频率运行、从而使其几乎可以连续传输帧、从而使接收器件不堪重负。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Amit

    >两个发送器和接收器板之间是否实现了任何形式的流量控制?

    不确定、你要问什么... 根据定义、DMA 现在意味着流控制、我只需配置通道、而不是启用通道。 DMA 通过中断调用在传输就绪时通知我。

    >请注意,TM4C 器件可能以较高的系统频率运行,从而使其几乎可以连续传输帧,从而使接收器件不堪重负。

    同意... 那么、什么呢? 1MHz UART 频率是合法的、并且在文档中承诺的范围内。 UART 必须能够处理此流。

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

    从 TM4C 器件的角度来看、1Mbps UART 确实处于运行规格范围内、并且应以1Mbps 波特率运行。 但是、在 MSP432P401器件端、即接收器、如果 UART 正在接收数据并正在处理数据、则可能会出现问题。 MSP432P401器件上的 UART 没有与 TM4C 器件类似的 FIFO。 因此、我们接收和处理数据、在 CPU 处理数据时 UART 可能会过度运行。 要克服这种情况、需要实现的是 SW FIFO 和 SW 流量控制

    换句话说、
    步骤1:从 Tx 发送数据到 Rx 时,以预定义字节大小的块(例如32)发送数据。 当这些字节被接收时、Tx 等待来自 Rx 的 ACK 字节。
    步骤2:Rx 处理数据后,仅在完成后才将 ACK 发送回 Tx 模块。

    这将确保 CPU 不会在数据过度运行时受处理的困扰。

    或者、必须在 Rx 侧使用中断来通知 CPU 数据正在通过、应用程序必须确保数据处理不会在中断处理程序中发生。 如果数据处理在中断处理程序中完成、那么 CPU 不能接受下一个中断、因为它仍在中断处理程序中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >步骤1:从 Tx 发送数据到 Rx 时,以预定义字节大小的块(例如32)发送数据

    我尝试过这种方法、即使使用2个字节也无法正常工作。 不要说32

    > Rx 处理数据后,仅在完成后才将 ACK 发送回 Tx 模块。

    它不能在 RX 处理数据步骤中工作... 没有接收到的数据、溢出状态、因此无需确认。 确认

    >这将确保 CPU 在数据超时处理时不会中断。

    抱歉。 不工作。 我使用 UART 尝试了 DMA…… 也没有帮助。

    >或者,必须在 Rx 端使用中断来通知 CPU 数据正在通过  

    很抱歉,我没有得到。 您写的"即将到来"。 您是指32字节块的中间?

    这话什么意思?

    我知道的中断已被接收。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >让我们运行几个测试,然后我们会回来。
    您是否运行了一些测试?

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

    MSP432P401R 器件在接收到第一个字节时会执行什么操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Amit Ashara">您好 Yuliy

     器件在接收到第一个字节时会执行什么操作?

    芯片在固件中的作用我不知道

    但 在我的应用中、没有什么特别的。

    它只是经过修改的回波示例。  一个线程、 再也没有了。

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

    我不确定您在此处所指的是什么固件。 您是否在 SDK 或 DriverLib 上使用 RTOS 环境来开发应用程序代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我同时使用这两者。 创建 tirtos 线程。  iside the tesi prepare dma with driver lib。 但 我无法使用直接中断。 我使用 Hwi 代替。

    这是否合法?

    你没有回答我。

    您是否运行了测试?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然有问题。
    我可以做 UART DMA RX 的裸机示例、UART 高达3、6MHz、正在工作、但仅当我在每个字节之间进行一些小暂停时才有效。
    因此、总速度要慢得多、为700kHz。 我减少暂停之间的字节。 我在 UART 上看到溢出错误。

    你能给我什么建议?
    我在文档中承诺的 UART 速度...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Yuliy、

    您能否发布 MSP432P401R 器件的代码和设置以及用于测试相同器件的设置? 波特率较高并不意味着器件可能能够处理它。 假设情况是、如果接收到的数据必须通过复杂的数学运行(例如 FFT)进行处理、则可能会导致数据丢失。 它允许的是传输数据的最短时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将在5或6小时内发送消息。 稍后、抱歉。

    >波特率较高并不意味着设备可能能够处理它。
    您说设备可能是可以处理的。 您是指 UART 驱动程序? 溢出错误仅来自 UART 驱动程序。
    CPU 在这里什么也不做... 我是对的吗?
    但根据文档、UART 能够以3-5-7 MHz 的速度运行。
    我只是期望文件中承诺的内容。

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

    正如我承诺的那样、这是我在 MSP432上运行的代码。

    正如我说过的、我可以运行频率为3、6 MHz 的 UART、但前提是每个字节之间用小的暂停时间分隔、因此实际上会降低我的整体字节流速度。 从3.6MHz 到700kHz。

    我的经理问我什么、MSP432文档中承诺的只是什么。 他是对的。

    /* DriverLib 包括*/
    #include 
    
    /*标准包括*/
    #include 
    #include 
    
    静态 dma_ControlTable dmaControlTable[8];
    
    静态 void preparedma()
    {
    map_dma_enableModule();
    MAP_DMA_setControlBase (dmaControlTable);
    /*将 DMA 通道0分配给 EUSCI_A0_TX0 *
    MAP_DMA_赋 值通道(DMA_CH0_EUSCIA0TX);
    
    /*设置 TX 传输特性和缓冲器*/
    MAP_DMA_setChannelControl (DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
    MAP_DMA_赋 值中断(INT_DMA_INT1、DMA_CHANNEL 0);
    MAP_DMA_disableInterrupt (INT_DMA_INT1);
    
    /*将 DMA 通道1分配给 EUSCI_A0_RX0 *
    MAP_DMA_赋 值通道(DMA_CH1_EUSCIA0RX);
    /*设置 RX 传输特性和缓冲器*/
    MAP_DMA_setChannelControl (DMA_CH1_EUSCIA0RX | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);
    MAP_DMA_赋 值中断(INT_DMA_INT2、DMA_CHANNEL);
    MAP_DMA_disableInterrupt (INT_DMA_INT2);
    }
    
    静态空 UART_SEND_DMA (char *缓冲区、int n)
    {
    MAP_DMA_setChannelTransfer (
    DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、
    缓冲器、
    (void *) map_spi_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、n);
    
    MAP_DMA_enableInterrupt (INT_DMA_INT1);
    MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
    MAP_DMA_enableInterrupt (INT_DMA_ERR);
    MAP_Interrupt_enableInterrupt (INT_DMA_ERR);
    map_dma_enableChannel (dma_channel_0);
    }
    
    静态空 UART_receive_dma (char * buff、int n)
    {
    MAP_DMA_setChannelTransfer (
    DMA_CH1_EUSCIA0RX | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、
    (void*) map_SPI_getReceiveBufferAddressForDMA (EUSCI_A0_BASE)、
    缓冲器、n);
    MAP_DMA_enableInterrupt (INT_DMA_INT2);
    MAP_Interrupt_enableInterrupt (INT_DMA_INT2);
    MAP_DMA_enableInterrupt (INT_DMA_ERR);
    MAP_Interrupt_enableInterrupt (INT_DMA_ERR);
    map_dma_enableChannel (dma_channel_1);
    }
    
    struct Stat
    {
    uint32_t 时间;
    uint32_t errCnt;
    uint32_t cnt;
    uint8_t num;
    uint8_t indx;
    uint32_t errIndx;
    }stat={0,0,0,1,0};
    
    struct ErrStat
    {
    char soll;
    char ist;
    }errStat ={0};
    
    静态 uint32_t 时间戳;
    静态 bool 接收;
    
    静态 void prepareUART()
    {
    const eUSCI_UART_Config uartConfig =
    {
    EUSCI_A_UART_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
    6、 // BRDIV = 78
    0、 // UCxBRF = 2
    6、 // UCxBRS = 0
    EUSCI_A_UART_ever_parity、 //无奇偶校验
    EUSCI_A_UART_LSB_FIRST、 // LSB 优先
    EUSCI_A_UART_One_stop_bit、 //一个停止位
    EUSCI_A_UART_MODE、 // UART 模式
    0 //过采样
    };
    
    /*在 UART 模式下选择 P1.2和 P1.3 */
    MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、
    GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);
    
    /*将 DCO 设置为24MHz */
    CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 24);
    
    /*配置 UART 模块*/
    MAP_UART_initModule (EUSCI_A0_BASE、uartConfig);
    MAP_UART_selectDeglitchTime (EUSCI_A0_BASE、EUSCI_A_UART_DEGLITCH_TIME_2ns);
    /*启用 UART 模块*/
    MAP_UART_enableModule (EUSCI_A0_BASE);
    MAP_Interrupt_enableMaster();
    }
    
    静态 void prepareTimer()
    {
    MAP_Timer32_initModule (TIMER32_BASE、TIMER32_prescaler_1、TIMER32_32位、
    TIMER32_FREE_RUN_MODE);
    MAP_Timer32_startTimer (TIMER32_BASE、TRUE);
    时间戳= map_Timer32_getValue (TIMER32_BASE);
    }
    
    静态空分析2 (char* buff)
    {
    bool e1 =!(abs (buff [ stat.indx]-stat.num)== 1)&buff [ stat.indx];
    bool E2 =缓冲区[0]+stat.indx!= 128;
    IF (E1 || E2)
    {
    ++stat.errCnt;
    STAT.errIndx = E1? 1:2;
    如果(E1)
    {
    errStat.ist =缓冲区[stat.indx];
    errStat.soll = stat.num +1;
    }
    }
    
    stat.indx =(128>buff [0])? 128-buff [0]:stat.indx;
    ++stat.cnt;
    STAT.num =缓冲区[stat.indx];
    
    uint32_t newTime = map_Timer32_getValue (TIMER32_BASE);
    STAT.TIME =时间戳- newTime;
    时间戳= newTime;
    }
    
    void errAnalyze (char* buff)
    {
    uint8_t e1 =!buff [stat.indx]|| abs (buff [stat.indx]-stat.num)== 1;
    如果(!E1)
    {
    ++stat.errCnt;
    errStat.ist =缓冲区[stat.indx];
    errStat.soll = stat.num + 1;
    stat.indx =(128>buff [1])? 129-缓冲区[1]:stat.indx;
    stat.indx =(stat.indx = 128)? 0:stat.indx;
    STAT.num =缓冲区[stat.indx];
    }
    其他
    {
    STAT.num =缓冲区[stat.indx];
    ++stat.cnt;
    }
    uint32_t newTime = map_Timer32_getValue (TIMER32_BASE);
    STAT.TIME =时间戳- newTime;
    时间戳= newTime;
    }
    int main (void)
    {
    字符缓冲[256];
    uint32_t i;
    MAP_WDT_A_HOLDTimer();
    
    prepareUART();
    preparedma();
    prepareTimer();
    
    /*准备 OSCi */
    _delay_cycles (24000000);
    
    while (1)
    {
    接收= 1;
    UART_Receive_DMA (缓冲区、128);
    while (receive);
    错误分析(缓冲器);
    }
    
    memset (buff、0x00、256);
    对于(i=0;i<128;++I)
    buff [i]= i;
    
    while (1)
    {
    接收= 1;
    ++buff [0];
    UART_SEND_DMA (缓冲区、128);
    while (receive);
    ++stat.cnt;
    _delay_cycles (48);
    }
    }
    
    void dma_int2_IRQHandler (void)
    {
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL);
    接收= 0;
    }
    
    void DMA_INT1_IRQHandler (void)
    {
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL 0);
    接收= 0;
    }
    
    void dma_ERR_IRQHandler (void)
    {
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL);
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL);
    接收= 0;
    }
    
    空 EUSCIA0_IRQHandler (空)
    {
    uint32_t status = MAP_UART_getEnabledInterruptStatus (EUSCI_A0_BASE);
    uint32_t 错误= MAP_UART_queryStatusFlags (EUSCI_A0_BASE、
    EUSCI_A_UART_组 帧错误|
    EUSCI_A_UART_over_error|
    EUSCI_A_UART_parity 错误);
    
    MAP_UART_clearInterruptFlag (EUSCI_A0_BASE、STATUS);
    
    IF (STATUS 和 EUSCI_A_UART_receive_interrupt_FLAG)
    {
    //map_UART_transmitData (eUSCI_A0_BASE、map_UART_receiveData (eUSCI_A0_BASE));
    }
    
    }
    

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

    MSP432P401R 器件的数据源是什么、MSP432P401R 器件的系统时钟设置是什么;请分享相同的信息吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MSP432P401R 设备的数据源是什么?

    EK_TM4C129EXL、运行修改后的 UART DMA 回显示例

    什么是 MSP432P401R 的系统时钟设置

    很抱歉、我不明白我必须为您提供什么系统时钟设置? 我在我的第一篇帖子中向您发送了完整的源代码...

    这话什么意思?

        /* Setting DCO to 24MHz */
        CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);
    至少你可以编译/刷写我的代码并调查所有 CPU 寄存器等你想要的东西..

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

    此外、如果有必要、我还会提供 CS 寄存器的快照。

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

    由于您使用的是具有24MHz 时钟的 UART、因此需要将电压设置为1.4V。 根据器件数据表、只有当 VCORE = 1.4V 时、才能提供24MHz 的 SMCLK。 否则、必须将其缩放至12MHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试了这两种方法

    MAP_PCM_setCoreVoltageLevel (PCM_VCORE0);  

    MAP_PCM_setCoreVoltageLevel (PCM_VCORE01);

    在这两种情况下、UARTRX 频率最大值均为3、6MHz…… 远低于规格中承诺的

    初始化代码

    const eUSCI_UART_Config uartConfig3MHz6 =
    {
    EUSCI_A_UART_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
    6、 // BRDIV
    0、 // UCxBRF
    6、 // UCxBRS
    EUSCI_A_UART_ever_parity、 //无奇偶校验
    EUSCI_A_UART_LSB_FIRST、 // LSB 优先
    EUSCI_A_UART_One_stop_bit、 //一个停止位
    EUSCI_A_UART_MODE、 // UART 模式
    0 //过采样
    };
    
    /*在 UART 模式下选择 P1.2和 P1.3 */
    MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、
    GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);
    
    /*将 DCO 设置为24MHz (升级 Vcore)*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE0);//PCM_VCORE1
    CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 24);
    
    /*配置 UART 模块*/
    MAP_UART_initModule (EUSCI_A0_BASE、&uartConfig3MHz6); 

    抱歉、无法使其在 Rx 频率超过3.6 MHz 时工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RX 溢出几乎始终是软件的函数、而不是硬件的函数。 (理论上)可以通过要求 DMA 执行过多的操作来淹没 DMA、但您在这里不会这样做。 由于 UART 只是一个轮询引擎、因此您不能在某种程度上"溢出"它。

    "修改后的 DMA UART 回波示例"听起来像是发送器正在发送连续流。 这意味着您的软件有(6*10)个时钟--时间不多--可以重新启动 Rx DMA,以便在 UART 超限之前捕获第129个字节。

    我建议您尝试使用循环 DMA 并使用半缓冲区,或者至少重新排序 main()循环,以便在 Rx 完成后立即重新启动 DMA (可能使用不同的缓冲区)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >"修改后的 DMA UART 回波示例"听起来像是发送器正在发送连续流。  

    不连续、发送方发送一个256字节的缓冲区、这正是接收方 UART 的设置。 然后暂停20微秒、然后再次发送缓冲区、

    > 没有多少时间--重新启动 Rx DMA 以捕获第129个字节

    我想20微秒是足够的时间。  

    > Rx 完成后、它会立即重新启动 DMA (可能使用不同的缓冲器)。

    不同的缓冲器、我没有尝试过。 也许... 但我有一种感觉,它不会有所帮助。

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

    更糟糕的是...

    查看发件人端的代码

     while (1){
        对于(i=0;i<128;++I)
        {
          UART_WRITE (UART、&INPUT[i]、1);
        }
        //UART_WRITE (UART、输入、128);
        _delay_cycles (4800);
     

    我确实是在字节后发送一个大字节、以发送一个注释出的呼叫、但在频率超过1MHz 时根本不起作用!!!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想、大于20微秒是足够的时间。

    (20*24)=480个时钟--也许不是。 由于您的"while (receive)"循环正在工作("receive"应声明为"volatile")、我猜您没有使用优化器、因此这些路径可能很长。 如果我要设计一个"靠近边缘"的东西、我将测量每个代码路径。

    >发送器发送256 [SiC]字节的缓冲区、这正是接收器 UART 的设置

    您是否首先启动接收器? 否则、您的块将不会对齐(DMA 将完成中间块)、您将返回到一个非常小的窗口。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大于480个时钟--也许,也许不…… "靠近边缘"

    我将暂停增加到1毫秒、负极。 仍然存在溢出错误

    >是否先启动接收器?

    是的、 我先启动... 作为一个探头、我将暂停时间延长了1秒 运行数十个测试。 负..  

    我在示波器中检查了信号的形状、非常完美。

    我不同意我在边缘附近做一些事情。 边沿将是7MHz……  

    请在您的实验中重复我的代码。 它基本上是带有 DMA 的 UART 回显,但速度有所提高。

    为什么在地球上它拒绝在频率为4 MHz 的频率上工作???

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

    我没有任何 Tivas、我只能找到一个正常工作的 Launchpad、因此我设置您的程序以循环方式、同时充当发送器和接收器。 这将模拟 Amit 建议的模块间暂停协议。

    结果:

    1) 1)示波器显示250ns 位周期、即4Mbps。

    2) 2)我让它运行大约半小时、但我根本看不到任何超限(STATW:OE)。 (我希望任何 OE 实际上都会导致 DMA 在这里挂起、但无论如何我都明确检查了。)

    块之间的(自强加)暂停大约为35uS (-O0)。 其中、大约9us 是您的分析、26us 似乎是 DMA 设置(2倍)。 将其中一半(13us)属性分配给 Rx DMA 设置、这表明您将无法使用连续 Rx 流在~3us 中关闭 Rx DMA。 您可能需要使用循环 DMA 来获得连续 Rx。

    这是我的修改后循环:

    while (1)
    {
    接收= 1;
    #ifBMC
    P2->OUT &=~BIT2;
    #endif
    UART_RECEIVE_DMA (buff、128);
    #ifBMC
    UART_SEND_DMA (txbuf、128);
    #endif
    while (receive);
    #ifBMC
    P2->OUT |= BIT2;
    #endif
    errAnalyze (buff);
    #ifBMC
    IF (EUSCI_A0->STATW 和 EUSCI_A_STATW_OE)
    P2->OUT |= BIT0;
    ++bufcnt;
    if ((bufcnt & 0xff)==1)
    P1->OUT ^= BIT0;
    #endif
    }