Форматы данных, передаваемых через последовательные порты
Форматы слов данных, передаваемых через последовательный порт, определяются битами DTYPE, SENDN, SLEN и PACK в регистрах STCTLn и SRCTLn.
Длина слова, передаваемого или принимаемого через последовательный порт, задается 5‑битовым полем SLEN, в которое заносится количество разрядов в слове, уменьшенное на 1. Поле SLEN не может быть меньше 2 (длина слова не менее 3 бит). Слова длиной менее 32-х разрядов выравниваются по правому краю в регистрах RX и TX.
Принимаемые данные размерностью 16 битов и менее могут упаковываться в 32-битные слова, а передаваемые 32-битные слова могут выводиться как два 16-битных слова. Если бит PACK=1 в регистре SRCTLn, два последовательно принятых слова упаковываются в одно, причем первое принятое слово будет находиться в младших 16 битах, а второе – в старших 16 битах. Оба слова будут выровнены к правым границам своих полей. При передаче данных распаковка выполняется аналогично (если установлен бит PACK в регистре STCTLn). В этом случае прерывания по приему или передаче слова генерируются для 32-битного слова, а не для каждого 16-битного слова.
Внимание! Режим с упаковкой данных целесообразно использовать для снижения загрузки I/O-шины, поскольку в этом случае за одну пересылку передается два 16-разрядных слова. При этом каждая половинка упакованного 32-битного слова, полученного через последовательный порт и записанного в пространство памяти нормальных адресов, может быть доступна через пространство памяти коротких адресов.
Поле DTYPE задает один из четырех форматов данных, которые могут быть переданы через последовательный порт.
Значение DTYPE | Формат данных |
в одноканальном режиме | |
выравнивание вправо, неиспользуемые биты равны 0 | |
выравнивание вправо, знаковое расширение | |
компандирование по m-закону | |
компандирование по А-закону | |
в многоканальном режиме | |
x0 | выравнивание вправо, неиспользуемые биты равны 0 |
x1 | выравнивание вправо, знаковое расширение |
0x | компандирование по m-закону |
1x | компандирование по А-закону |
Эти форматы применяются к данным, находящимся в TX- и RX-регистрах.
Примечание. Для многоканального режима выбор типа компандирования и заполнение старших битов устанавливается независимо друг от друга. В этом случае передача значений в линейном формате осуществляется, когда канал активен и режим компандирования для данного канала в регистре MTCCSx или MRCCSx выключен (см. ниже). Режим знакового расширения (нулем или знаковым битом) одинаков для всех каналов при приеме и для всех каналов при передаче и определяется младшим битом поля DTYPE. Если включен режим знакового расширения, то оно выполняется только для тех каналов, для которых не включено компандирование. В противном случае старшие биты слов будут заполнены нулями.
Запись в TX-регистры 32-битного значения приводит к его компрессии до 8-битового значения, расширенному со знаком до длины слова, подлежащего передаче. Если исходное 32-битное значение больше максимально допустимого при компандировании по А- или m-закону (соответственно максимального 14-разрядного и 13-разрядного значения), оно преобразуется в максимально возможное значение с учетом знака.
Аналогично, при приеме через последовательный порт в режиме компандирования получаемые 8-битные данные декомпандируются и записываются в 32-разрядный RX-регистр со знаковым расширением.
Аппаратные схемы компандирования и декомпандирования могут быть использованы и без передачи или получения данных через последовательный порт, например в целях тестирования или отладки программы.
... // передача через порт должна быть запрещена
R0 = 0x0000000; // разрешить компандирование
dm(STCTL0) = R0; // записать значение в регистр управления SPORT0
dm(TX0) = R1; // записать исходное 32-битное значение в TX0
nop; // 1 такт чтобы новое значение перезаписалось в TX0
R1 = dm(TX0); // прочитать 8-битовое компандированное значение
...
Аналогичная последовательность действий применяется для выполнения аппаратного декомпандирования без передачи через последовательный порт, но в этом случае необходимо использовать RXn-регистр.