Восстановить тайминги CLOCK и DATA канала индикации

Сохранять DATA до спада CLOCK при передаче бита. Закрепить отдельные вызовы DCLK, DOUT, RESET и SENDBIT и прежние настройки оптимизации TI, чтобы сохранить интервалы переключений GPIO при общей сборке с -O3.
This commit is contained in:
2026-10-12 18:16:54 +03:00
parent 3ebfdca0a0
commit 13e5bfe373

View File

@@ -29,6 +29,27 @@ int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */ /* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */
int readr[5] = {0x08,0x0C,0x10,0x00,0x04}; int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */
#if defined(__TI_COMPILER_VERSION__)
/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */
#pragma FUNC_CANNOT_INLINE(DCLK)
/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */
#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3")
/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */
#pragma FUNC_CANNOT_INLINE(DOUT)
/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */
#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3")
/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */
#pragma FUNC_CANNOT_INLINE(RESET)
/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */
#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3")
/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */
#pragma FUNC_CANNOT_INLINE(SENDBIT)
/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */
#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3")
/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */
#endif
/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */ /* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */
void DCLK(int x) void DCLK(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
@@ -127,7 +148,7 @@ void RESET()
void SENDBIT(int x) void SENDBIT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{ {
/* Вызывает DOUT с аргументами (x); DCLK(1) в текущей последовательности операций. */ /* Выставляет передаваемый бит DATA до подъёма CLOCK, чтобы данные присутствовали на линии на протяжении импульса такта. */
DOUT(x); DCLK(1); DOUT(x); DCLK(1);
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */ /* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS0>0 #if POWS0>0
@@ -135,12 +156,12 @@ void SENDBIT(int x)
DSP28x_usDelay(POWS0); DSP28x_usDelay(POWS0);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif #endif
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */ /* Удерживает CLOCK высоким при действительном DATA; POWS0+1 сохраняет прежний аргумент цикловой задержки TI из SENDBIT, а не задаёт число микросекунд. */
DOUT(0);
/* Вызывает DSP28x_usDelay с аргументами (POWS0+1) в текущей последовательности операций. */
DSP28x_usDelay(POWS0+1); DSP28x_usDelay(POWS0+1);
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */ /* Сначала опускает CLOCK при ещё действительном DATA; восстанавливает прежний порядок пользователя и сохраняет бит для приёмника, считывающего по спаду. */
DCLK(0); DCLK(0);
/* Сбрасывает DATA только после спада CLOCK, чтобы завершающий фронт такта не считывал принудительный ноль вместо единичного бита. */
DOUT(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ /* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0 #if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */