/* Приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. Русские пояснения сохранены в UTF-8. */ /* Начинает условие: _RS485 ещё не определён; защищает повторное включение или задаёт значение сборки. */ #ifndef _RS485 /* Определяет защитный символ или переключатель _RS485 для последующей компиляции. */ #define _RS485 /* Включает следующий блок только при определённом символе __cplusplus. */ #ifdef __cplusplus /* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ extern "C" { /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif //#include "DSP2833x_Device.h" // DSP281x Headerfile Include File //#include "DSP2833x_Sci.h" //#include "cntrl_adr.h" //#include "params.h" /* Начинает условие: RS232_USE_FIFO ещё не определён; защищает повторное включение или задаёт значение сборки. */ #ifndef RS232_USE_FIFO /* Задаёт RS232_USE_FIFO = 1; выбор FIFO для COM_1; COM_2 сохраняет отдельную логику RS485. */ #define RS232_USE_FIFO 1 /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif /* Задаёт COM_1 = 1; номер первого последовательного порта, SCI-A. */ #define COM_1 1 /* Задаёт COM_2 = 2; номер второго последовательного порта, SCI-B. */ #define COM_2 2 /* Задаёт MAX_RECEIVE_LENGTH = 400; MAX приём длина. */ #define MAX_RECEIVE_LENGTH 400 // 80 //150 /* Задаёт MAX_SEND_LENGTH = 400; MAX SEND длина. */ #define MAX_SEND_LENGTH 400 //150 /* Задаёт TIME_WAIT_RS_BYTE_OUT = 1000; данные TIME_WAIT_RS_BYTE_OUT. */ #define TIME_WAIT_RS_BYTE_OUT 1000 /* Задаёт TIME_WAIT_RS_LOST_BYTE = 100; данные TIME_WAIT_RS_LOST_BYTE. */ #define TIME_WAIT_RS_LOST_BYTE 100 /* Задаёт RS_TIME_OUT = (SECOND*10); данные RS_TIME_OUT. */ #define RS_TIME_OUT (SECOND*10) /* Задаёт Rec_Bloc_Begin = 0x200000; данные Rec_Bloc_Begin. */ #define Rec_Bloc_Begin 0x200000 /* Задаёт Rec_Bloc_End = 0x2F0000; данные Rec_Bloc_End. */ #define Rec_Bloc_End 0x2F0000 /* Задаёт Rec_Bloc_Length = (Rec_Bloc_End-Rec_Bloc_Begin); Rec Bloc длина. */ #define Rec_Bloc_Length (Rec_Bloc_End-Rec_Bloc_Begin) /* Message RS declaration */ /* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ typedef struct /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS *SciRegs;; порядок элементов сохраняется. */ volatile struct SCI_REGS *SciRegs; /* Объявляет commnumber — данные commnumber. */ unsigned int commnumber; // Номер порта /* Объявляет RS_Length — RS длина. */ unsigned long RS_Length; // Длина пакета /* Объявляет pRS_RecvPtr — данные pRS_RecvPtr. Хранит указатель на данные. */ unsigned int *pRS_RecvPtr; // Буфер приема /* Объявляет pRS_SendPtr — данные pRS_SendPtr. Хранит указатель на данные. */ unsigned int *pRS_SendPtr; // Буфер посылки /* Объявляет pRecvPtr — данные pRecvPtr. Хранит указатель на данные. */ unsigned int *pRecvPtr; /* Объявляет RS_PrevCmd — данные RS_PrevCmd. */ unsigned int RS_PrevCmd; // Предыдущаа комманда /* Объявляет RS_Cmd — данные RS_Cmd. */ unsigned int RS_Cmd; // Текущаа комманда /* Объявляет RS_Header — данные RS_Header. */ unsigned int RS_Header[MAX_RECEIVE_LENGTH]; // Заголовок /* Объявляет flag_TIMEOUT_to_Send — флаг TIMEOUT to Send. */ unsigned int flag_TIMEOUT_to_Send; // Флаг ожиданиа таймаута на отсылку /* Объявляет flag_TIMEOUT_to_Receive — флаг TIMEOUT to приём. */ unsigned int flag_TIMEOUT_to_Receive; // Флаг ожиданиа таймаута на прием /* Объявляет RS_DataReady — RS данные Ready. */ unsigned int RS_DataReady; // Флаг готовности RS данных /* Объявляет buffer — буфер. */ unsigned int buffer[MAX_SEND_LENGTH]; // Буфер дла отсылки по RS /* Объявляет addr_answer — данные addr_answer. */ unsigned int addr_answer; // адрес куда отвечать в режиме ведущего /* Объявляет addr_recive — данные addr_recive. */ unsigned int addr_recive; // адрес по которому нас запросили /* Объявляет flag_LEADING — флаг LEADING. */ unsigned int flag_LEADING; // Флаг режима контроллера (по умолчанию ведомый) /* Объявляет RS_RecvLen — данные RS_RecvLen. */ unsigned long RS_RecvLen; /* Объявляет RS_SLength — RS S длина. */ unsigned long RS_SLength; // Длина пакета дла посылки /* Объявляет RS_SendLen — данные RS_SendLen. */ unsigned long RS_SendLen; // Количество байт уже передали /* Объявляет RS_SendBlockMode — RS Send Block режим. */ char RS_SendBlockMode; // Режим передачи /* Объявляет RS_Flag9bit — RS флаг 9 бит. */ char RS_Flag9bit; // дла RS485???????? /* Объявляет BS_LoadOK — данные BS_LoadOK. */ int BS_LoadOK; // Флаг успешности приема блока /* Объявляет RS_FlagBegin — RS флаг Begin. */ int RS_FlagBegin; /* Объявляет RS_HeaderCnt — данные RS_HeaderCnt. */ int RS_HeaderCnt; /* Объявляет RS_FlagSkiping — RS флаг Skiping. */ int RS_FlagSkiping; /* Объявляет curr_baud — curr скорость передачи. */ unsigned long curr_baud; /* Объявляет time_wait_rs_out — данные time_wait_rs_out. */ unsigned long time_wait_rs_out; /* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */ #if RS232_USE_FIFO /* Объявляет fifo_tx_active — данные fifo_tx_active; fifo_rx_guard — данные fifo_rx_guard. volatile требует фактического чтения или записи при каждом доступе. */ volatile unsigned int fifo_tx_active, fifo_rx_guard; /* Объявляет fifo_rx_errors — данные fifo_rx_errors; fifo_overflows — данные fifo_overflows. volatile требует фактического чтения или записи при каждом доступе. */ volatile unsigned long fifo_rx_errors, fifo_overflows; volatile unsigned long fifo_rx_bytes; /* Считает байты, реально прочитанные обработчиком из FIFO SCI-A; чтение этого поля в CCS не изменяет приёмник. */ volatile unsigned int fifo_rx_last_word; /* Хранит последнее чтение SCIRXBUF: байт в битах 7:0, FE в бите 15 и PE в бите 14. */ volatile unsigned int fifo_rx_last_status; /* Хранит SCIRXST последней ошибки до сброса: BREAK/FE/OE/PE в битах 5/4/3/2. */ volatile unsigned int fifo_rx_last_error_word; /* Хранит слово FE/PE, вызвавшее сброс, либо ноль при общей ошибке SCI до чтения FIFO. */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif /* Продолжает список аргументов, полей или выражение } RS_DATA;; порядок элементов сохраняется. */ } RS_DATA; /* Объявляет rs_a — данные rs_a; rs_b — данные rs_b. Память определена в другом модуле. */ extern RS_DATA rs_a,rs_b; /* Объявляет . Память определена в другом модуле. */ extern unsigned int RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */ /* Продолжает список аргументов, полей или выражение RS_Len[70];; порядок элементов сохраняется. */ /* Объявляет обработчик RSA_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */ interrupt void RSA_RX_Handler(void); /* Объявляет обработчик RSA_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */ interrupt void RSA_TX_Handler(void); /* Объявляет обработчик RSB_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */ interrupt void RSB_RX_Handler(void); /* Объявляет обработчик RSB_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */ interrupt void RSB_TX_Handler(void); /* иницилизациа переменных rs_a,rs_b*/ /* Инициализирует структуры обоих SCI и таблицу длин команд. */ void create_uart_vars(char size_cmd15); /** Повторнаа инициализациа последовательного порта, используетса после подвиса */ /** Настройка режима приема/передачи */ /* Объявляет интерфейс функции RS_SetBitMode; реализация вызывается через этот прототип. */ void RS_SetBitMode(RS_DATA *rs_arr, int n); /** Посылка блока байтов. Посылает массива 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); /** Посылка блока упакованных байтов. @precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR @param buf адрес массива @param len количество 8-битных байт @see RS_Send, RS_TRANSMIT_INTR */ /* Передаёт последовательность 8-битных октетов, упакованных в слова C28x. */ int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len); /** Инициализациа последовательного порта */ void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */ /* Настраивает выбранный SCI, скорость и обработчики прерываний. */ /* Объявляет интерфейс функции RS_SetLineMode; реализация вызывается через этот прототип. */ void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop); /* Объявляет интерфейс функции RS_SetLineSpeed; реализация вызывается через этот прототип. */ void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed); // Transmit a character from the SCI' /* Задаёт SCI_send = x->SciRegs->SCITXBUF=(unsigned char)(y); SCI send. */ #define SCI_send(x,y) x->SciRegs->SCITXBUF=(unsigned char)(y) // Ожидание завершениа передачи UART // wait for TRDY =1 for empty state /* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */ #if RS232_USE_FIFO /* Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */ void RS_FifoWait(RS_DATA *rs_arr); /* Уменьшает защитную паузу RX FIFO по миллисекундному такту. */ void RS_FifoTick1ms(void); /* Задаёт RS_Wait4OK = RS_FifoWait(x); данные RS_Wait4OK. */ #define RS_Wait4OK(x) RS_FifoWait(x) /* Выбирает альтернативный блок текущего условия компиляции. */ #else /* Задаёт RS_Wait4OK = while(!(x->SciRegs->SCICTL2.bit.TXEMPTY)); данные RS_Wait4OK. */ #define RS_Wait4OK(x) while(!(x->SciRegs->SCICTL2.bit.TXEMPTY)) /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif /** Переключение линии на прием */ /* Задаёт RS_Line_to_receive = if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1;; RS Line to приём. */ #define RS_Line_to_receive(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1; /** Переключение линии на передачу */ /* Задаёт RS_Line_to_send = if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0;; данные RS_Line_to_send. */ #define RS_Line_to_send(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0; /** Разрешение прерываний по получению символа и ошибкам от UART */ /* Задаёт enableUARTInt = x->SciRegs->SCICTL2.all=2; разрешение UART Int. */ #define enableUARTInt(x) x->SciRegs->SCICTL2.all=2 /* Задаёт enableUARTIntW = x->SciRegs->SCICTL2.all=1; разрешение UART Int W. */ #define enableUARTIntW(x) x->SciRegs->SCICTL2.all=1 /* Объявляет интерфейс функции clear_timer_rs_live; реализация вызывается через этот прототип. */ void clear_timer_rs_live(RS_DATA *rs_arr); /* Объявляет интерфейс функции test_rs_live; реализация вызывается через этот прототип. */ void test_rs_live(RS_DATA *rs_arr); /* Включает следующий блок только при определённом символе __cplusplus. */ #ifdef __cplusplus /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif #endif /* _RS485 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */