Files
Balsam_167/Source/Internal/RS485.c
Andrey 1e911e5250 Обновить логгер УМП и исправить запуск UART и EEPROM
Перейти на компактные 12-словные записи v4 и сохранять 10 процентов банка после отключения. Добавить трёхсекундное ожидание роста ЗПТ и настраиваемый лимит пусков. Явно инициализировать состояние UART и гарантировать публикацию параметров EEPROM перед запуском Timer2. Сохранить воспроизводимые сборки, регрессионные проверки, документацию и обновлённые результаты сборки; исключить временные артефакты.
2026-10-12 12:25:41 +03:00

1220 lines
104 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. Русские пояснения сохранены в UTF-8. */
//#include "big_dsp_module.h"
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h"
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
#include <string.h> /* Объявляет memset для явного сброса UART: загрузчик COFF не гарантирует очистку .ebss. */
/* Подключает "bios_dsp.h": коды и объявления команд последовательного загрузчика. */
#include "bios_dsp.h"
/* Подключает "cntrl_adr.h": собственный и универсальный адрес устройства. */
#include "cntrl_adr.h"
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h"
//#include "flash_tools.h"
/* Объявляет rs_a — данные rs_a; rs_b — данные rs_b. */
RS_DATA rs_a,rs_b;
/* Объявляет RS_Len — таблица ожидаемых длин команд последовательного протокола. Начальное значение задаётся справа от знака равенства. */
unsigned int RS_Len[70]={0};
/* Объявляет size_cmd15 — размер cmd 15. Начальное значение задаётся справа от знака равенства. */
static char size_cmd15=1;
/* Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
void RS_RX_Handler(RS_DATA *rs_arr);
/* Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
void RS_TX_Handler(RS_DATA *rs_arr);
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Запускает передачу через FIFO COM_1 после проверки буфера и состояния текущего обмена. */
static int RS_FifoStart(RS_DATA *, unsigned int *, unsigned long, int);
/* Заполняет TX FIFO доступными байтами, сохраняя длину и положение в передаваемом пакете. */
static void RS_FifoTx(RS_DATA *);
/* Прерывает ошибочный приём FIFO, очищает аппаратное состояние и включает защитную паузу. */
static void RS_FifoAbort(RS_DATA *);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/** Обработчик прерываний UART - принато */
/* Объявляет обработчик RSA_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSA_RX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG91; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG91; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_a);. */
clear_timer_rs_live(&rs_a);
/* Вызывает RS_RX_Handler. Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
RS_RX_Handler(&rs_a);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Объявляет обработчик RSB_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSB_RX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG93; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG93; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_b);. */
clear_timer_rs_live(&rs_b);
/* Вызывает RS_RX_Handler. Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
RS_RX_Handler(&rs_b);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Объявляет обработчик RSA_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSA_TX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG92; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG92; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_a);. */
clear_timer_rs_live(&rs_a);
/* Вызывает RS_TX_Handler. Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
RS_TX_Handler(&rs_a);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Объявляет обработчик RSB_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSB_TX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG94; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG94; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_b);. */
clear_timer_rs_live(&rs_b);
/* Вызывает RS_TX_Handler. Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
RS_TX_Handler(&rs_b);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Обработчик прерываний UART - принато */
/* Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
void RS_RX_Handler(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Rc — данные Rc. */
char Rc;
/* Объявляет RS_BytePtr — данные RS_BytePtr. */
char RS_BytePtr;
// led1_on();
/* Цикл for(;;); задаёт начальное значение, условие продолжения и шаг перебора. */
for(;;) // 'goto' это не оператор азыка С
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) {
/* Объявляет received — данные received. */
unsigned int received;
/* Проверяет if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF или rs_arr->SciRegs->SCIRXST.bit.RXERROR); последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF || rs_arr->SciRegs->SCIRXST.bit.RXERROR) {
/* Вызывает RS_FifoAbort. Прерывает ошибочный приём FIFO, очищает аппаратное состояние и включает защитную паузу. */
RS_FifoAbort(rs_arr); return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (!rs_arr->SciRegs->SCIFFRX.bit.RXFFST); последующий оператор выполняется только при истинном условии. */
if (!rs_arr->SciRegs->SCIFFRX.bit.RXFFST) {
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Завершает RS_RX_Handler без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
received=rs_arr->SciRegs->SCIRXBUF.all; /* one pop, data + FE/PE */ /* Записывает received значением rs_arr->SciRegs->SCIRXBUF.all; данные received. */
/* Проверяет if (received & 0xC000U); последующий оператор выполняется только при истинном условии. */
if (received & 0xC000U) { RS_FifoAbort(rs_arr); return; }
/* Проверяет if (rs_arr->fifo_rx_guard); последующий оператор выполняется только при истинном условии. */
if (rs_arr->fifo_rx_guard) { rs_arr->fifo_rx_guard=4; continue; }
/* Записывает Rc значением received & 255U; данные Rc. */
Rc=received & 255U;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY); последующий оператор выполняется только при истинном условии. */
if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY) // Receiver ready flag
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
/* Завершает RS_RX_Handler без возвращаемого значения. */
return; // кстати это единственный выход из прерываниа
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Rc значением rs_arr->SciRegs->SCIRXBUF.bit.RXDT; данные Rc. */
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // Читаем символ в любом случае
/* Проверяет if(rs_arr->SciRegs->SCIRXST.bit.RXERROR); последующий оператор выполняется только при истинном условии. */
if(rs_arr->SciRegs->SCIRXST.bit.RXERROR) // Receiver error flag
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 0; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=0; // Reset SCI
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 1; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(rs_arr->RS_DataReady) continue; последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_DataReady) continue; // Не забрали данные
/* Проверяет if (rs_arr->RS_Flag9bit==1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Flag9bit==1) // дла RS485????????
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Инициализируем переменные и флаги
/* Записывает rs_arr->RS_FlagBegin значением true; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = true; // Ждем заголовок
/* Записывает rs_arr->RS_RecvLen значением 0; данные rs_arr->RS_RecvLen. */
rs_arr->RS_RecvLen = 0;
/* Записывает rs_arr->RS_FlagSkiping значением false; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = false;
/* Записывает rs_arr->RS_HeaderCnt значением 0; данные rs_arr->RS_HeaderCnt. */
rs_arr->RS_HeaderCnt = 0;
/* Записывает rs_arr->RS_Cmd значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(rs_arr->RS_FlagSkiping) continue; последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_FlagSkiping) continue; // Не нам
/* Проверяет if (rs_arr->RS_FlagBegin); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_FlagBegin) // Заголовок
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if (rs_arr->RS_HeaderCnt==0); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt==0) // Адрес контроллера или стандартнаа команда
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if( (Rc == CNTRL_ADDR_UNIVERSAL) или (Rc == CNTRL_ADDR и CNTRL_ADDR!=0) или ((Rc == rs_arr->addr_answer) и rs_arr->flag_LEADING); последующий оператор выполняется только при истинном условии. */
if( (Rc == CNTRL_ADDR_UNIVERSAL) || (Rc == CNTRL_ADDR && CNTRL_ADDR!=0) || ((Rc == rs_arr->addr_answer) && rs_arr->flag_LEADING)
/* Продолжает список аргументов, полей или выражение || ((Rc == ADDR_FOR_ALL && ADDR_FOR_ALL!=0) && !rs_arr->flag_LEADING)); порядок элементов сохраняется. */
|| ((Rc == ADDR_FOR_ALL && ADDR_FOR_ALL!=0) && !rs_arr->flag_LEADING))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->addr_recive значением Rc; данные rs_arr->addr_recive. */
rs_arr->addr_recive=Rc; // запомнили адрес по которому нас запросили
/* Записывает rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] значением Rc; данные rs_arr->RS_Header. */
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Первый байт
/* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,8); // перестроились в 8-бит режим
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true; // Не нашему контроллеру
/* Записывает rs_arr->RS_FlagBegin значением false; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = false; // остались в 9-бит режиме
// led1_off();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] значением Rc; данные rs_arr->RS_Header. */
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Второй байт и т.д.
/* Проверяет if (rs_arr->RS_HeaderCnt == 7 и rs_arr->RS_Cmd==CMD_MODBUS_16 и !rs_arr->flag_LEADING); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt == 7 && rs_arr->RS_Cmd==CMD_MODBUS_16 && !rs_arr->flag_LEADING)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает RS_Len[CMD_MODBUS_16] значением (10+Rc); таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_16] = (10+Rc);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (rs_arr->RS_HeaderCnt == 3); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt == 3)
/* Проверяет if (rs_arr->RS_Cmd == ANS_MODBUS_4); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Cmd == ANS_MODBUS_4)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает RS_Len[rs_arr->RS_Cmd] значением Rc + 5; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[rs_arr->RS_Cmd] = Rc + 5;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// если второй байт - это команда
/* Проверяет if (rs_arr->RS_HeaderCnt == 2); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt == 2)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_Cmd значением Rc; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd = Rc;
// Проверка длины посылки
// CMD_LOAD - младшаа на данный момент
// CMD_STD_ANS - старшаа на данный момент
/* Проверяет if ((rs_arr->RS_Cmd < CMD_MODBUS_3) или (rs_arr->RS_Cmd > CMD_STD_ANS) или (RS_Len[rs_arr->RS_Cmd]<3); последующий оператор выполняется только при истинном условии. */
if ((rs_arr->RS_Cmd < CMD_MODBUS_3) || (rs_arr->RS_Cmd > CMD_STD_ANS) || (RS_Len[rs_arr->RS_Cmd]<3)
/* Продолжает список аргументов, полей или выражение || ((rs_arr->RS_Cmd == CMD_LOAD)&&(rs_arr->RS_PrevCmd != CMD_INITLOAD)); порядок элементов сохраняется. */
|| ((rs_arr->RS_Cmd == CMD_LOAD)&&(rs_arr->RS_PrevCmd != CMD_INITLOAD))
/* Продолжает список аргументов, полей или выражение ); порядок элементов сохраняется. */
)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
/* Записывает rs_arr->RS_HeaderCnt значением 0; данные rs_arr->RS_HeaderCnt. */
rs_arr->RS_HeaderCnt = 0; // Потому что команда не та
/* Записывает rs_arr->RS_FlagBegin значением true; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = true;
/* Записывает rs_arr->RS_FlagSkiping значением false; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = false;
/* Записывает rs_arr->RS_Cmd значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd=0;
// led1_off();
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (rs_arr->RS_Cmd == CMD_LOAD); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Cmd == CMD_LOAD) // Дла этой команды заголовок очень короткий
/* Записывает rs_arr->RS_FlagBegin значением false; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = false;// дальше идут данные
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) или; последующий оператор выполняется только при истинном условии. */
if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) ||
/* Продолжает список аргументов, полей или выражение (rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header))); порядок элементов сохраняется. */
(rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header)))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{ // Получили заголовок
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
/* Записывает rs_arr->RS_FlagBegin значением false; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = false;
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true;
/* Записывает rs_arr->RS_DataReady значением true; rs arr RS данные Ready. */
rs_arr->RS_DataReady = true;
/* Записывает rs_arr->RS_Cmd значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd=0;
// led1_off();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } }
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else // Поток данных
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(rs_arr->pRS_RecvPtr<(unsigned int *)Rec_Bloc_Begin или rs_arr->pRS_RecvPtr>(unsigned int *)Rec_Bloc_End); последующий оператор выполняется только при истинном условии. */
if(rs_arr->pRS_RecvPtr<(unsigned int *)Rec_Bloc_Begin || rs_arr->pRS_RecvPtr>(unsigned int *)Rec_Bloc_End)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->pRS_RecvPtr значением (unsigned int *)Rec_Bloc_Begin; данные rs_arr->pRS_RecvPtr. */
rs_arr->pRS_RecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
/* Записывает rs_arr->pRecvPtr значением (unsigned int *)Rec_Bloc_Begin; данные rs_arr->pRecvPtr. */
rs_arr->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // Мы здесь оказались по какой-то чудовищной ошибке
/* Проверяет if(rs_arr->RS_DataReady); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_DataReady) // Если данные в основном цикле не забраны,
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{ // то пропускаем следующую посылку
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
// led1_off();
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает RS_BytePtr значением rs_arr->RS_RecvLen++ % 2; данные RS_BytePtr. */
RS_BytePtr = rs_arr->RS_RecvLen++ % 2;
/* Проверяет if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; последующий оператор выполняется только при истинном условии. */
if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Получили слово
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else *rs_arr->pRS_RecvPtr = Rc<<8;
/* Проверяет if(rs_arr->RS_Length <= rs_arr->RS_RecvLen); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_Length <= rs_arr->RS_RecvLen) // Конец посылки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_PrevCmd значением rs_arr->RS_Header[1] = CMD_LOAD; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = rs_arr->RS_Header[1] = CMD_LOAD;
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9); // Получили все данные перестроились в 9-бит дла RS485?
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
/* Записывает rs_arr->RS_DataReady значением true; rs arr RS данные Ready. */
rs_arr->RS_DataReady = true; // Флаг в основной цикл - данные получены
// led1_off();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } } }
/** Обработчик прерываний UART - послано */
/* Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
void RS_TX_Handler(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) { RS_FifoTx(rs_arr); return; }
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Объявляет RS_BytePtr — данные RS_BytePtr. */
char RS_BytePtr;
// unsigned int i;
/* Проверяет if(rs_arr->RS_SendBlockMode == BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendBlockMode == BM_CHAR32)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */ /* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает SCI_send с аргументами (rs_arr,*(rs_arr->pRS_SendPtr++)) в текущей последовательности операций. */
SCI_send(rs_arr,*(rs_arr->pRS_SendPtr++));
/* Проверяет if(rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/ /* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); /* режим приема RS485 */ /* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
rs_arr->flag_TIMEOUT_to_Send=false; /* сбросили флаг ожиданиа таймаута */ /* Записывает rs_arr->flag_TIMEOUT_to_Send значением false; rs arr флаг TIMEOUT to Send. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else /* BM_PACKED */ /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает RS_BytePtr значением (rs_arr->RS_SendLen++) % 2; данные RS_BytePtr. */
RS_BytePtr = (rs_arr->RS_SendLen++) % 2;
/* Проверяет if(rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */ /* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) )); последующий оператор выполняется только при истинном условии. */
if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) ));
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else SCI_send(rs_arr, HIBYTE( *rs_arr->pRS_SendPtr ));
/* Проверяет if(rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
// RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/
// RS_Line_to_receive(); /* режим приема RS485 */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
// rs_arr->SciRegs->SCIFFTX.bit.TXINTCLR=1; // Clear INT flag
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Инициализациа массива длин команд */
/* Начинает функцию setup_arr_cmd_length; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void setup_arr_cmd_length()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
int i;
/* Цикл for (i=0;i<70;i++) RS_Len[i]=i;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<70;i++) RS_Len[i]=i;
/* Записывает RS_Len[CMD_LOAD] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_LOAD] = 12;
/* Записывает RS_Len[CMD_UPLOAD] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_UPLOAD] = 12;
/* Записывает RS_Len[CMD_RUN] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_RUN] = 8;
/* Записывает RS_Len[CMD_XFLASH] значением 9; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_XFLASH] = 9;
/* Записывает RS_Len[CMD_TFLASH] значением 16; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_TFLASH] = 16;
/* Записывает RS_Len[CMD_PEEK] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_PEEK] = 8;
/* Записывает RS_Len[CMD_POKE] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_POKE] = 12;
/* Записывает RS_Len[CMD_INITLOAD] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_INITLOAD] = 12;
/* Записывает RS_Len[CMD_INIT] значением 5; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_INIT] = 5;
/* Записывает RS_Len[CMD_VECTOR] значением size_cmd15-2; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_VECTOR] = size_cmd15-2; //sizeof(CMD_TO_TMS)-2;
/* Записывает RS_Len[CMD_STD] значением size_cmd15-1; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_STD] = size_cmd15-1; //sizeof(CMD_TO_TMS)-1;
/* Записывает RS_Len[CMD_IMPULSE] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_IMPULSE] = 8;
/* Записывает RS_Len[CMD_MODBUS_3] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_3] = 8;
/* Записывает RS_Len[ANS_MODBUS_4] значением 3+48*2+2; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[ANS_MODBUS_4] = 3+48*2+2;
/* Записывает RS_Len[CMD_MODBUS_6] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_6] = 8;
/* Записывает RS_Len[CMD_MODBUS_16] значением 13; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_16] = 13;
/* Записывает RS_Len[CMD_MODBUS_15] значением 27; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_15] = 27;
/* Записывает RS_Len[CMD_EXTEND] значением 18; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_EXTEND] = 18;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Настройка режима приема/передачи */
/* Начинает функцию RS_SetBitMode; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void RS_SetBitMode(RS_DATA *rs_arr,int n)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(n == 8); последующий оператор выполняется только при истинном условии. */
if(n == 8)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */ /* Вызывает RS_SetLineMode с аргументами (rs_arr,8,'N',1) в текущей последовательности операций. */
/* Записывает rs_arr->RS_Flag9bit значением 0; rs arr RS флаг 9 бит. */
rs_arr->RS_Flag9bit=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(n == 9); последующий оператор выполняется только при истинном условии. */
if(n == 9)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */ /* Вызывает RS_SetLineMode с аргументами (rs_arr,8,'N',1) в текущей последовательности операций. */
/* Записывает rs_arr->RS_Flag9bit значением 1; rs arr RS флаг 9 бит. */
rs_arr->RS_Flag9bit=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/** Посылка блока байтов.
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
@param buf адрес массива
@param len количество байт
@see RS_BSend, RS_TRANSMIT_INTR */
/* Передаёт массив слов через SCI в выбранном режиме упаковки. */
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_CHAR32);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Объявляет i — данные i. */
unsigned int i;
for (i=0; i <= 30000; i++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= 30000; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
RS_Line_to_send(rs_arr); /* режим передачи RS485 */ /* Вызывает RS_Line_to_send с аргументами (rs_arr) в текущей последовательности операций. */
for (i=0; i <= 10000; i++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= 10000; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
rs_arr->RS_SLength = len; /* Настраиваем переменные */ /* Записывает rs_arr->RS_SLength значением len; rs arr RS S длина. */
/* Записывает rs_arr->pRS_SendPtr значением pBuf + 1; данные rs_arr->pRS_SendPtr. */
rs_arr->pRS_SendPtr = pBuf + 1;
/* Записывает rs_arr->RS_SendBlockMode значением BM_CHAR32; rs arr RS Send Block режим. */
rs_arr->RS_SendBlockMode = BM_CHAR32;
RS_Wait4OK(rs_arr); /* Дожидаемса ухода */ /* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */ /* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
rs_arr->RS_SendLen = 1; /* Два байта уже передали */ /* Записывает rs_arr->RS_SendLen значением 1; данные rs_arr->RS_SendLen. */
/* Проверяет if(len > 1); последующий оператор выполняется только при истинном условии. */
if(len > 1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ /* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
/* Вызывает SCI_send с аргументами (rs_arr, *pBuf) в текущей последовательности операций. */
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает SCI_send с аргументами (rs_arr, *pBuf) в текущей последовательности операций. */
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
RS_Wait4OK(rs_arr); /* Дожидаемса ухода без прерываниа */ /* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
RS_SetBitMode(rs_arr,9); /* Обратно в 9-бит режим */ /* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); /* режим приема RS485 */ /* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает RS_Send и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// Посылка блока упакованных байтов
/* Передаёт последовательность 8-битных октетов, упакованных в слова C28x. */
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_PACKED); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_PACKED);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает RS_Line_to_send с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_send(rs_arr); // режим передачи RS485
/* Записывает rs_arr->RS_SLength значением len; rs arr RS S длина. */
rs_arr->RS_SLength = len; // Настраиваем переменные
/* Записывает rs_arr->pRS_SendPtr значением pBuf; данные rs_arr->pRS_SendPtr. */
rs_arr->pRS_SendPtr = pBuf;
/* Записывает rs_arr->RS_SendBlockMode значением BM_PACKED; rs arr RS Send Block режим. */
rs_arr->RS_SendBlockMode = BM_PACKED;
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr); // Ожидаем очистки и ухода последнего байта
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */ /* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
/* Записывает rs_arr->RS_SendLen значением 1; данные rs_arr->RS_SendLen. */
rs_arr->RS_SendLen = 1; // Один байт уже передали
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ /* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
/* Вызывает SCI_send с аргументами (rs_arr,HIBYTE(*pBuf)) в текущей последовательности операций. */
SCI_send(rs_arr,HIBYTE(*pBuf));// Передаем первый байт
/* Завершает RS_BSend и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Устанавливает скорость обмена.
@param speed скорость RS в бод */
/** Устанавливает скорость обмена.
@param speed скорость RS в бод */
/* Начинает функцию RS_SetLineSpeed; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет SciBaud — SCI скорость передачи. */
long SciBaud;
/* Записывает SciBaud значением LSPCLK/(speed*8.0); SCI скорость передачи. */
SciBaud = LSPCLK/(speed*8.0);
// if((SciBaud-(unsigned int)SciBaud)>0.5) SciBaud++;
/* Записывает rs_arr->SciRegs->SCIHBAUD значением HIBYTE((int)SciBaud); rs arr SCI Regs SCIHBAUD. */
rs_arr->SciRegs->SCIHBAUD = HIBYTE((int)SciBaud);
/* Записывает rs_arr->SciRegs->SCILBAUD значением LOBYTE((int)SciBaud); rs arr SCI Regs SCILBAUD. */
rs_arr->SciRegs->SCILBAUD = LOBYTE((int)SciBaud);
rs_arr->curr_baud = speed; /* Сохраняет установленную скорость в бодах для последующих команд переключения линии и диагностики CCS. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Инициализациа последовательного порта */
/* Инициализирует структуры обоих SCI и таблицу длин команд. */
void create_uart_vars(char size_cmd15_set)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает size_cmd15 значением size_cmd15_set; размер cmd 15. */
size_cmd15=size_cmd15_set;
memset(&rs_a, 0, sizeof(rs_a)); /* Сбрасывает указатели, длины, буферы и флаги SCI-A до настройки порта; исключает остатки RAM после JTAG. */
memset(&rs_b, 0, sizeof(rs_b)); /* Независимо сбрасывает состояние SCI-B до назначения номера и аппаратных регистров. */
/* Записывает rs_a.commnumber значением COM_1; данные commnumber. */
rs_a.commnumber=COM_1;
/* Записывает rs_b.commnumber значением COM_2; данные commnumber. */
rs_b.commnumber=COM_2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Инициализациа последовательного порта */
/* Настраивает выбранный SCI, скорость и обработчики прерываний. */
void setup_uart(char commnumber, unsigned long speed_baud)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS *SciRegs;; порядок элементов сохраняется. */
volatile struct SCI_REGS *SciRegs;
/* Объявляет rs_arr — данные rs_arr. Хранит указатель на данные. */
RS_DATA *rs_arr;
/* Проверяет if(commnumber==COM_1); последующий оператор выполняется только при истинном условии. */
if(commnumber==COM_1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_a.SciRegs значением &SciaRegs; SCI Regs. */
rs_a.SciRegs = &SciaRegs;
/* Записывает rs_arr значением &rs_a; данные rs_arr. */
rs_arr = &rs_a;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO29 значением 1; аппаратная линия ввода/вывода GPIO29. */
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // SCITXDA - SCI-A transmit(O)
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO28 значением 1; аппаратная линия ввода/вывода GPIO28. */
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // SCIRXDA - SCI-A receive (I)
/* Записывает PieVectTable.SCIRXINTA значением &RSA_RX_Handler; данные SCIRXINTA. */
PieVectTable.SCIRXINTA = &RSA_RX_Handler;
/* Записывает PieVectTable.SCITXINTA значением &RSA_TX_Handler; данные SCITXINTA. */
PieVectTable.SCITXINTA = &RSA_TX_Handler;
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx1 значением 1; данные INTx1. */
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx2 значением 1; данные INTx2. */
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9; // Enable CPU INT
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(commnumber==COM_2); последующий оператор выполняется только при истинном условии. */
if(commnumber==COM_2)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_b.SciRegs значением &ScibRegs; SCI Regs. */
rs_b.SciRegs = &ScibRegs;
/* Записывает rs_arr значением &rs_b; данные rs_arr. */
rs_arr = &rs_b;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPAMUX1.bit.GPIO14 значением 2; аппаратная линия ввода/вывода GPIO14. */
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 2; // SCITXDB - SCI-B transmit(O)
/* Записывает GpioCtrlRegs.GPAMUX1.bit.GPIO15 значением 2; аппаратная линия ввода/вывода GPIO15. */
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 2; // SCIRXDB - SCI-B receive (I)
/* Записывает GpioCtrlRegs.GPBMUX1.bit.GPIO34 значением 0; аппаратная линия ввода/вывода GPIO34. */
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO 34 - general purpose I/O 34 (default)
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO34 значением 1; аппаратная линия ввода/вывода GPIO34. */
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // Configures the GPIO pin as an output
/* Записывает PieVectTable.SCIRXINTB значением &RSB_RX_Handler; данные SCIRXINTB. */
PieVectTable.SCIRXINTB = &RSB_RX_Handler;
/* Записывает PieVectTable.SCITXINTB значением &RSB_TX_Handler; данные SCITXINTB. */
PieVectTable.SCITXINTB = &RSB_TX_Handler;
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx3 значением 1; данные INTx3. */
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx4 значением 1; данные INTx4. */
PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE Group 9, INT4
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9; // Enable CPU INT
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->commnumber значением commnumber; данные rs_arr->commnumber. */
rs_arr->commnumber = commnumber;
/* Записывает SciRegs значением rs_arr->SciRegs; SCI Regs. */
SciRegs = rs_arr->SciRegs;
/* Вызывает RS_SetLineMode с аргументами (rs_arr,8,'N',1) в текущей последовательности операций. */
RS_SetLineMode(rs_arr,8,'N',1);
// enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
/* Записывает SciRegs->SCIFFCT.bit.ABDCLR значением 1; данные ABDCLR. */
SciRegs->SCIFFCT.bit.ABDCLR=1;
/* Записывает SciRegs->SCIFFCT.bit.CDC значением 0; данные CDC. */
SciRegs->SCIFFCT.bit.CDC=0;
/* Записывает SciRegs->SCICTL1.bit.RXERRINTENA значением 0; данные RXERRINTENA. */
SciRegs->SCICTL1.bit.RXERRINTENA=0;
/* Записывает SciRegs->SCICTL1.bit.SWRESET значением 0; данные SWRESET. */
SciRegs->SCICTL1.bit.SWRESET=0;
/* Записывает SciRegs->SCICTL1.bit.TXWAKE значением 0; данные TXWAKE. */
SciRegs->SCICTL1.bit.TXWAKE=0;
/* Записывает SciRegs->SCICTL1.bit.SLEEP значением 0; данные SLEEP. */
SciRegs->SCICTL1.bit.SLEEP=0;
/* Записывает SciRegs->SCICTL1.bit.TXENA значением 1; данные TXENA. */
SciRegs->SCICTL1.bit.TXENA=1;
/* Записывает SciRegs->SCICTL1.bit.RXENA значением 1; данные RXENA. */
SciRegs->SCICTL1.bit.RXENA=1;
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (commnumber == COM_1); последующий оператор выполняется только при истинном условии. */
if (commnumber == COM_1) {
SciRegs->SCIFFTX.all=0xC008U; /* enhancement, reset held, TX level 8, IRQ off */ /* Записывает SciRegs->SCIFFTX.all значением 0xC008U; представление регистра целым словом без разбиения на битовые поля. */
SciRegs->SCIFFRX.all=0x0061U; /* reset held, RX level 1, IRQ on */ /* Записывает SciRegs->SCIFFRX.all значением 0x0061U; представление регистра целым словом без разбиения на битовые поля. */
/* Записывает SciRegs->SCIFFCT.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
SciRegs->SCIFFCT.all=0;
/* Записывает SciRegs->SCIFFRX.bit.RXFFOVRCLR значением 1; данные RXFFOVRCLR. */
SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
/* Записывает SciRegs->SCIFFTX.bit.TXFFINTCLR значением 1; данные TXFFINTCLR. */
SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
/* Записывает SciRegs->SCIFFTX.bit.TXFIFOXRESET значением 1; данные TXFIFOXRESET. */
SciRegs->SCIFFTX.bit.TXFIFOXRESET=1;
/* Записывает SciRegs->SCIFFRX.bit.RXFIFORESET значением 1; данные RXFIFORESET. */
SciRegs->SCIFFRX.bit.RXFIFORESET=1;
/* Записывает rs_arr->fifo_tx_active значением rs_arr->fifo_rx_guard=0; данные rs_arr->fifo_tx_active. */
rs_arr->fifo_tx_active=rs_arr->fifo_rx_guard=0;
/* Записывает rs_arr->fifo_rx_errors значением rs_arr->fifo_overflows=0; данные rs_arr->fifo_rx_errors. */
rs_arr->fifo_rx_errors=rs_arr->fifo_overflows=0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает SciRegs->SCIFFTX.bit.SCIFFENA значением 0; данные SCIFFENA. */
SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off
/* Записывает SciRegs->SCIFFRX.bit.RXFFIL значением 1; данные RXFFIL. */
SciRegs->SCIFFRX.bit.RXFFIL=1; // Длина наименьшей команды
/* Вызывает setup_arr_cmd_length с аргументами () в текущей последовательности операций. */
setup_arr_cmd_length();
/* Вызывает RS_SetLineSpeed с аргументами (rs_arr,speed_baud) в текущей последовательности операций. */
RS_SetLineSpeed(rs_arr,speed_baud); // скорость линии
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
enableUARTInt(rs_arr); // разрешение прерываний UART
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Записывает rs_arr->RS_PrevCmd значением 0; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = 0; // не было никаких команд
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением 0; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send = 0;
/* Записывает rs_arr->flag_LEADING значением 0; rs arr флаг LEADING. */
rs_arr->flag_LEADING = 0;
/* Записывает SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
/* Записывает SciRegs->SCICTL1.bit.SWRESET значением 1; данные SWRESET. */
SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Настройка режима линии.
@param bit количество бит данных
@param parity режим четности (N,O,E,M,S)
@param stop количество стоповых бит */
/* Начинает функцию RS_SetLineMode; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS *SciRegs;; порядок элементов сохраняется. */
volatile struct SCI_REGS *SciRegs;
/*
SCICCR - SCI Communication Control Register
Bit Bit Name Designation Functions
2-0 SCI CHAR2-0 SCICHAR Select the character (data) length (one to eight bits).
3 ADDR/IDLE MODE ADDRIDLE_MODE The idle-line mode (0) is usually used for normal communications because the address-bit mode adds an extra bit to the frame. The idle-line mode does not add this extra bit and is compatible with RS-232 type communications.
4 LOOP BACK ENABLE LOOPBKENA This bit enables (1) the Loop Back test mode where the Tx pin is internally connected to the Rx pin.
5 PARITY ENABLE PARITYENA Enables the parity function if set to 1, or disables the parity function if cleared to 0.
6 EVEN/ODD PARITY PARITY If parity is enabled, selects odd parity if cleared to 0 or even parity if set to 1.
7 STOP BITS STOPBITS Determines the number of stop bits transmitted-one stop bit if cleared to 0 or two stop bits if set to 1.
*/
/* Записывает SciRegs значением rs_arr->SciRegs; SCI Regs. */
SciRegs = rs_arr->SciRegs;
/* Проверяет if(bit>0 и bit<9) SciRegs->SCICCR.bit.SCICHAR = bit-1; последующий оператор выполняется только при истинном условии. */
if(bit>0 && bit<9) SciRegs->SCICCR.bit.SCICHAR = bit-1;
/* Вызывает switch с аргументами (parity) в текущей последовательности операций. */
switch(parity)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Ветвь выбора для 'N'; выполняется при совпадении селектора switch. */
case 'N': SciRegs->SCICCR.bit.PARITYENA = 0;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 'O'; выполняется при совпадении селектора switch. */
case 'O': SciRegs->SCICCR.bit.PARITYENA = 1;
/* Записывает SciRegs->SCICCR.bit.PARITY значением 0; чётность. */
SciRegs->SCICCR.bit.PARITY = 0;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 'E'; выполняется при совпадении селектора switch. */
case 'E': SciRegs->SCICCR.bit.PARITYENA = 1;
/* Записывает SciRegs->SCICCR.bit.PARITY значением 1; чётность. */
SciRegs->SCICCR.bit.PARITY = 1;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (stop==1) SciRegs->SCICCR.bit.STOPBITS = 0; последующий оператор выполняется только при истинном условии. */
if (stop==1) SciRegs->SCICCR.bit.STOPBITS = 0;
/* Проверяет if (stop==2) SciRegs->SCICCR.bit.STOPBITS = 1; последующий оператор выполняется только при истинном условии. */
if (stop==2) SciRegs->SCICCR.bit.STOPBITS = 1;
/* Записывает SciRegs->SCICCR.bit.LOOPBKENA значением 0; данные LOOPBKENA. */
SciRegs->SCICCR.bit.LOOPBKENA = 0; //0
/* Записывает SciRegs->SCICCR.bit.ADDRIDLE_MODE значением 0; ADDRIDLE режим. */
SciRegs->SCICCR.bit.ADDRIDLE_MODE = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию clear_timer_rs_live; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void clear_timer_rs_live(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->time_wait_rs_out значением 0; данные rs_arr->time_wait_rs_out. */
rs_arr->time_wait_rs_out=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* проверка на живучесть RS */
/* Начинает функцию test_rs_live; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void test_rs_live(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* if (rs_arr->time_wait_rs_out < RS_TIME_OUT)
rs_arr->time_wait_rs_out++;
else
{
rs_arr->time_wait_rs_out=0;
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_SetBitMode(rs_arr,9);
}*/ } /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* FIFO is exclusively SCI-A / RS232. SCI-B keeps the legacy path. */
/* Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */
void RS_FifoWait(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if (rs_arr->commnumber != COM_1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber != COM_1) {
/* Повторяет или ожидает, пока выполняется while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY). */
while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
/* Завершает RS_FifoWait без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Повторяет или ожидает, пока выполняется while (rs_arr->fifo_tx_active или rs_arr->SciRegs->SCIFFTX.bit.TXFFST или. */
while (rs_arr->fifo_tx_active || rs_arr->SciRegs->SCIFFTX.bit.TXFFST ||
/* Продолжает список аргументов, полей или выражение !rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }; порядок элементов сохраняется. */
!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Заполняет TX FIFO доступными байтами, сохраняя длину и положение в передаваемом пакете. */
static void RS_FifoTx(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет data — данные. */
unsigned int data;
/* Проверяет if (!rs_arr->fifo_tx_active); последующий оператор выполняется только при истинном условии. */
if (!rs_arr->fifo_tx_active) {
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 0; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
/* Проверяет else if (rs_arr->RS_SendLen == rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
} else if (rs_arr->RS_SendLen == rs_arr->RS_SLength) {
/* Level 0 interrupt: FIFO drained, last symbol may still be shifting.
* Do not finish on TXFFST alone. At most one symbol remains. */
/* Проверяет if (rs_arr->SciRegs->SCIFFTX.bit.TXFFST); последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIFFTX.bit.TXFFST) {
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR значением 1; данные TXFFINTCLR. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Завершает RS_FifoTx без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 0; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
/* Повторяет или ожидает, пока выполняется while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY). */
while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
/* Проверяет if (rs_arr->RS_SendBlockMode == BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_SendBlockMode == BM_CHAR32) {
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением false; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send=false;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 0; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=0;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR значением 1; данные RXFFOVRCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 1; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=1;
/* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
enableUARTInt(rs_arr);
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA значением 1; данные RXFFIENA. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA=1;
/* Записывает rs_arr->fifo_tx_active значением 0; данные rs_arr->fifo_tx_active. */
rs_arr->fifo_tx_active=0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else {
/* Повторяет или ожидает, пока выполняется while (rs_arr->RS_SendLen < rs_arr->RS_SLength и. */
while (rs_arr->RS_SendLen < rs_arr->RS_SLength &&
/* Продолжает список аргументов, полей или выражение rs_arr->SciRegs->SCIFFTX.bit.TXFFST < 16) {; порядок элементов сохраняется. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFST < 16) {
/* Проверяет if (rs_arr->RS_SendBlockMode == BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_SendBlockMode == BM_CHAR32)
/* Записывает data значением *rs_arr->pRS_SendPtr++; данные. */
data=*rs_arr->pRS_SendPtr++;
/* Проверяет else if (rs_arr->RS_SendLen & 1U); последующий оператор выполняется только при истинном условии. */
else if (rs_arr->RS_SendLen & 1U)
/* Записывает data значением LOBYTE(*rs_arr->pRS_SendPtr++); данные. */
data=LOBYTE(*rs_arr->pRS_SendPtr++);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else data=HIBYTE(*rs_arr->pRS_SendPtr);
/* Вызывает SCI_send с аргументами (rs_arr,data) в текущей последовательности операций. */
SCI_send(rs_arr,data);
/* Изменяет счётчик в выражении rs_arr->RS_SendLen++; на один для следующего шага. */
rs_arr->RS_SendLen++;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIL значением ; данные TXFFIL. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIL=
/* Продолжает список аргументов, полей или выражение rs_arr->RS_SendLen == rs_arr->RS_SLength ? 0 : 8;; порядок элементов сохраняется. */
rs_arr->RS_SendLen == rs_arr->RS_SLength ? 0 : 8;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR значением 1; данные TXFFINTCLR. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Запускает передачу через FIFO COM_1 после проверки буфера и состояния текущего обмена. */
static int RS_FifoStart(RS_DATA *rs_arr,unsigned int *buffer,unsigned long count,int mode)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. */
unsigned int saved;
/* Проверяет if (!count) return 0; последующий оператор выполняется только при истинном условии. */
if (!count) return 0;
/* Проверяет if (!buffer) return -1; последующий оператор выполняется только при истинном условии. */
if (!buffer) return -1;
RS_FifoWait(rs_arr); /* before replacing the previous transfer's counters */ /* Вызывает RS_FifoWait. Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved=__disable_interrupts();
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 0; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA значением 0; данные RXFFIENA. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA=0;
/* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
enableUARTIntW(rs_arr);
/* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,8);
/* Записывает rs_arr->pRS_SendPtr значением buffer; данные rs_arr->pRS_SendPtr. */
rs_arr->pRS_SendPtr=buffer;
/* Записывает rs_arr->RS_SLength значением count; rs arr RS S длина. */
rs_arr->RS_SLength=count;
/* Записывает rs_arr->RS_SendLen значением 0; данные rs_arr->RS_SendLen. */
rs_arr->RS_SendLen=0;
/* Записывает rs_arr->RS_SendBlockMode значением mode; rs arr RS Send Block режим. */
rs_arr->RS_SendBlockMode=mode;
/* Записывает rs_arr->fifo_tx_active значением 1; данные rs_arr->fifo_tx_active. */
rs_arr->fifo_tx_active=1;
RS_FifoTx(rs_arr); /* prime before enabling a possibly immediate TX IRQ */ /* Вызывает RS_FifoTx. Заполняет TX FIFO доступными байтами, сохраняя длину и положение в передаваемом пакете. */
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 1; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=1;
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Проверяет if (count == 1 и mode == BM_CHAR32) RS_FifoWait(rs_arr); последующий оператор выполняется только при истинном условии. */
if (count == 1 && mode == BM_CHAR32) RS_FifoWait(rs_arr);
/* Завершает RS_FifoStart и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ошибочный приём FIFO, очищает аппаратное состояние и включает защитную паузу. */
static void RS_FifoAbort(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Изменяет счётчик в выражении rs_arr->fifo_rx_errors++; на один для следующего шага. */
rs_arr->fifo_rx_errors++;
/* Проверяет if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF) rs_arr->fifo_overflows++; последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF) rs_arr->fifo_overflows++;
/* Записывает rs_arr->RS_DataReady значением 0; rs_arr->BS_LoadOK=0; rs arr RS данные Ready. */
rs_arr->RS_DataReady=0; rs_arr->BS_LoadOK=0;
/* Записывает rs_arr->RS_PrevCmd значением 0; rs_arr->RS_Cmd=0; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd=0; rs_arr->RS_Cmd=0;
/* Записывает rs_arr->RS_Flag9bit значением 0; rs_arr->RS_FlagSkiping=1; rs arr RS флаг 9 бит. */
rs_arr->RS_Flag9bit=0; rs_arr->RS_FlagSkiping=1;
/* Записывает rs_arr->fifo_rx_guard значением 4; данные rs_arr->fifo_rx_guard. */
rs_arr->fifo_rx_guard=4;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 0; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=0;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR значением 1; данные RXFFOVRCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
/* Проверяет if (rs_arr->SciRegs->SCIRXST.bit.RXERROR); последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIRXST.bit.RXERROR) {
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 0; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=0;
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 1; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 1; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Уменьшает защитную паузу RX FIFO по миллисекундному такту. */
void RS_FifoTick1ms(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. Начальное значение задаётся справа от знака равенства. */
unsigned int saved=__disable_interrupts();
/* Объявляет p — данные p; rs_a — данные rs_a. Хранит указатель на данные. Начальное значение задаётся справа от знака равенства. */
RS_DATA *p=&rs_a;
/* Проверяет if (p->SciRegs и p->fifo_rx_guard); последующий оператор выполняется только при истинном условии. */
if (p->SciRegs && p->fifo_rx_guard) {
/* Проверяет if (p->SciRegs->SCIFFRX.bit.RXFFST) p->fifo_rx_guard=4; последующий оператор выполняется только при истинном условии. */
if (p->SciRegs->SCIFFRX.bit.RXFFST) p->fifo_rx_guard=4;
/* Проверяет else if (--p->fifo_rx_guard == 0); последующий оператор выполняется только при истинном условии. */
else if (--p->fifo_rx_guard == 0) {
/* Записывает p->RS_HeaderCnt значением 0;p->RS_RecvLen=0; данные p->RS_HeaderCnt. */
p->RS_HeaderCnt=0;p->RS_RecvLen=0;
/* Записывает p->RS_FlagBegin значением 1;p->RS_FlagSkiping=0; p RS флаг Begin. */
p->RS_FlagBegin=1;p->RS_FlagSkiping=0;
RS_SetBitMode(p,9); /* fresh address after 3..4 ms of idle */ /* Вызывает RS_SetBitMode с аргументами (p,9) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif