В мане по SAM7S:
SSC Status Register - SSC_SR
ENDTX: End of Transmission
0: The register SSC_TCR has not reached 0 since the last write in SSC_TCR or SSC_TNCR.
1: The register SSC_TCR has reached 0 since the last write in SSC_TCR or SSC_TNCR.
Т.е. Прерывание возникает при опустошении буфера, скормленного ранее каналу ПДП (PDC) этого модуля. При этом неважно, какой буфер опустел, первый (PDC_TCR == 0) или второй (PDC_TNCR == 0). Мне больше нравится прерывание TXBUFF - ставится только при опустении первого буфера. Если во второй буфер что-то сунуть при пустом первом, и адрес, и длина немедленно проваливаются в первый канал ПДП. А вообще, с УСАРТом я поступал так: скормил данные в PDC, разрешил прерывание TXBUFF. В прерывании по TXBUFF запретил его, поднял флаг - пакет ушел. А если не запретить - да, все время будешь болтаться в прерывании.
В данном случае напрашивается следующий вариант:
- есть два буфера, работающих по очереди. Пока PDC выгребает данные из одного - набиваем второй, и наоборот.
Инициализация:
- заполнили первый буфер; чтобы не усложнять - в ПДЦ данные не отдаем;
- разрешили ПДП на передачу;
- разрешили прерывание TXBUFF.
Работа:
- ждем прерывания TXBUFF;
- в прерывании скормили первому каналу ПДП очередной буфер (флаг TXBUFF опустится), поменяли роли буферов - пока из текущего передаются данные, набиваем следующий;
- опять ждем прерывания TXBUFF; и т.д...
По запрету вывода звука можно просто обнулить регистр счетчтика передачи ПДП (PDC_TCR), и он умолкнет. При этом, после разрешения можно будет начать с того же места (снятие с паузы).
Извиняюсь, что немного сумбурно - без малого два ночи, а жена у родителей

Поэтому -

и