/****************************************************************/ /* 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 */