【发布时间】:2016-11-21 22:16:53
【问题描述】:
我的 RX 中断工作得很好,但我想添加 TX 中断。我通过 UART 响应长命令,不想浪费周期等待 TX 完成,然后再发送下一个字节。我正在尝试启用中断,传输需要传输的数据,然后禁用中断,直到下一个 TX 数据包出现。
这适用于我发送的第一个有效负载。我看出来就好了。但是,一旦我禁用了一次 TX 中断,我就永远无法再次进入 ISR。如何在 MSP430 上启用 UART 上的 TX 中断并让它再次进入 ISR?
在您看到 EUSCI_A_UART_enableInterrupt 调用的下方,此行不应该在每次启用中断时触发我的 ISR 吗?如果没有,我该如何重新回到 ISR?
这是发送代码:
void UartSendChar(uint8_t tx_char)
{
ring_buffer_put(_rbdTx, &tx_char);
EUSCI_A_UART_enableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT); // Enable interrupt
}
这是我的 ISR:
void EUSCI_A1_ISR(void)
{
int c=-1;
switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
{
case USCI_NONE: break;
case USCI_UART_UCRXIFG:
...
case USCI_UART_UCTXIFG:
// If there's something in the Ring Buffer, transmit it
// If not, then disable TX interrupts until new data gets written.
if (ring_buffer_get(_rbdTx, &c) == 0)
{
EUSCI_A_UART_transmitData(EUSCI_A1_BASE, (uint8_t)c);
}
else
{
EUSCI_A_UART_disableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT);
}
【问题讨论】:
-
是TX中断边沿还是电平触发?在第一种情况下,您必须从主线代码中推送一个字符。