123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- #include <p33FJ64MC204.h>
- #include <stdlib.h>
- #include <math.h>
- #include "UART.h"
- #include "string.h"
- #include "Instrument_EEPROM_Param.h"
- #include "IO.h"
- #include "command.h"
- /**********************************************/
- unsigned char g_ucCMD,g_ucUART1_flag,g_ucUART2_flag=0;
- unsigned int g_uiUart1_No=0;
- unsigned char g_ucUart1_Send_Data[SEND_NUM],g_ucUart1_Receive_Data[RECEIVE_NUM];
- unsigned char g_ucUart2_Send_Data[SEND_NUM],g_ucUart2_Receive_Data[RECEIVE_NUM];
- unsigned char g_ucHeaderFlag1 = 0;
- unsigned char g_ucHeaderFlag2 = 0;
- unsigned int g_uiUart2_No=0;
- unsigned int uiReceive1_Counter;
- unsigned int g_uiLth = 0,g_uiLth2 = 0;
- unsigned char g_ucCRC,g_ucCRC2;
- unsigned long g_ulRSUM,g_ulRSUM2;
- unsigned int g_uiFrmLth;
- unsigned char g_BUSY = 0,g_BUSY2 = 0,g_BUSY3=0,g_BUSY4=0;
- /*******************************************************************************
- * 函数名称:InitUart1
- *******************************************************************************/
- void InitUart1(void)
- {
- /****************************************************/
- _TRISC6 = 0;
- _TRISC8 = 1;
- _RP22R = 0x03;
- _U1RXR = 0x18;
- U1MODEbits.STSEL = 0;
- U1MODEbits.PDSEL = 0;
- U1MODEbits.BRGH = 0;
- U1MODEbits.ABAUD = 0;
- U1MODEbits.LPBACK = 0;
- U1BRG=259;
- U1STAbits.UTXISEL0 = 1;
- U1STAbits.UTXISEL1 = 0;
- U1STAbits.URXISEL = 0;
- IEC0bits.U1TXIE = 0;
- IEC0bits.U1RXIE = 1;
- U1MODEbits.UARTEN = 1;
- U1STAbits.UTXEN = 1;
- IPC2bits.U1RXIP = 6;
- }
- /*******************************************************************************
- * 函数名称:InitUart2
- *******************************************************************************/
- void InitUart2(void)
- {
- _TRISB8 = 0;
- _TRISB9 = 1;
- _RP8R = 0x05;
- _U2RXR = 0x09;
- U2MODEbits.STSEL=0;
- U2MODEbits.PDSEL=0;
- U2MODEbits.BRGH=0;
- U2MODEbits.ABAUD=0;
- U2MODEbits.LPBACK=0;
- U2BRG=259;
- U2STAbits.UTXISEL0=1;
- U2STAbits.UTXISEL1=0;
- U2STAbits.URXISEL=0;
- IEC1bits.U2TXIE=0;
- IEC1bits.U2RXIE=1;
- U2MODEbits.UARTEN=1;
- U2STAbits.UTXEN=1;
- IPC7bits.U2RXIP=7;
- IPC7bits.U2TXIP=7;
- }
- /*******************************************************************************
- * 函数名称:Uart1Send
- *******************************************************************************/
- void UART1SEND(char data)
- {
- U1TXREG = data;
- while(!IFS0bits.U1TXIF);
- IFS0bits.U1TXIF=0;
- }
- void UART2SEND(char data)
- {
- U2TXREG = data;
- while(!IFS1bits.U2TXIF);
- IFS1bits.U2TXIF=0;
- }
- void RS1_Ack(unsigned int sendnum)
- {
- unsigned int i;
- for(i=0;i<sendnum;i++)
- {
- UART1SEND(g_ucUart1_Send_Data[i]);
- }
- memset(g_ucUart1_Send_Data,0,sendnum*sizeof(unsigned char));
- }
- void RS2_Ack(unsigned int sendnum)
- {
- unsigned int i;
- for(i=0;i<sendnum;i++)
- {
- UART2SEND(g_ucUart2_Send_Data[i]);
- }
- memset(g_ucUart2_Send_Data,0,sendnum*sizeof(unsigned char));
- }
- /*******************************************************************************
- * 函数名称:CalculateSum
- *******************************************************************************/
- unsigned long int CalculateSum(unsigned char *p,unsigned int num)
- {
- unsigned int i=0;
- unsigned long int uiCheckSum=0;
- for(i = 0;i < num;i++)
- {
- uiCheckSum += *p;
- p++;
- }
- return uiCheckSum;
- }
- /*******************************************************************************
- * 函数名称:CalculateSum
- *******************************************************************************/
- unsigned int CalculateCharSum(unsigned char *p,unsigned char num)
- {
- unsigned char i=0;
- unsigned int uiCheckSum=0;
- for(i = 0;i < num;i ++)
- {
- uiCheckSum += *p;
- p++;
- }
- return uiCheckSum;
- }
- /*******************************************************************************
- * 函数名称:_U1RXInterrupt
- *******************************************************************************/
- void __attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void)
- {
- IFS0bits.U1RXIF = 0;
- g_ucUart1_Receive_Data[g_uiUart1_No] = U1RXREG;
- if(g_BUSY == 1) return;
- if(g_ucHeaderFlag1 == 0)
- {
- if(g_ucUart1_Receive_Data[g_uiUart1_No] == FRAME_HEAD)
- {
- g_ucHeaderFlag1 = 1;
- g_ucUart1_Receive_Data[0] = FRAME_HEAD;
- g_uiUart1_No = 1;
- }
- else
- {
- g_BUSY = 0;
- }
- }
- else if(g_ucHeaderFlag1 == 1)
- {
- g_uiUart1_No++;
- }
- if(g_uiUart1_No >4)//(FRAME_LTHL_INDEX+1))
- {
- g_uiLth = g_ucUart1_Receive_Data[FRAME_LTHH_INDEX] ;
- g_uiLth = (g_uiLth<<8) + g_ucUart1_Receive_Data[FRAME_LTHL_INDEX];
-
- if(g_uiUart1_No == g_uiLth)
- {
- g_ulRSUM = CalculateCharSum(g_ucUart1_Receive_Data,g_uiLth-1);
- g_ucCRC = (unsigned char)g_ulRSUM;//
- if(g_ucCRC == g_ucUart1_Receive_Data[g_uiLth-1])
- {
- g_ucCMD = g_ucUart1_Receive_Data[FRAME_CMD_INDEX];
- g_ulRSUM = 0;
- g_uiUart1_No = 0;
- g_ucHeaderFlag1 = 0;
- if(g_ucCMD==Command_Execution_Status||g_ucCMD==stop)
- {
- g_BUSY3 = 1;
- g_BUSY = 1;
- }
- else
- {
- g_ucUART1_flag = 1;
- g_BUSY = 1;
- }
- }
- else
- {
- memset(g_ucUart1_Receive_Data,0,g_uiLth*sizeof(unsigned char));
- g_BUSY = 0;
- }
- }
- else if(g_uiUart1_No > g_uiLth)
- {
- g_uiUart1_No = 0;
- g_ucHeaderFlag1 = 0;
- g_BUSY = 0;
- }
- }
- }
- /*******************************************************************************
- * 函数名称:_U2RXInterrupt
- *******************************************************************************/
- void __attribute__((__interrupt__,no_auto_psv)) _U2RXInterrupt(void)
- {
- IFS1bits.U2RXIF = 0;
- g_ucUart2_Receive_Data[g_uiUart2_No] = U2RXREG;
- if(g_BUSY2 == 1) return;
- if(g_ucHeaderFlag2 == 0)
- {
- if(g_ucUart2_Receive_Data[g_uiUart2_No] == FRAME_HEAD)
- {
- g_ucHeaderFlag2 = 1;
- g_ucUart2_Receive_Data[0] = FRAME_HEAD;
- g_uiUart2_No = 1;
- }
- else
- {
- g_BUSY2 = 0;
- }
- }
- else if(g_ucHeaderFlag2 == 1)
- {
- g_uiUart2_No++;
- }
- if(g_uiUart2_No >4)
- {
- g_uiLth2 = g_ucUart2_Receive_Data[FRAME_LTHH_INDEX] ;
- g_uiLth2 = (g_uiLth2<<8) + g_ucUart2_Receive_Data[FRAME_LTHL_INDEX];
- if(g_uiUart2_No == g_uiLth2)
- {
- g_ulRSUM2 = CalculateCharSum(g_ucUart2_Receive_Data,g_uiLth2-1);
- g_ucCRC2 = (unsigned char)g_ulRSUM2;//
- if(g_ucCRC2 == g_ucUart2_Receive_Data[g_uiLth2-1])
- {
- g_ucCMD = g_ucUart2_Receive_Data[FRAME_CMD_INDEX];
- g_ulRSUM2 = 0;
- g_uiUart2_No = 0;
- g_ucHeaderFlag2 = 0;
- if(g_ucCMD==Command_Execution_Status)
- {
- g_BUSY4=1;
- g_BUSY2 = 1;
- }
- else
- {
- g_ucUART2_flag = 1;
- g_BUSY2 = 1;
- }
- //处理代码中...暂不接受指令;
- }
- else
- {
- memset(g_ucUart2_Receive_Data,0,g_uiLth2*sizeof(unsigned char));
- g_BUSY2 = 0;
- }
- }
- else if(g_uiUart2_No > g_uiLth2)
- {
- g_uiUart2_No = 0;
- g_ucHeaderFlag2 = 0;
- g_BUSY2 = 0;
- }
- }
- }
- static const unsigned short crc16tab[256]=
- {
- 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
- 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
- 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
- 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
- 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
- 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
- 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
- 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
- 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
- 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
- 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
- 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
- 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
- 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
- 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
- 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
- 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
- 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
- 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
- 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
- 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
- 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
- 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
- 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
- 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
- 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
- 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
- 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
- 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
- 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
- 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
- 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
- };
-
- unsigned short crc16_ccitt(unsigned char *buf, int len)
- {
- register int counter;
- register unsigned short crc = 0;
- for( counter = 0; counter < len; counter++)
- crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(char *)buf++)&0x00FF];
- return crc;
- }
|