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.

[参考译文] TMS320F28386S:UART 中断

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1104046/tms320f28386s-uart-interrupt

器件型号:TMS320F28386S

我将 UART 配置为折页:

GPIO_CMUartInit ();
SCI_performSoftwareReset (SCIA_BASE);
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、57600、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE);
SCI_resetChannels ( SCIA_BASE );
SCI_enableFIFO (SCIA_BASE);
SCI_enableModule ( SCIA_BASE );
SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXFF);
SCI_disableInterrupt (SCIA_BASE、SCI_INT_RXERR);
SCI_setFIFOInterruptLevel (SCIA_BASE、SCI_FIFO_TX0、SCI_FIFO_RX1);
//SCI_performSoftwareReset (SCIA_BASE);
interrupt_register (INT_SCIA_TX、UART_TxInterrupt);
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);
interrupt_clearACKGroup (interrupt_ack_group9);

/*********
*函数名称:UART_TxInterrupt *
*说明:*
(三 /
_interrupt void UART_TxInterrupt (void){
if (UART.Length >= 16){
UART.Length -= 16;
UART.Index += 16;

否则 UART.Length = 0;

if (UART.Length){
SCI_writeCharArray (SCIA_BASE、&UART.pData[UART.Index]、(UART.Length >= 16)? 16:UART.Length );

否则{
PailotCamPosCom_TxFinish();
interrupt_disable (INT_SCIA_TX);

SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);
interrupt_clearACKGroup (interrupt_ack_group9);

/*********
*函数名称:UART_CMGetChar *
*说明:*
(三 /
Result_e UART_SendArray( U16 Length,U8 *pData ){
if (UART.Length) return (RES_IN_Progress);

UART.Index = 0;
UART.Length =长度;
UART.pData = pData;

SCI_writeCharArray (SCIA_BASE、&UART.pData[UART.Index]、(UART.Length >= 16)? 16:UART.Length );

INTERRUPT_ENABLE (INT_SCIA_TX);
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);
interrupt_clearACKGroup (interrupt_ack_group9);

return (RES_SUCCESS);

调用 UART_SendArray 时、即使 FIFO 已满、也会立即中断

我出了什么问题?

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

    您好!

    您当前已将 TX 中断设置为 SCI_FIFO_TX0。 当发送时 FIFO 深度= 0时、将触发此操作。 这可能是您看到这种情况(发送数据后触发 TX ISR)的原因。

    此致、

    Vince

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

    您好!

    我在 以下之后立即获得中断:  

    SCI_writeCharArray (SCIA_BASE、&UART.pData[UART.Index]、(UART.Length >= 16)? 16:UART.Length );

    当 FIFO 长度超过10字节时,我知道它是因为它堆栈在:

    while (SCI_getTxFIFOStatus (base)=SCI_FIFO_TX_15)

    在  SCI_writeCharArray (SCIA_BASE、&UART.pData[UART.Index]、(UART.Length >= 16)内部? 16:UART.Length);在中断中

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

    您好!

    我可能不理解您的问题、因此请在下面更正我的理解:

    *您已将 TX FIFO 深度设置为空时触发(SCI_FIFO_TX0)。

    *当您发送一个字节时、FIFO 会上升到 TX1、然后在字节完成传输时返回到 TX0

    *这会触发 TX 中断。

    以上都是预期的结果。 如果您不希望 TX 在它空闲时触发、则可以将 SCI_FIFO_TX#更改为任何其他数字(例如16)。

    如果我有误解、请告诉我。

    此致、

    Vince

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

    您好!

    当 FIFO 大于一个字节时、我得到一个中断 FIFO 为空  

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

    您好!

     发生这种情况时、您能否提供错误状态寄存器?

    此致、

    Vince