2016-11-21 2 views
0

У меня прерывания 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); 
     } 
+0

ли срабатывает TX край прерывания или уровень? В первом случае вам нужно нажать один символ из кода основной линии. – user58697

ответ

2

я понял проблему. В этом конкретном MSP430, когда вектор прерывания считывается и он показывает прерывание TX, бит TXIFG автоматически очищается микро. (Как это славно)

Чтобы снова запустить этот ISR после повторного включения TX-прерываний, бит TXIFG должен быть вручную снова установлен на 1, что показывает ожидающее прерывание. Таким образом, когда прерывания разрешены после того, как данные вбиты в очередь, бит TXIFG установлен, поэтому ISR выполняет и выдает данные.

Теперь мой 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); 

      // Set TXIFG manually back to 1 for next time. 
      HWREG16(EUSCI_A1_BASE + OFS_UCAxIFG) |= EUSCI_A_UART_TRANSMIT_INTERRUPT; 

     } 
Смежные вопросы