Буферы приема и передачи данных

 

Регистры TX0 и TX1 являются буферами данных при передаче соответственно через последовательные порты SPORT0 и SPORT1. В эти 32-битные регистры загружаются подлежащие передаче значения либо DMA-контроллером, либо командой, выполняемой процессорным ядром, например:

 

dm(TX0) = R0; /* запись в регистр TX последовательного порта SPORT0 значения из регистра R0 */

 

Каждый TX-регистр функционирует как двухуровневый FIFO-буфер, в котором одновременно могут находиться два слова данных. Когда завершается передача очередного слова из регистра сдвига и в TX-регистре уже находится следующее значение, содержимое буфера автоматически сдвигается в передающий регистр сдвига. При этом может генерироваться прерывание, которое показывает, что буфер TX готов к приему очередного значения от процессорного ядра (состояние "буфер не полон"). Однако прерывания не происходит, если, например, заполнение передающего регистра последовательного порта выполняется с использованием DMA-пересылки.

Возможна ситуация, когда в момент генерации сигнала кадровой синхронизации, означающего начало передачи нового слова, регистр TX не содержит нового слова. В этом случае устанавливается статусный бит потери значимости TUVF в регистре управления передачей STCTLn, соответствующем данному последовательному порту. Этот бит является "липким" и сбрасывается только при запрещении пересылок через SPORTn.

RX-регистр функционирует подобно трехуровневому FIFO-буферу, состоящему из двух регистров данных и приемного регистра сдвига размерностью по 32 бита каждый. При получении всех битов слова в приемном регистре сдвига оно переносится из регистра сдвига во второй регистр данных. При чтении из RX-регистра, выполняемом в очередной инструкции или при DMA-пересылке, слово из второго регистра данных сдвигается в первый регистр данных. Если при завершении приема третьего слова первое слово еще не прочитано из RX-регистра DMA-контроллером или процессорным ядром, третье слово будет записано поверх второго, т.е. произойдет потеря данных. Для отслеживания такой ситуации при приеме последнего бита третьего (последнего) слова, когда оба регистра данных заняты, генерируется "липкий" статусный бит переполнения ROVF в соответствующем регистре управления приемом SRCTLn, который может быть сброшен только запрещением пересылок через последовательный порт.

Прерывание приема данных генерируется в момент, когда в RX-буфер заносится полученное значение (состояние "буфер не пуст"). Прерывания не происходит, если пересылка данных из последовательного порта во внутреннюю память выполняется DMA-контроллером.

Внимание! При попытке записи процессорным ядром слова данных в полный TX-буфер (или чтения ядром пустого RX-буфера) выполнение программы приостанавливается до освобождения TX-регистра (или заполнения RX-регистра). Чтобы избежать этого, перед обращением к буферу необходимо проанализировать значение его статуса ("полон", "пуст", "частично заполнен"). Например:

 

...

R1 = 30; // для записи в TX проверить младший бит статуса

R0 = DM(STCTL0);

BTST R0 BY R1;

IF NOT SZ JUMP(PC, -2); // если =1, значит TX-буфер еще полон

dm(TX0) = R2; // иначе – записать значение

...

 

Статусные биты в регистрах STCTLn и SRCTLn изменяются каждый раз при записи или чтении буфера процессорным ядром, даже если последовательный порт не включен. При записи в RX-буфер или чтении из TX-буфера без передачи данных через порт (для выполнения операций аппаратного компандирования или декомпандирования) соответствующий последовательный порт должен быть запрещен.