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.

[参考译文] TM4C129ENCPDT:需要有关 EOT 中断的帮助

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1518376/tm4c129encpdt-need-help-with-eot-interrupt

器件型号:TM4C129ENCPDT

工具/软件:

您好:
我在发送结束时触发 Tx 中断时遇到问题。 我使用的是半双工收发器、因此需要在传输完成后立即切换 GPIO、使其开始接收。

以下是我为 UART 设置编写的代码:


UARTTxIntModeSet (UART4_BASE、UART_TXINT_MODE_EOT);
UARTIntClear (UART4_BASE、UART_INT_TX | UART_INT_RX | UART_INT_RT);
UARTEnable (UART4_BASE);
UARTConfigSetExpClk (UART4_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_ODD));
UARTFIFOEnable (UART4_BASE);

以下是发送数据的函数:

void ModbusVFD::RequestData (uint16_t 地址){
GPIOPinWrite (GPIO_PORTK_BASE、 GPIO_PIN_2、GPIO_PIN_2);//在发送之前打开 GPIO
uint8_t 缓冲器[8];
Buffer[0]= 0x01;//从器件地址
Buffer[1]= 0x03;//函数代码:读取保持寄存器
Buffer[2]=(地址>> 8);//寄存器地址的高字节
Buffer[3]=(地址和0xFF);//寄存器地址的低字节
Buffer[4]= 0x00;//要读取的地址数的高字节
Buffer[5]= 0x01;//要读取的地址数的低字节
uint16_t calculatedChecksum =
computeChecksum (buffer);//与请求一起发送的计算校验和
Buffer[6]=(calculatedChecksum >> 8);//计算出的校验和的高字节
Buffer[7]=(calculatedChecksum & 0xFF);//计算出的校验和的低字节
UARTSend (缓冲器、8);
task_sleep(consts_--> sleepTime);

下面是辅助函数 UARTSend()

Void
UARTSend (const uint8_t *pui8Buffer、uint32_t ui32Count)

//
//在有更多字符发送时循环。
//
while (ui32Count-)

//
//将下一个字符写入 UART。
//
UARTCharPutNonBlocking (UART4_BASE、*pui8Buffer++);
}
UARTIntEnable (UART4_BASE、UART_INT_TX);
}

中断连接到 ISR UartTxCallback、如下所示:

extern "C" void UartTxCallback (void){
GPIOPinWrite (GPIO_PORTK_BASE、GPIO_PIN_2、0);
UARTIntDisable (UART4_BASE、UART_INT_TX);
}

我看到的是、中断在发送每个字节后触发。 实际上、我希望它只在完成传输后触发一次。 我看到此代码的行为是 GPIO 通电、然后在第一个字节之后断电。 我还看到 UARTCTL 寄存器中设置了 EOT 位、因此我不确定这里会出现什么问题。

对此问题的任何帮助都将得到深切的感谢。

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    UARTConfigSetExpClk (UART4_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_ODD);
    [/报价]

    您好、

     我注意到您在上述调用中传递 SysCtlClockGet ()参数有误。  SysCtlClockGet 是仅用于 TM4C123 MCU 的 API。 请使用 SysCtlClockFreqSet ()的返回值作为 UART 时钟源。 请参阅以下示例。  

    G_ui32SysClock = MAP_SysCtlClockFreqSet (SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SysCtl_USE_PLL |
    SYSCTL_CFG_VCO_240)、120000000);

    UARTConfigSetExpClk (UART4_BASE、g_ui32SysClock、 115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_ODD));

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

    您好 Charles、
    一如既往,非常感谢您的帮助。 这使我的波特率不正确、UART 消息不可读。  
    我解决了这个问题、所以现在邮件看起来很好。  
    但是、这一特定问题仍未得到解决。 在发送每个字节时触发中断。

    我在 ISR 中添加了代码、以检查是否是要发送的最后一个字节、因此可以关闭使能引脚、这似乎可以正常工作。
    但我不明白为什么 EOT 位不起作用。 我已经准确地设置了数据表要求我进行设置的方式。 尽管此权变措施可以解决问题、但仅在 EOT 上触发中断会更干净、更好。

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

    您好、

    如果要发送数据、例如10个字节的数据、则 EOT 中断将生成10次。 传输结束表示一个给定帧上最后一位的结束、而不是最后一个字节的末尾(例如不是第10个字节的末尾)

    传输结束(EOT)中断表示数据已完全传输
    并且仅对主模式器件/操作有效。 此中断可用于指示时间
    关闭 QSSI 模块时钟或进入睡眠模式是安全的。 此外、因为已传输
    数据和接收到的数据在同一时间完成、中断也可以指示该读取
    数据立即就绪、无需等待接收 FIFO 超时周期完成。


    注释 :仅在 Freescale SPI 模式下,可以在生成 EOT 中断的情况下创建一个条件
    对于每个传输的字节、即使 FIFO 已满也是如此。 如果 n ü μDMA 已配置为
    使用外部环回将数据从该 QSSI 传输到器件上的主 QSSI
    即使 FIFO 已满、QSSI 从器件为每个字节生成 EOT 中断。