Files
Balsam_167/Source/Internal/Include/RS485.h
Andrey 3ebfdca0a0 Исправить скорость SCI и добавить диагностику ошибок приёма RS232
Округлить делитель SCI по формуле аппаратуры, настроить вход RX и обработку ошибок FIFO. Добавить диагностические поля и проверки модели, установить 9600 бод для RS485 при Owen. Сохранить скрипт сборки, обновлённый образ прошивки и карту линковки.
2026-10-12 16:44:51 +03:00

230 lines
16 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */