From 13e5bfe373904298e21483c3a1c9b71a1446b39c Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 12 Oct 2026 18:16:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=82=D1=8C=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B8=20CLOCK=20=D0=B8=20DATA=20=D0=BA=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сохранять DATA до спада CLOCK при передаче бита. Закрепить отдельные вызовы DCLK, DOUT, RESET и SENDBIT и прежние настройки оптимизации TI, чтобы сохранить интервалы переключений GPIO при общей сборке с -O3. --- Source/Internal/kanal.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/Source/Internal/kanal.c b/Source/Internal/kanal.c index 1aa3e45..c18b8dc 100644 --- a/Source/Internal/kanal.c +++ b/Source/Internal/kanal.c @@ -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. Начальное значение задаётся справа от знака равенства. */ 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; назначение модуля — последовательный вывод данных канала индикации. */ void DCLK(int x) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ @@ -127,7 +148,7 @@ void RESET() void SENDBIT(int x) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { - /* Вызывает DOUT с аргументами (x); DCLK(1) в текущей последовательности операций. */ + /* Выставляет передаваемый бит DATA до подъёма CLOCK, чтобы данные присутствовали на линии на протяжении импульса такта. */ DOUT(x); DCLK(1); /* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */ #if POWS0>0 @@ -135,12 +156,12 @@ void SENDBIT(int x) DSP28x_usDelay(POWS0); /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif - /* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */ - DOUT(0); - /* Вызывает DSP28x_usDelay с аргументами (POWS0+1) в текущей последовательности операций. */ + /* Удерживает CLOCK высоким при действительном DATA; POWS0+1 сохраняет прежний аргумент цикловой задержки TI из SENDBIT, а не задаёт число микросекунд. */ DSP28x_usDelay(POWS0+1); - /* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */ + /* Сначала опускает CLOCK при ещё действительном DATA; восстанавливает прежний порядок пользователя и сохраняет бит для приёмника, считывающего по спаду. */ DCLK(0); + /* Сбрасывает DATA только после спада CLOCK, чтобы завершающий фронт такта не считывал принудительный ноль вместо единичного бита. */ + DOUT(0); /* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ #if POWS1>0 /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */