/** * @file RS485.h * @brief Состояние портов SCI/RS-485, ограничения буферов и API обмена. * * RS_DATA объединяет регистры SCI, буферы, счётчики и состояние конечного * автомата. Память буферов принадлежит вызывающему коду и должна оставаться * доступной до завершения операции. MAX_RECEIVE_LENGTH/MAX_SEND_LENGTH задают * жёсткую границу, которую необходимо проверить до помещения данных в буфер. */ /****************************************************************/ /* TMS320C32 */ /* ====== BIOS, КЛАИН, КЛВСП ====== */ /* ЦНИИ СЭТ (с) 1998-2000 г. */ /**************************************************************** RS485.h **************************************************************** * Процедуры работы с UART * ****************************************************************/ #ifndef _RS485 #define _RS485 #ifdef __cplusplus extern "C" { #endif //#include "DSP2833x_Device.h" // DSP281x Headerfile Include File //#include "DSP2833x_Sci.h" //#include "cntrl_adr.h" //#include "params.h" #define COM_1 1 #define COM_2 2 #define MAX_RECEIVE_LENGTH 400 // 80 //150 #define MAX_SEND_LENGTH 400 //150 #define TIME_WAIT_RS_BYTE_OUT 1000 #define TIME_WAIT_RS_LOST_BYTE 100 #define RS_TIME_OUT (SECOND*10) #define Rec_Bloc_Begin 0x200000 #define Rec_Bloc_End 0x2F0000 #define Rec_Bloc_Length (Rec_Bloc_End-Rec_Bloc_Begin) /* Message RS declaration */ typedef struct { volatile struct SCI_REGS *SciRegs; unsigned int commnumber; // Номер порта unsigned long RS_Length; // Длина пакета unsigned int *pRS_RecvPtr; // Буфер приема unsigned int *pRS_SendPtr; // Буфер посылки unsigned int *pRecvPtr; unsigned int RS_PrevCmd; // Предыдущаа комманда unsigned int RS_Cmd; // Текущаа комманда unsigned int RS_Header[MAX_RECEIVE_LENGTH]; // Заголовок unsigned int flag_TIMEOUT_to_Send; // Флаг ожиданиа таймаута на отсылку unsigned int flag_TIMEOUT_to_Receive; // Флаг ожиданиа таймаута на прием unsigned int RS_DataReady; // Флаг готовности RS данных unsigned int buffer[MAX_SEND_LENGTH]; // Буфер дла отсылки по RS unsigned int addr_answer; // адрес куда отвечать в режиме ведущего unsigned int addr_recive; // адрес по которому нас запросили unsigned int flag_LEADING; // Флаг режима контроллера (по умолчанию ведомый) unsigned long RS_RecvLen; unsigned long RS_SLength; // Длина пакета дла посылки unsigned long RS_SendLen; // Количество байт уже передали char RS_SendBlockMode; // Режим передачи char RS_Flag9bit; // дла RS485???????? int BS_LoadOK; // Флаг успешности приема блока int RS_FlagBegin; int RS_HeaderCnt; int RS_FlagSkiping; unsigned long curr_baud; unsigned long time_wait_rs_out; } RS_DATA; extern RS_DATA rs_a,rs_b; extern unsigned int RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */ /** ISR приёма и передачи SCI-A/SCI-B; вызывают общий автомат соответствующего порта. */ interrupt void RSA_RX_Handler(void); interrupt void RSA_TX_Handler(void); interrupt void RSB_RX_Handler(void); interrupt void RSB_TX_Handler(void); /* иницилизациа переменных rs_a,rs_b*/ /** Создаёт исходное состояние обоих RS_DATA и задаёт размер команды 15. */ void create_uart_vars(char size_cmd15); /** Повторнаа инициализациа последовательного порта, используетса после подвиса */ /** Настройка режима приема/передачи */ void RS_SetBitMode(RS_DATA *rs_arr, int n); /** Посылка блока байтов. Посылает массива 32-битных целых чисел старшие биты должны быть 0. @precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR @param rs_arr Состояние выбранного порта. @param pBuf Адрес массива слов, каждое из которых содержит один байт. @param len количество байт @return Ненулевое значение, если передача принята драйвером. @see RS_BSend, RS_TRANSMIT_INTR */ int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len); /** Посылка блока упакованных байтов. @precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR @param rs_arr Состояние выбранного порта. @param pBuf Адрес массива с упакованными байтами. @param len количество 8-битных байт @return Ненулевое значение, если передача принята драйвером. @see RS_Send, RS_TRANSMIT_INTR */ int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len); /** Инициализациа последовательного порта */ /** @param commnumber COM_1 или COM_2. @param speed_baud Скорость линии в бодах. */ void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */ /** Настраивает число бит данных, чётность и число стоп-битов выбранного SCI. */ void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop); /** Меняет скорость уже созданного порта и обновляет curr_baud. */ void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed); // Transmit a character from the SCI' #define SCI_send(x,y) x->SciRegs->SCITXBUF=(unsigned char)(y) // Ожидание завершениа передачи UART // wait for TRDY =1 for empty state #define RS_Wait4OK(x) while(!(x->SciRegs->SCICTL2.bit.TXEMPTY)) /** Переключение линии на прием */ #define RS_Line_to_receive(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1; /** Переключение линии на передачу */ #define RS_Line_to_send(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0; /** Разрешение прерываний по получению символа и ошибкам от UART */ #define enableUARTInt(x) x->SciRegs->SCICTL2.all=2 #define enableUARTIntW(x) x->SciRegs->SCICTL2.all=1 /** Сбрасывает таймер контроля активности после корректного обмена. */ void clear_timer_rs_live(RS_DATA *rs_arr); /** Обновляет признак потери связи по тайм-ауту RS_TIME_OUT. */ void test_rs_live(RS_DATA *rs_arr); #ifdef __cplusplus } #endif #endif /* _RS485 */