Округлить делитель SCI по формуле аппаратуры, настроить вход RX и обработку ошибок FIFO. Добавить диагностические поля и проверки модели, установить 9600 бод для RS485 при Owen. Сохранить скрипт сборки, обновлённый образ прошивки и карту линковки.
98 lines
7.4 KiB
Markdown
98 lines
7.4 KiB
Markdown
# RS232 FIFO для ПМ35 / TMS320F28335
|
||
|
||
Ветка `pm35-uart-fifo`. FIFO включён **только SCI-A / COM_1 / RS232**.
|
||
SCI-B / COM_2 / RS485 сохраняет прежние настройки и обработчики без FIFO.
|
||
Скорости портов не менялись: RS232 115200; RS485 — прежние 57600/115200.
|
||
|
||
`Source/Internal/Include/RS485.h`: `RS232_USE_FIFO=1` по умолчанию.
|
||
Для сборки прежнего пути передачи определить `RS232_USE_FIFO=0`.
|
||
|
||
## Работа
|
||
|
||
- TX заполняет до 16 байт, пополняет при остатке не более 8.
|
||
- После постановки последнего байта порог переключается на 0. Следующее
|
||
прерывание завершает передачу только после пустого FIFO и `TXEMPTY`.
|
||
Ожидание внутри завершающего ISR ограничено остатком последнего символа;
|
||
передача всего FIFO внутри ISR не ожидается.
|
||
- Первый блок ставится в FIFO до разрешения TX-прерывания, под короткой
|
||
IRQ-блокировкой с восстановлением прежнего состояния.
|
||
- Убраны программные задержки перед передачей именно для SCI-A. Данные
|
||
`BM_CHAR32` и упакованный поток `BM_PACKED` сохраняют прежний порядок байтов.
|
||
Нулевая длина не обращается к указателю и не включает передатчик.
|
||
- RX читает накопленные байты из FIFO. Порог 1 сохраняет немедленный приём
|
||
коротких команд и остатка блока. `SCIRXBUF` читается один раз вместе с FE/PE.
|
||
- Ошибка/переполнение аннулирует пакет и `BS_LoadOK`, очищает FIFO. После
|
||
3–4 мс тишины обработчик таймера 1 мс возвращает SCI-A к ожиданию адреса.
|
||
Продолжающийся повреждённый поток продлевает ожидание. CMD_LOAD после
|
||
ошибки требует нового CMD_INITLOAD. Расчёт паузы предназначен для 115200.
|
||
- Счётчики отладчика: `rs_a.fifo_rx_errors`, `rs_a.fifo_overflows`.
|
||
|
||
## Расчёт скорости и диагностика приёма
|
||
|
||
FIFO остаётся включённым. Для SCI используется формула TI SPRUI07:
|
||
`baud = LSPCLK / (8 * (BRR + 1))`. Функция `RS_SetLineSpeed` округляет
|
||
отношение `LSPCLK / (8 * baud)` и вычитает единицу перед записью BRR.
|
||
При LSPCLK 60 МГц и заданных 115200 бод регистры должны содержать
|
||
`SCIHBAUD=0`, `SCILBAUD=64` (`0x40`). Реальная скорость — 115384,6 бод,
|
||
отклонение +0,16 %. Прежнее значение 65 давало 113636,4 бод; сама по себе
|
||
эта разница не доказывает причину наблюдавшегося отказа на плате.
|
||
|
||
GPIO28 настраивается как асинхронный вход SCI-A с подтяжкой к уровню покоя.
|
||
Прерывание RXERROR разрешается во время приёма: BREAK при пустом FIFO
|
||
не может вызвать прерывание по порогу RXFFIL. Во время передачи оно
|
||
отключается вместе с RX FIFO, чтобы ошибка RX не сбрасывала активный TX.
|
||
|
||
Для просмотра в CCS добавлены поля в RAM:
|
||
|
||
| Поле `rs_a` | Назначение |
|
||
|---|---|
|
||
| `fifo_rx_bytes` | Количество прочитанных из FIFO байтов, включая повреждённые |
|
||
| `fifo_rx_last_word` | Последнее слово SCIRXBUF; данные в битах 7:0, FE/PE в битах 15:14 |
|
||
| `fifo_rx_last_status` | SCIRXST последней ошибки до сброса; BREAK/FE/OE/PE в битах 5/4/3/2 |
|
||
| `fifo_rx_last_error_word` | Повреждённое слово FE/PE либо ноль при общей ошибке до чтения FIFO |
|
||
|
||
Смотрите эти поля и отдельные регистры управления. Чтение SCIRXBUF в Watch
|
||
изменяет состояние приёмника; для просмотра данных TI предусматривает
|
||
SCIRXEMU. Описание регистров: [TI SPRUI07](https://www.ti.com/lit/ug/sprui07/sprui07.pdf).
|
||
|
||
Это UART-оптимизация. Она не меняет команды/формат логгера УМП и не подключает
|
||
экспериментальный GAS-логгер. Размеры блоков чтения УМП остаются прежними.
|
||
|
||
## Проверка
|
||
|
||
```powershell
|
||
python tests/rs232_fifo/run_test.py --cc C:/msys64/mingw64/bin/gcc.exe
|
||
```
|
||
|
||
Тест извлекает рабочие функции из `RS485.c`; заменяется только поведение
|
||
аппаратных регистров, ожидание продвижения UART и модель 16-битного char C28x.
|
||
Проверены TX-длины 0/1/2/7/8/15/16/17/31/120/253/400, упакованный блок 8194,
|
||
приём короткого/разделённого пакета и LOAD 8194, FIFO overflow, FE/PE,
|
||
восстановление после тишины, остаток сдвигового регистра и независимость SCI-B.
|
||
|
||
Полная сборка TI C2000 22.6.0.LTS:
|
||
|
||
```powershell
|
||
./build_logger.ps1 -OptimizeForSize -Rs232Fifo 1 `
|
||
-OutputDirectory "$PWD/Bin/Rs232FifoTest" -ImageName PM35_167_rs232_fifo
|
||
./build_logger.ps1 -OptimizeForSize -Rs232Fifo 0 `
|
||
-OutputDirectory "$PWD/Bin/Rs232NoFifoTest" -ImageName PM35_167_rs232_no_fifo
|
||
```
|
||
|
||
| Образ | Размер | Запас до параметров EEPROM |
|
||
|---|---:|---:|
|
||
| FIFO, `-O2 --opt_for_speed=0` | 32158 байт | 350 байт |
|
||
| Без FIFO, те же параметры оптимизации | 31234 байта | 1274 байта |
|
||
|
||
Оба BIN прошли проверку структуры SCI8 и лимита 32508 байт существующим
|
||
`check_firmware.ps1`. Старые `-O1 --opt_for_speed=3` с FIFO превышают лимит;
|
||
для этого варианта обязателен `-OptimizeForSize`. Проверка запрещает выпуск
|
||
слишком большого BIN и не даёт затронуть сохранённые параметры.
|
||
Оптимизация размера применяется ко всей сборке, поэтому временные
|
||
характеристики приложения нужно проверить на стенде.
|
||
|
||
На плату образы не загружены. Пока подтверждены сборка и тесты модели;
|
||
ускорение чтения логгера и устойчивость физического RS232 не измерены.
|
||
Для стенда сравнить одно и то же чтение архива на двух образах, проверить
|
||
CMD_LOAD/UPLOAD и параллельный RS485. FIFO не увеличивает baud rate.
|