Видимо вновь требуется художественное цитирование User's Guide :) Прерывание USCI при передаче
Флаг прерывания UCAxTXIFG, устанавливаемый передатчиком, показывает готовность регистра UCAxTXBUF к загрузке нового символа. Если установлены биты GIE и UCAxTXIE, то при установке флага UCAxTXIFG генерируется запрос прерывания. Флаг UCAxTXIFG автоматически сбрасывается при записи в регистр UCAxTXBUF.
Флаг UCAxTXIFG устанавливается после сигнала сброса PUC или при UCSWRST = 1. Бит разрешения прерывания UCAxTXIE сбрасывается после сигнала сброса PUC или при UCSWRST = 1.
Прерывание USCI при приёме
Флаг прерывания UCAxRXIFG устанавливается каждый раз при приёме символа и загрузке его в регистр UCAxRXBUF. При установленных битах GIE и UCAxRXIE генерируется запрос прерывания. Биты UCAxRXIFG и UCAxRXIE сбрасываются сигналом системного сброса PUC или при UCSWRST = 1. Флаг UCAxRXIFG автоматически сбрасывается при чтении регистра UCAxRXBUF.
Существует ещё несколько битов, влияющих на возможность генерации прерываний:
* при UCAxRXEIE = 0 символы, принятые с ошибками, не устанавливают флаг UCAxRXIFG;
* при UCDORM = 1 и работе в многопроцессорном режиме символы, не содержащие адреса, не устанавливают флаг UCAxRXIFG. При использовании обычного режима UART ни один принятый символ не вызовет установки флага UCAxRXIFG;
* при UCBRKIE = 1 обрыв связи приведёт к установке бита UCBRK и флага UCAxRXIFG.
Обратите внимание на выделенные предложения. Выделены условия сброса флагов запроса прерываний. Поскольку эти условия у вас не всегда выполняются, то возможно более приоритетное прерывание от приемника не дает вызывать менее приоритетное прерывание от передатчика.
Во-первых, если вы не хотите принимать ошибочно принятые символы, то просто не устанавливайте бит UCRXEIE. Если же обработка ошибок нужна, то регистр UCAxRXBUF следует читать в любом случае. Иначе флаг прерывания не сбросится и прерывание будет вызвано вновь.
Во-вторых, попадание в функцию обработки прерывания от передатчика уже само по себе свидетельствует о том, что его буфер свободен, даже несмотря на то, что возможно идет передача последнего байта. Потому, что у него двойная буферизация. Поэтому ждать в теле функции обработчика готовности UART не нужно. Вообще наличие каких-либо циклов ожидания в прерывании это моветон в программировании. Обработчик прерывания должен быть как можно короче и прерывание должно обрабатываться как можно быстрее.
В-третьих, если программа попала в прерывание от передатчика, но вы ничего на записали в регистр UCAxTXBUF или не сбросили программно бит UCAxTXIFG, то прерывание от передатчика UART будет вызываться повторно. Поэтому, если ничего передавать не нужно, то следует сбросить программно флаг прерывания UCAxTXIFG или запретить прерывание, сбросив UCAxTXIE.