У меня прерывания RX работают нормально, но я хотел добавить TX прерывания. Я отвечаю на длинные команды над UART и не хочу тратить циклы, ожидающие завершения TX, перед отправкой по следующему байту. Я пытаюсь включить прерывания, передавать данные, которые необходимо передать, затем отключить прерывания, пока не поступит следующий пакет TX.MSP430 Включение/отключение прерывания UART TX
Это прекрасно работает для ПЕРВОГО полезного груза, который я отправляю. Я вижу, что все идет отлично. Однако, как только я отключу TX Interrupts один раз, я больше не могу войти в ISR. Как на MSP430 можно включить TX-прерывания на UART и снова войти в ISR?
Ниже вы видите EUSCI_A_UART_enableInterrupt вызов, не должна ли эта строка запускать мой 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 край прерывания или уровень? В первом случае вам нужно нажать один символ из кода основной линии. – user58697