/****************************************************************/ /* 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 */ 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*/ void create_uart_vars(char size_cmd15); /** Повторнаа инициализациа последовательного порта, используетса после подвиса */ /** Настройка режима приема/передачи */ 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 */ 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 */ int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len); /** Инициализациа последовательного порта */ void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */ void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop); 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); void test_rs_live(RS_DATA *rs_arr); #ifdef __cplusplus } #endif #endif /* _RS485 */