/* Приём и передача 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 /* Объявляет 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 *, unsigned int); /* Принимает слово с признаками FE/PE либо ноль при общей ошибке SCI; сохраняет причину до очистки регистров. */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #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,0); return; /* Сохраняет SCIRXST при общей ошибке или переполнении; SCIRXBUF здесь не читался. */ /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет 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. */ rs_arr->fifo_rx_bytes++; /* Считает реальные чтения байтов из FIFO, включая повреждённые и пропущенные во время защитной паузы. */ rs_arr->fifo_rx_last_word=received; /* Сохраняет данные в битах 7:0 и признаки FE/PE в битах 15:14, позволяя смотреть их в RAM без чтения FIFO отладчиком. */ /* Маска 0xC000 из описания SCIRXBUF в TI SPRUI07 выбирает ошибку стопового бита FE и ошибку чётности PE текущего байта. */ if (received & 0xC000U) { RS_FifoAbort(rs_arr,received); return; } /* Передаёт повреждённое слово диагностике до сброса FIFO и отвергает весь пакет. */ /* Проверяет 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) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { unsigned long SciBaud; /* Хранит 16-битный BRR в 32-битном типе, чтобы до вычитания единицы представить делитель 65536. */ unsigned long baud_clock; /* Хранит частоту выборки SCI в Гц: по TI SPRUI07 на один бит приходится восемь тактов. */ if (!speed || speed > 0xFFFFFFFFUL/8UL || LSPCLK <= 0) return; /* Исключает деление на ноль, переполнение 32-битного произведения и настройку до определения частоты SCI. */ baud_clock=speed*8UL; /* Переводит скорость в бодах в требуемую частоту восьмикратной выборки без вычислений с плавающей точкой. */ SciBaud=(unsigned long)LSPCLK/baud_clock; /* Вычисляет целую часть отношения LSPCLK к частоте выборки; это BRR+1 согласно формуле TI. */ if ((unsigned long)LSPCLK%baud_clock >= (baud_clock+1UL)/2UL) SciBaud++; /* Округляет делитель к ближайшему целому по остатку, не складывая большие частоты с риском переполнения. */ if (SciBaud < 2UL) SciBaud=2UL; /* Ограничивает максимальную скорость значением LSPCLK/16; BRR=0 тоже имеет этот особый предел по TI SPRUI07. */ if (SciBaud > 65536UL) SciBaud=65536UL; /* Ограничивает отношение диапазоном 16-битного BRR+1, чтобы малая скорость не оборачивала регистр. */ SciBaud--; /* Преобразует отношение в BRR: при 60 МГц и 115200 бод получает 64, что даёт 115384,6 бод вместо прежних 113636,4. */ /* Записывает 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) GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; /* Выбирает асинхронный вход SCIRXDA по TI SPRUI07; исключает задержки фильтра GPIO, оставшиеся после другой программы или JTAG. */ GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; /* Включает внутреннюю подтяжку входа RX к уровню покоя UART, чтобы неподключённый вход не создавал ложные старты. */ /* Записывает 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->SCICTL1.bit.RXERRINTENA=1; /* Разрешает отдельное RX-прерывание по BREAK/RXERROR: в FIFO-режиме BREAK может не положить байт в FIFO и не достичь порога RXFFIL. */ 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; rs_arr->fifo_rx_bytes=0; /* Начинает счёт реальных чтений FIFO заново при настройке SCI-A. */ rs_arr->fifo_rx_last_word=0; /* До первого чтения FIFO диагностическое слово не содержит старых данных RAM. */ rs_arr->fifo_rx_last_status=0; /* Очищает сохранённые признаки BREAK, FE, OE и PE предыдущего запуска. */ rs_arr->fifo_rx_last_error_word=0; /* Очищает сохранённый повреждённый байт и его признаки FE/PE. */ /* Выполняет альтернативу, если предыдущее условие 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->SciRegs->SCICTL1.bit.RXERRINTENA=1; /* Возвращает обработку BREAK и ошибок приёмника вместе с RX FIFO после завершения передачи. */ /* Записывает 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; rs_arr->SciRegs->SCICTL1.bit.RXERRINTENA=0; /* Запрещает сброс SCI по шуму RX во время TX, когда прерывания приёма FIFO также отключены. */ /* Вызывает 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,unsigned int error_word) /* Получает считанное слово FE/PE либо ноль, если ошибка обнаружена до чтения FIFO. */ /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { rs_arr->fifo_rx_last_status=rs_arr->SciRegs->SCIRXST.all; /* Сохраняет SCIRXST до SWRESET: биты 5/4/3/2 означают BREAK/FE/OE/PE по TI SPRUI07. */ rs_arr->fifo_rx_last_error_word=error_word; /* Сохраняет признаки FE/PE и значение повреждённого байта; ноль означает проверку общей ошибки до чтения SCIRXBUF. */ /* Изменяет счётчик в выражении 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