Округлить делитель SCI по формуле аппаратуры, настроить вход RX и обработку ошибок FIFO. Добавить диагностические поля и проверки модели, установить 9600 бод для RS485 при Owen. Сохранить скрипт сборки, обновлённый образ прошивки и карту линковки.
230 lines
16 KiB
C
230 lines
16 KiB
C
/* Приём и передача 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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||
|