Сохранить русские комментарии и настройки проекта в UTF-8

Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
This commit is contained in:
2026-10-12 12:24:48 +03:00
parent 378e06a281
commit f741741cf8
137 changed files with 21576 additions and 2134 deletions

View File

@@ -1,554 +1,929 @@
/* Приём и передача 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"
/* Подключает "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};
static char size_cmd15=1;
/* Объявляет 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 - ïðèíàòî */
/** Обработчик прерываний 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; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски 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; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски 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; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски 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; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски 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 - ïðèíàòî */
/** Обработчик прерываний 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(;;) // 'goto' ýòî íå îïåðàòîð àçûêà Ñ
{
/* Цикл 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; /* 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
return; // êñòàòè ýòî åäèíñòâåííûé âûõîä èç ïðåðûâàíèà
/* Завершает RS_RX_Handler без возвращаемого значения. */
return; // кстати это единственный выход из прерываниа
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // ×èòàåì ñèìâîë â ëþáîì ñëó÷àå
/* Записывает 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_DataReady) continue; // Не забрали данные
if (rs_arr->RS_Flag9bit==1) // äëà RS485????????
/* Проверяет if (rs_arr->RS_Flag9bit==1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Flag9bit==1) // дла RS485????????
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Èíèöèàëèçèðóåì ïåðåìåííûå è ôëàãè
rs_arr->RS_FlagBegin = true; // Æäåì çàãîëîâîê
// Инициализируем переменные и флаги
/* Записывает 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 значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if(rs_arr->RS_FlagSkiping) continue; // Íå íàì
if (rs_arr->RS_FlagBegin) // Çàãîëîâîê
/* Проверяет 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( (Rc == CNTRL_ADDR_UNIVERSAL) || (Rc == CNTRL_ADDR && CNTRL_ADDR!=0) || ((Rc == rs_arr->addr_answer) && rs_arr->flag_LEADING)
/* Проверяет 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->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Ïåðâûé áàéò
RS_SetBitMode(rs_arr,8); // ïåðåñòðîèëèñü â 8-áèò ðåæèì
/* Записывает 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-бит режим
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
rs_arr->RS_FlagSkiping = true; // Íå íàøåìó êîíòðîëëåðó
rs_arr->RS_FlagBegin = false; // îñòàëèñü â 9-áèò ðåæèìå
/* Записывает 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();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
{
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Âòîðîé áàéò è ò.ä.
/* Выполняет альтернативу, если предыдущее условие 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 - ñòàðøàà íà äàííûé ìîìåíò
// Проверка длины посылки
// 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); // Ïîëó÷èëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?
rs_arr->RS_HeaderCnt = 0; // Ïîòîìó ÷òî êîìàíäà íå òà
/* Вызывает 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 значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd=0;
// led1_off();
continue;
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if (rs_arr->RS_Cmd == CMD_LOAD) // Äëà ýòîé êîìàíäû çàãîëîâîê î÷åíü êîðîòêèé
rs_arr->RS_FlagBegin = false;// äàëüøå èäóò äàííûå
/* Проверяет 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); // Ïîëó÷èëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{ // Получили заголовок
/* Вызывает 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();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } }
else // Ïîòîê äàííûõ
{
/* Выполняет альтернативу, если предыдущее условие 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->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // Íà ïðîãðàììó íàäåéñà, à ñàì íå ïëîøàé
}
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // Ìû çäåñü îêàçàëèñü ïî êàêîé-òî ÷óäîâèùíîé îøèáêå
if(rs_arr->RS_DataReady) // Åñëè äàííûå â îñíîâíîì öèêëå íå çàáðàíû,
{ // òî ïðîïóñêàåì ñëåäóþùóþ ïîñûëêó
rs_arr->RS_FlagSkiping = true; // Èãíîðèðóåì äî ñëåäóþùåãî çàãîëîâêà
// led1_off();
continue;
/* Записывает 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(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); последующий оператор выполняется только при истинном условии. */
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); // Ïîëó÷èëè âñå äàííûå ïåðåñòðîèëèñü â 9-áèò äëà RS485?
rs_arr->RS_FlagSkiping = true; // Èãíîðèðóåì äî ñëåäóþùåãî çàãîëîâêà
rs_arr->RS_DataReady = true; // Ôëàã â îñíîâíîé öèêë - äàííûå ïîëó÷åíû
/* Вызывает 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 - ïîñëàíî */
/** Обработчик прерываний 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); /* Запрещаем прерываниа по передаче */ /* Вызывает 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_Line_to_receive(rs_arr); /* ðåæèì ïðèåìà RS485 */
rs_arr->flag_TIMEOUT_to_Send=false; /* ñáðîñèëè ôëàã îæèäàíèà òàéìàóòà */
// 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 */
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); /* Запрещаем прерываниа по передаче */ /* Вызывает 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 */
}
}
// 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_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; //sizeof(CMD_TO_TMS)-1;
/* Записывает 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)
{
RS_SetLineMode(rs_arr,8,'N',1); /* ðåæèì ëèíèè */
rs_arr->RS_Flag9bit=0;
}
if(n == 9)
{
RS_SetLineMode(rs_arr,8,'N',1); /* ðåæèì ëèíèè */
rs_arr->RS_Flag9bit=1;
} }
/** Ïîñûëêà áëîêà áàéòîâ.
Ïîñûëàåò ìàññèâà 32-áèòíûõ öåëûõ ÷èñåë ñòàðøèå áèòû äîëæíû áûòü 0.
@precondition Ðàáîòà ô-öèè çàâèñèò îò ìàêðî RS_TRANSMIT_INTR
@param buf àäðåñ ìàññèâà
@param len êîëè÷åñòâî áàéò
@see RS_BSend, RS_TRANSMIT_INTR */
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет 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++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= 30000; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
RS_Line_to_send(rs_arr); /* ðåæèì ïåðåäà÷è RS485 */
RS_Line_to_send(rs_arr); /* режим передачи RS485 */ /* Вызывает RS_Line_to_send с аргументами (rs_arr) в текущей последовательности операций. */
for (i=0; i <= 10000; i++){} /* Ïàóçà äëà PC */
rs_arr->RS_SLength = len; /* Íàñòðàèâàåì ïåðåìåííûå */
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_SetBitMode(rs_arr,8); /* Îñòàëüíûå â 8-áèò ðåæèìå */
rs_arr->RS_SendLen = 1; /* Äâà áàéòà óæå ïåðåäàëè */
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); /* Ðàçðåøàåì ïðåðûâàíèà ïî ïåðåäà÷å */
SCI_send(rs_arr, *pBuf); // Ïåðåäàåì âòîðîé áàéò ïî ïðåðûâàíèþ
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ /* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
/* Вызывает SCI_send с аргументами (rs_arr, *pBuf) в текущей последовательности операций. */
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
SCI_send(rs_arr, *pBuf); // Ïåðåäàåì âòîðîé áàéò ïî ïðåðûâàíèþ
RS_Wait4OK(rs_arr); /* Äîæèäàåìñà óõîäà áåç ïðåðûâàíèà */
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Ïàóçà äëà PC */
RS_SetBitMode(rs_arr,9); /* Îáðàòíî â 9-áèò ðåæèì */
RS_Line_to_receive(rs_arr); /* ðåæèì ïðèåìà RS485 */
/* Вызывает 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); // ðåæèì ïåðåäà÷è RS485
/* Вызывает RS_Line_to_send с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_send(rs_arr); // режим передачи RS485
rs_arr->RS_SLength = len; // Íàñòðàèâàåì ïåðåìåííûå
rs_arr->pRS_SendPtr = pBuf;
/* Записывает 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_SetBitMode(rs_arr,8); /* Îñòàëüíûå â 8-áèò ðåæèìå */
/* Вызывает 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. */
rs_arr->RS_SendLen = 1; // Один байт уже передали
enableUARTIntW(rs_arr); /* Ðàçðåøàåì ïðåðûâàíèà ïî ïåðåäà÷å */
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ /* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
SCI_send(rs_arr,HIBYTE(*pBuf));// Ïåðåäàåì ïåðâûé áàéò
/* Вызывает SCI_send с аргументами (rs_arr,HIBYTE(*pBuf)) в текущей последовательности операций. */
SCI_send(rs_arr,HIBYTE(*pBuf));// Передаем первый байт
/* Завершает RS_BSend и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà.
@param speed ñêîðîñòü RS â áîä */
/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà.
@param speed ñêîðîñòü RS â áîä */
/** Устанавливает скорость обмена.
@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);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Èíèöèàëèçàöèà ïîñëåäîâàòåëüíîãî ïîðòà */
/** Инициализациа последовательного порта */
/* Инициализирует структуры обоих SCI и таблицу длин команд. */
void create_uart_vars(char size_cmd15_set)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает size_cmd15 значением size_cmd15_set; размер cmd 15. */
size_cmd15=size_cmd15_set;
/* Записывает 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,
// 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->SCIFFRX.all=0x0061U; /* reset held, RX level 1, IRQ on */
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; // Äëèíà íàèìåíüøåé êîìàíäû
/* Записывает 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_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485
enableUARTInt(rs_arr); // ðàçðåøåíèå ïðåðûâàíèé UART
/* Вызывает 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 значением 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 êîëè÷åñòâî ñòîïîâûõ áèò */
/** Настройка режима линии.
@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
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.
@@ -556,158 +931,285 @@ Bit Bit Name Designation Functions
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 */
/* проверка на живучесть 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_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(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(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); /* fresh address after 3..4 ms of idle */ /* Вызывает RS_SetBitMode с аргументами (p,9) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif