Files
Balsam_167/Doc/RS232_FIFO.md
Andrey 3ebfdca0a0 Исправить скорость SCI и добавить диагностику ошибок приёма RS232
Округлить делитель SCI по формуле аппаратуры, настроить вход RX и обработку ошибок FIFO. Добавить диагностические поля и проверки модели, установить 9600 бод для RS485 при Owen. Сохранить скрипт сборки, обновлённый образ прошивки и карту линковки.
2026-10-12 16:44:51 +03:00

7.4 KiB
Raw Blame History

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.

Это UART-оптимизация. Она не меняет команды/формат логгера УМП и не подключает экспериментальный GAS-логгер. Размеры блоков чтения УМП остаются прежними.

Проверка

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:

./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.