|
@@ -4,26 +4,15 @@
|
|
|
/*******************************************************************************
|
|
/*******************************************************************************
|
|
|
* 函数名称:Check
|
|
* 函数名称:Check
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
-#define OUTTIME2S 200
|
|
|
|
|
-#define OUTTIME60S 6000
|
|
|
|
|
-unsigned char g_ucTX_DMA[MAX_UART_BUFFER_SIZE] __attribute__((eds));
|
|
|
|
|
-
|
|
|
|
|
-uint32_t uart1_header = 0;
|
|
|
|
|
-uint32_t uart1_last = 0;
|
|
|
|
|
-uint32_t uart4_header = 0;
|
|
|
|
|
-uint32_t uart4_last = 0;
|
|
|
|
|
-uint32_t uart1_recOK = 0;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-extern unsigned int ms10_conter;
|
|
|
|
|
-unsigned int Check(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;
|
|
|
|
|
|
|
+unsigned int Check(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;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void InitUart1(void){
|
|
void InitUart1(void){
|
|
@@ -33,47 +22,21 @@ void InitUart1(void){
|
|
|
U1MODEbits.ABAUD = 0;
|
|
U1MODEbits.ABAUD = 0;
|
|
|
U1MODEbits.LPBACK = 0;
|
|
U1MODEbits.LPBACK = 0;
|
|
|
|
|
|
|
|
- // U1BRG = 31;
|
|
|
|
|
- // U1BRG = 259;
|
|
|
|
|
- U1BRG = 0x67;
|
|
|
|
|
-
|
|
|
|
|
- U1STAbits.UTXISEL1 = 0;
|
|
|
|
|
- U1STAbits.UTXISEL0 = 1;
|
|
|
|
|
- U1STAbits.URXISEL = 0;
|
|
|
|
|
-
|
|
|
|
|
- IEC0bits.U1TXIE = 0;
|
|
|
|
|
- IEC0bits.U1RXIE = 1;
|
|
|
|
|
- U1MODEbits.UARTEN = 1;
|
|
|
|
|
- U1STAbits.UTXEN = 1;
|
|
|
|
|
- IPC2bits.U1RXIP = 7;
|
|
|
|
|
- IPC3bits.U1TXIP = 7;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- _U1TXIF = 0; // Clear UART TX IF to prevent erroneous DMA operation
|
|
|
|
|
- // Configure DMA channel
|
|
|
|
|
- DMACH5 = 0;
|
|
|
|
|
- DMACH5bits.SAMODE = 1; // Source Address incremented after operation
|
|
|
|
|
- DMACH5bits.DAMODE = 0; // Destination Address unchanged after operation
|
|
|
|
|
- DMACH5bits.TRMODE = 0; // One Shot Mode
|
|
|
|
|
- DMACH5bits.SIZE = 1; // Transfer size of 1 byte
|
|
|
|
|
-
|
|
|
|
|
- DMAINT5 = 0;
|
|
|
|
|
- DMAINT5bits.CHSEL = 68; // DMA Trigger is U4 TX Interrupt
|
|
|
|
|
-
|
|
|
|
|
- DMADST5 = (uint16_t)&U1TXREG;
|
|
|
|
|
-
|
|
|
|
|
- // Set up interrupts and interrupt priorities as desired
|
|
|
|
|
- _DMA5IF = 0;
|
|
|
|
|
- _DMA5IE = 0;
|
|
|
|
|
- _DMA5IP = 3;
|
|
|
|
|
-
|
|
|
|
|
- _U1RXIF = 0;
|
|
|
|
|
- _U1RXIE = 1;
|
|
|
|
|
- _U1RXIP = 3;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+ // U1BRG = 31;
|
|
|
|
|
+// U1BRG = 259;
|
|
|
|
|
+ U1BRG =0x67;
|
|
|
|
|
+
|
|
|
|
|
+ U1STAbits.UTXISEL0 = 1;
|
|
|
|
|
+ U1STAbits.UTXISEL1 = 0;
|
|
|
|
|
+ U1STAbits.URXISEL = 0;
|
|
|
|
|
+
|
|
|
|
|
+ IEC0bits.U1TXIE = 0;
|
|
|
|
|
+ IEC0bits.U1RXIE = 1;
|
|
|
|
|
+ U1MODEbits.UARTEN = 1;
|
|
|
|
|
+ U1STAbits.UTXEN = 1;
|
|
|
|
|
+ IPC2bits.U1RXIP = 7;
|
|
|
|
|
+ IPC3bits.U1TXIP = 7;
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
void InitUart2(void){
|
|
void InitUart2(void){
|
|
|
|
|
|
|
@@ -98,71 +61,51 @@ void InitUart2(void){
|
|
|
IPC7bits.U2TXIP = 6;
|
|
IPC7bits.U2TXIP = 6;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
-void InitUart3(void) {
|
|
|
|
|
-
|
|
|
|
|
- U3MODEbits.STSEL = 0;
|
|
|
|
|
- U3MODEbits.PDSEL = 0;
|
|
|
|
|
- U3MODEbits.BRGH = 0;
|
|
|
|
|
- U3MODEbits.ABAUD = 0;
|
|
|
|
|
- U3MODEbits.LPBACK = 0;
|
|
|
|
|
-
|
|
|
|
|
- U3BRG = 0x67;
|
|
|
|
|
-
|
|
|
|
|
- U3STAbits.UTXISEL1 = 0;
|
|
|
|
|
- U3STAbits.UTXISEL0 = 1;
|
|
|
|
|
- U3STAbits.URXISEL = 0;
|
|
|
|
|
-
|
|
|
|
|
- IEC5bits.U3TXIE = 0;
|
|
|
|
|
- IEC5bits.U3RXIE = 1;
|
|
|
|
|
- U3MODEbits.UARTEN = 1;
|
|
|
|
|
- U3STAbits.UTXEN = 1;
|
|
|
|
|
- IPC20bits.U3RXIP = 6;
|
|
|
|
|
- IPC20bits.U3TXIP = 6;
|
|
|
|
|
|
|
+void InitUart3(void){
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ U3MODEbits.STSEL=0;
|
|
|
|
|
+ U3MODEbits.PDSEL=0;
|
|
|
|
|
+ U3MODEbits.BRGH=0;
|
|
|
|
|
+ U3MODEbits.ABAUD=0;
|
|
|
|
|
+ U3MODEbits.LPBACK=0;
|
|
|
|
|
+
|
|
|
|
|
+ U3BRG = 0x67;
|
|
|
|
|
+
|
|
|
|
|
+ U3STAbits.UTXISEL1=0;
|
|
|
|
|
+ U3STAbits.UTXISEL0=1;
|
|
|
|
|
+ U3STAbits.URXISEL=1;
|
|
|
|
|
+
|
|
|
|
|
+ IEC5bits.U3TXIE = 0;
|
|
|
|
|
+ IEC5bits.U3RXIE = 1;
|
|
|
|
|
+ U3MODEbits.UARTEN=1;
|
|
|
|
|
+ U3STAbits.UTXEN=1;
|
|
|
|
|
+ IPC20bits.U3RXIP = 6;
|
|
|
|
|
+ IPC20bits.U3TXIP = 6;
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
-void InitUart4(void) {
|
|
|
|
|
-
|
|
|
|
|
- U4MODEbits.STSEL = 0;
|
|
|
|
|
- U4MODEbits.PDSEL = 0;
|
|
|
|
|
- U4MODEbits.BRGH = 0;
|
|
|
|
|
- U4MODEbits.ABAUD = 0;
|
|
|
|
|
- U4MODEbits.LPBACK = 0;
|
|
|
|
|
-
|
|
|
|
|
- U4BRG = 0x67;
|
|
|
|
|
-
|
|
|
|
|
- U4STAbits.UTXISEL1 = 0;
|
|
|
|
|
- U4STAbits.UTXISEL0 = 1;
|
|
|
|
|
- U4STAbits.URXISEL = 1;
|
|
|
|
|
-
|
|
|
|
|
- IEC5bits.U4TXIE = 0;
|
|
|
|
|
- IEC5bits.U4RXIE = 1;
|
|
|
|
|
- U4MODEbits.UARTEN = 1;
|
|
|
|
|
- U4STAbits.UTXEN = 1;
|
|
|
|
|
- IPC22bits.U4RXIP = 6;
|
|
|
|
|
- IPC22bits.U4TXIP = 6;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- _U4TXIF = 0; // Clear UART TX IF to prevent erroneous DMA operation
|
|
|
|
|
- // Configure DMA channel
|
|
|
|
|
- DMACH4 = 0;
|
|
|
|
|
- DMACH4bits.SAMODE = 1; // Source Address incremented after operation
|
|
|
|
|
- DMACH4bits.DAMODE = 0; // Destination Address unchanged after operation
|
|
|
|
|
- DMACH4bits.TRMODE = 0; // One Shot Mode
|
|
|
|
|
- DMACH5bits.SIZE = 1; // Transfer size of 1 byte
|
|
|
|
|
-
|
|
|
|
|
- DMAINT4 = 0;
|
|
|
|
|
- DMAINT4bits.CHSEL = 59; // DMA Trigger is U4 TX Interrupt
|
|
|
|
|
-
|
|
|
|
|
- DMADST4 = (uint16_t)&U1TXREG;
|
|
|
|
|
-
|
|
|
|
|
- // Set up interrupts and interrupt priorities as desired
|
|
|
|
|
- _DMA4IF = 0;
|
|
|
|
|
- _DMA4IE = 0;
|
|
|
|
|
- _DMA4IP = 3;
|
|
|
|
|
-
|
|
|
|
|
- _U4RXIF = 0;
|
|
|
|
|
- _U4RXIE = 1;
|
|
|
|
|
- _U4RXIP = 3;
|
|
|
|
|
-
|
|
|
|
|
|
|
+void InitUart4(void){
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ U4MODEbits.STSEL=0;
|
|
|
|
|
+ U4MODEbits.PDSEL=0;
|
|
|
|
|
+ U4MODEbits.BRGH=0;
|
|
|
|
|
+ U4MODEbits.ABAUD=0;
|
|
|
|
|
+ U4MODEbits.LPBACK=0;
|
|
|
|
|
+
|
|
|
|
|
+ U4BRG = 0x67;
|
|
|
|
|
+
|
|
|
|
|
+ U4STAbits.UTXISEL1=0;
|
|
|
|
|
+ U4STAbits.UTXISEL0=1;
|
|
|
|
|
+ U4STAbits.URXISEL=1;
|
|
|
|
|
+
|
|
|
|
|
+ IEC5bits.U4TXIE = 0;
|
|
|
|
|
+ IEC5bits.U4RXIE = 1;
|
|
|
|
|
+ U4MODEbits.UARTEN=1;
|
|
|
|
|
+ U4STAbits.UTXEN=1;
|
|
|
|
|
+ IPC22bits.U4RXIP = 6;
|
|
|
|
|
+ IPC22bits.U4TXIP = 6;
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
void InitUart5(void){
|
|
void InitUart5(void){
|
|
|
|
|
|
|
@@ -210,38 +153,12 @@ void InitUart6(void){
|
|
|
IPC28bits.U6TXIP = 6;
|
|
IPC28bits.U6TXIP = 6;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
-void UART1SEND(char data) {
|
|
|
|
|
- if (g_CmdFrom_UartNum == 1) {
|
|
|
|
|
- U1TXREG = data;
|
|
|
|
|
- while (!IFS0bits.U1TXIF)
|
|
|
|
|
- ;
|
|
|
|
|
- IFS0bits.U1TXIF = 0;
|
|
|
|
|
- } else {
|
|
|
|
|
- U4TXREG = data;
|
|
|
|
|
- while (!IFS5bits.U4TXIF)
|
|
|
|
|
- ;
|
|
|
|
|
- IFS5bits.U4TXIF = 0;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-void UART1SendDma(unsigned char *txData, unsigned int len) {
|
|
|
|
|
- for (unsigned int i = 0; i < len; i++) {
|
|
|
|
|
- g_ucTX_DMA[i] = txData[i];
|
|
|
|
|
- }
|
|
|
|
|
- if (g_CmdFrom_UartNum == 1) {
|
|
|
|
|
- while (DMACH5bits.CHEN);
|
|
|
|
|
- DMASRC5 = (uint16_t)g_ucTX_DMA;
|
|
|
|
|
- DMACNT5 = len-1;
|
|
|
|
|
- DMACH5bits.CHEN = 1; // Enable DMA Channel
|
|
|
|
|
- DMACH5bits.CHREQ = 1; // Start DMA Operation
|
|
|
|
|
- } else {
|
|
|
|
|
- while (DMACH4bits.CHEN);
|
|
|
|
|
- DMASRC4 = (uint16_t)g_ucTX_DMA;
|
|
|
|
|
- DMACNT4 = len-1;
|
|
|
|
|
- DMACH4bits.CHEN = 1; // Enable DMA Channel
|
|
|
|
|
- DMACH4bits.CHREQ = 1; // Start DMA Operation
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void UART1SEND(char data)
|
|
|
|
|
+{
|
|
|
|
|
+ U1TXREG = data;
|
|
|
|
|
+ while(!IFS0bits.U1TXIF);
|
|
|
|
|
+ IFS0bits.U1TXIF=0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
void Uart1_Receive(char num){
|
|
void Uart1_Receive(char num){
|
|
|
|
|
|
|
|
U1TXREG = num;
|
|
U1TXREG = num;
|
|
@@ -309,50 +226,47 @@ void Uart6_Receive(char num){
|
|
|
IFS7bits.U6RXIF=0;
|
|
IFS7bits.U6RXIF=0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) {
|
|
|
|
|
- IFS0bits.U1RXIF = 0;
|
|
|
|
|
- g_ucU1RX_Buf[uart1_last++] = U1RXREG;
|
|
|
|
|
- if(uart1_last == MAX_UART_BUFFER_SIZE){
|
|
|
|
|
- uart1_last = 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+void __attribute__ ( ( interrupt, no_auto_psv ) ) _U1RXInterrupt( void ){
|
|
|
|
|
+ IFS0bits.U1RXIF = 0;
|
|
|
|
|
+ g_ucU1RX_Data[g_uiUart1_No] = U1RXREG;
|
|
|
|
|
+ if(g_BUSY1 == 1) return;
|
|
|
|
|
+ if(g_ucHeaderFlag1 == 0){
|
|
|
|
|
+ if(g_ucU1RX_Data[g_uiUart1_No] == FRAME_HEAD){
|
|
|
|
|
+ g_ucHeaderFlag1 = 1;
|
|
|
|
|
+ g_ucU1RX_Data[0] = FRAME_HEAD;
|
|
|
|
|
+ g_uiUart1_No = 1;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ g_BUSY1 = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else if(g_ucHeaderFlag1 == 1){
|
|
|
|
|
+ g_uiUart1_No++;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(g_uiUart1_No > (FRAME_LTHH_INDEX+1)){
|
|
|
|
|
+ g_uiLth1 = g_ucU1RX_Data[FRAME_LTHH_INDEX];
|
|
|
|
|
+ if(g_uiUart1_No == g_uiLth1){
|
|
|
|
|
+ g_ulRSUM1 = Check(g_ucU1RX_Data,g_uiLth1-1);
|
|
|
|
|
+ g_ucCRC1 = (unsigned char)g_ulRSUM1;
|
|
|
|
|
+ if(g_ucCRC1 == g_ucU1RX_Data[g_uiLth1-1]){
|
|
|
|
|
+ g_ucCMD1 = g_ucU1RX_Data[FRAME_CMD_INDEX];
|
|
|
|
|
+ g_ucUART1_flag = 1;
|
|
|
|
|
+ g_ulRSUM1 = 0;
|
|
|
|
|
+ g_uiUart1_No = 0;
|
|
|
|
|
+ g_ucHeaderFlag1 = 0;
|
|
|
|
|
+ g_BUSY1 = 1;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ memset(g_ucU1RX_Data,0,g_uiLth1*sizeof(unsigned char));
|
|
|
|
|
+ g_BUSY1 = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else if(g_uiUart1_No > g_uiLth1){
|
|
|
|
|
+ g_uiUart1_No = 0;
|
|
|
|
|
+ g_ucHeaderFlag1 = 0;
|
|
|
|
|
+ g_BUSY1 = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
-// g_ucU1RX_Data[g_uiUart1_No] = U1RXREG;
|
|
|
|
|
-// if (g_BUSY1 == 1)
|
|
|
|
|
-// return;
|
|
|
|
|
-// if (g_ucHeaderFlag1 == 0) {
|
|
|
|
|
-// if (g_ucU1RX_Data[g_uiUart1_No] == FRAME_HEAD) {
|
|
|
|
|
-// g_ucHeaderFlag1 = 1;
|
|
|
|
|
-// g_ucU1RX_Data[0] = FRAME_HEAD;
|
|
|
|
|
-// g_uiUart1_No = 1;
|
|
|
|
|
-// } else {
|
|
|
|
|
-// g_BUSY1 = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// } else if (g_ucHeaderFlag1 == 1) {
|
|
|
|
|
-// g_uiUart1_No++;
|
|
|
|
|
-// }
|
|
|
|
|
-// if (g_uiUart1_No > (FRAME_LTHH_INDEX + 1)) {
|
|
|
|
|
-// g_uiLth1 = g_ucU1RX_Data[FRAME_LTHH_INDEX];
|
|
|
|
|
-// if (g_uiUart1_No == g_uiLth1) {
|
|
|
|
|
-// g_ulRSUM1 = Check(g_ucU1RX_Data, g_uiLth1 - 1);
|
|
|
|
|
-// g_ucCRC1 = (unsigned char)g_ulRSUM1;
|
|
|
|
|
-// if (g_ucCRC1 == g_ucU1RX_Data[g_uiLth1 - 1]) {
|
|
|
|
|
-// g_ucCMD1 = g_ucU1RX_Data[FRAME_CMD_INDEX];
|
|
|
|
|
-// g_ucUART1_flag = 1;
|
|
|
|
|
-// g_CmdFrom_UartNum = 1;
|
|
|
|
|
-// g_ulRSUM1 = 0;
|
|
|
|
|
-// g_uiUart1_No = 0;
|
|
|
|
|
-// g_ucHeaderFlag1 = 0;
|
|
|
|
|
-// g_BUSY1 = 1;
|
|
|
|
|
-// } else {
|
|
|
|
|
-// memset(g_ucU1RX_Data, 0, g_uiLth1 * sizeof(unsigned char));
|
|
|
|
|
-// g_BUSY1 = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// } else if (g_uiUart1_No > g_uiLth1) {
|
|
|
|
|
-// g_uiUart1_No = 0;
|
|
|
|
|
-// g_ucHeaderFlag1 = 0;
|
|
|
|
|
-// g_BUSY1 = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void __attribute__ ( ( interrupt, no_auto_psv ) ) _U2RXInterrupt( void ){
|
|
void __attribute__ ( ( interrupt, no_auto_psv ) ) _U2RXInterrupt( void ){
|
|
@@ -434,53 +348,45 @@ void __attribute__ ( ( interrupt, no_auto_psv ) ) _U3RXInterrupt( void ){
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void __attribute__((interrupt, no_auto_psv)) _U4RXInterrupt(void) {
|
|
|
|
|
- IFS5bits.U4RXIF = 0;
|
|
|
|
|
-
|
|
|
|
|
- g_ucU4RX_Data[uart4_last++] = U4RXREG;
|
|
|
|
|
- if(uart4_last == MAX_UART_BUFFER_SIZE){
|
|
|
|
|
- uart4_last = 0;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-//
|
|
|
|
|
-// g_ucU1RX_Data[g_uiUart1_No] = U4RXREG;
|
|
|
|
|
-// if (g_BUSY1 == 1)
|
|
|
|
|
-// return;
|
|
|
|
|
-// if (g_ucHeaderFlag1 == 0) {
|
|
|
|
|
-// if (g_ucU1RX_Data[g_uiUart1_No] == FRAME_HEAD) {
|
|
|
|
|
-// g_ucHeaderFlag1 = 1;
|
|
|
|
|
-// g_ucU1RX_Data[0] = FRAME_HEAD;
|
|
|
|
|
-// g_uiUart1_No = 1;
|
|
|
|
|
-// } else {
|
|
|
|
|
-// g_BUSY1 = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// } else if (g_ucHeaderFlag1 == 1) {
|
|
|
|
|
-// g_uiUart1_No++;
|
|
|
|
|
-// }
|
|
|
|
|
-// if (g_uiUart1_No > (FRAME_LTHH_INDEX + 1)) {
|
|
|
|
|
-// g_uiLth1 = g_ucU1RX_Data[FRAME_LTHH_INDEX];
|
|
|
|
|
-// if (g_uiUart1_No == g_uiLth1) {
|
|
|
|
|
-// g_ulRSUM1 = Check(g_ucU1RX_Data, g_uiLth1 - 1);
|
|
|
|
|
-// g_ucCRC1 = (unsigned char)g_ulRSUM1;
|
|
|
|
|
-// if (g_ucCRC1 == g_ucU1RX_Data[g_uiLth1 - 1]) {
|
|
|
|
|
-// g_ucCMD1 = g_ucU1RX_Data[FRAME_CMD_INDEX];
|
|
|
|
|
-// g_ucUART1_flag = 1;
|
|
|
|
|
-// g_CmdFrom_UartNum = 4;
|
|
|
|
|
-// g_ulRSUM1 = 0;
|
|
|
|
|
-// g_uiUart1_No = 0;
|
|
|
|
|
-// g_ucHeaderFlag1 = 0;
|
|
|
|
|
-// g_BUSY1 = 1;
|
|
|
|
|
-// } else {
|
|
|
|
|
-// memset(g_ucU1RX_Data, 0, g_uiLth1 * sizeof(unsigned char));
|
|
|
|
|
-// g_BUSY1 = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// } else if (g_uiUart1_No > g_uiLth1) {
|
|
|
|
|
-// g_uiUart1_No = 0;
|
|
|
|
|
-// g_ucHeaderFlag1 = 0;
|
|
|
|
|
-// g_BUSY1 = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// }
|
|
|
|
|
|
|
+void __attribute__ ( ( interrupt, no_auto_psv ) ) _U4RXInterrupt( void ){
|
|
|
|
|
+ IFS5bits.U4RXIF = 0;
|
|
|
|
|
+ g_ucU4RX_Data[g_uiUart4_No] = U4RXREG;
|
|
|
|
|
+ if(g_BUSY4 == 1) return;
|
|
|
|
|
+ if(g_ucHeaderFlag4 == 0){
|
|
|
|
|
+ if(g_ucU4RX_Data[g_uiUart4_No] == FRAME_HEAD){
|
|
|
|
|
+ g_ucHeaderFlag4 = 1;
|
|
|
|
|
+ g_ucU4RX_Data[0] = FRAME_HEAD;
|
|
|
|
|
+ g_uiUart4_No = 1;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ g_BUSY4 = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else if(g_ucHeaderFlag4 == 1){
|
|
|
|
|
+ g_uiUart4_No++;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(g_uiUart4_No > (FRAME_LTHH_INDEX+1)){
|
|
|
|
|
+ g_uiLth4 = g_ucU4RX_Data[FRAME_LTHH_INDEX];
|
|
|
|
|
+ if(g_uiUart4_No == g_uiLth4){
|
|
|
|
|
+ g_ulRSUM4 = Check(g_ucU4RX_Data,g_uiLth4-1);
|
|
|
|
|
+ g_ucCRC4 = (unsigned char)g_ulRSUM4;
|
|
|
|
|
+ if(g_ucCRC4 == g_ucU4RX_Data[g_uiLth4-1]){
|
|
|
|
|
+ g_ucCMD4 = g_ucU4RX_Data[FRAME_CMD_INDEX];
|
|
|
|
|
+ g_ucUART4_flag = 1;
|
|
|
|
|
+ g_ulRSUM4 = 0;
|
|
|
|
|
+ g_uiUart4_No = 0;
|
|
|
|
|
+ g_ucHeaderFlag4 = 0;
|
|
|
|
|
+ g_BUSY4 = 1;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ memset(g_ucU4RX_Data,0,g_uiLth4*sizeof(unsigned char));
|
|
|
|
|
+ g_BUSY4 = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else if(g_uiUart4_No > g_uiLth4){
|
|
|
|
|
+ g_uiUart4_No = 0;
|
|
|
|
|
+ g_ucHeaderFlag4 = 0;
|
|
|
|
|
+ g_BUSY4 = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void __attribute__ ( ( interrupt, no_auto_psv ) ) _U5RXInterrupt( void ){//√
|
|
void __attribute__ ( ( interrupt, no_auto_psv ) ) _U5RXInterrupt( void ){//√
|
|
@@ -564,279 +470,6 @@ void __attribute__ ( ( interrupt, no_auto_psv ) ) _U6RXInterrupt( void ){
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-/********************************************************************
|
|
|
|
|
- * int Decode(const char *pInBuffer, int uLen)
|
|
|
|
|
- *
|
|
|
|
|
- *描述:对串口数据进行解码成结构体
|
|
|
|
|
- *参数:pInBuffer 接收缓冲区
|
|
|
|
|
- *uheader 当前头位置
|
|
|
|
|
- ulast 当前头尾位置
|
|
|
|
|
- maxlen 缓冲区长度
|
|
|
|
|
- pMessage 命令结构体
|
|
|
|
|
- pdata 命令数据
|
|
|
|
|
- *返回:1解码成功,0解码失败
|
|
|
|
|
- *其他:无
|
|
|
|
|
- *--------------------------------------------------------------------
|
|
|
|
|
- *记录:
|
|
|
|
|
- ********************************************************************/
|
|
|
|
|
-int DecodeNew(void* pMessage, uint8_t *pdata, const uint8_t *pInBuffer, uint32_t *pheader,uint32_t ulast,uint32_t maxlen)
|
|
|
|
|
-{
|
|
|
|
|
- uint32_t bufRealLen;
|
|
|
|
|
- uint32_t sizeofMessage = ALPS_MASSAGE_MIN_SIZE;
|
|
|
|
|
- uint32_t header = *pheader;
|
|
|
|
|
- uint32_t i = 0;
|
|
|
|
|
-// if (NULL == pInBuffer || NULL == pMessage || NULL == pdata || NULL == pheader)
|
|
|
|
|
- if (NULL == pInBuffer || NULL == pdata || NULL == pheader)
|
|
|
|
|
- {
|
|
|
|
|
- /*空指针判断*/
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
- /*缓冲区有效数据长度,缓冲区循环处理,会出现头大于未情况*/
|
|
|
|
|
- bufRealLen = (ulast > header)?(ulast - header):(ulast + maxlen - header);
|
|
|
|
|
- if(bufRealLen < sizeofMessage){
|
|
|
|
|
- /*长度过段,跳过*/
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
-// bufRealLen = sizeofMessage; /*最大有效数据长度*/
|
|
|
|
|
- for(; i<=(bufRealLen - sizeofMessage);){
|
|
|
|
|
- uint32_t headerflag = pInBuffer[(header + i)%maxlen];
|
|
|
|
|
-// headerflag += pInBuffer[(header + i + 1)%maxlen] <<8;
|
|
|
|
|
- if(headerflag != ALPS_HEADER_FALG){
|
|
|
|
|
- i += 1;
|
|
|
|
|
-// header = (header + 1)%maxlen;
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- uint32_t messagelen = pInBuffer[(header + i + 3)%maxlen];
|
|
|
|
|
-// messagelen += pInBuffer[(header + i + 5)%maxlen] <<8;
|
|
|
|
|
- if(messagelen > (maxlen)){
|
|
|
|
|
- /*长度超长 跳过2个字节*/
|
|
|
|
|
- i += 1;
|
|
|
|
|
-// header = (header + 1)%maxlen;
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- if(messagelen >bufRealLen){
|
|
|
|
|
- /*当前起始点可能存在数据,跳出循环,*/
|
|
|
|
|
- i++; /*for采样小于等于判断,循环次数多1,此处加1便于后续处理*/
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- uint8_t checkesum = 0;
|
|
|
|
|
- uint8_t recsum = 0;
|
|
|
|
|
- if((header + i + messagelen) < maxlen){
|
|
|
|
|
- checkesum = checkSum(pInBuffer + header + i , messagelen - 1);
|
|
|
|
|
-
|
|
|
|
|
- }else{
|
|
|
|
|
- checkesum = checkSum(pInBuffer + header + i , (maxlen - (header)));
|
|
|
|
|
- checkesum += checkSum(pInBuffer, (header + i + messagelen - 1)%maxlen);
|
|
|
|
|
- }
|
|
|
|
|
- recsum = *(pInBuffer + (header + i + messagelen - 1)%maxlen ) ;
|
|
|
|
|
-// recsum += *(pInBuffer + (header + i + 7 + messagelen)%maxlen) << 8;
|
|
|
|
|
- /*固定结尾预留做调试用*/
|
|
|
|
|
- if(checkesum != recsum ){
|
|
|
|
|
- i += 1;
|
|
|
|
|
-// header = (header + 1)%maxlen;
|
|
|
|
|
- }else{
|
|
|
|
|
- /*解析成功,拷贝消息结构体*/
|
|
|
|
|
-// uint8_t * pCharMessage = (uint8_t *)pMessage;
|
|
|
|
|
-// for(unsigned copyi=0;copyi<(sizeofMessage-2);copyi++){
|
|
|
|
|
-// *pCharMessage++ = pInBuffer[(header + i+ copyi)%maxlen];
|
|
|
|
|
-// }
|
|
|
|
|
-// (*pMessage).tail = MINI7_TAIL_FALG;
|
|
|
|
|
-
|
|
|
|
|
- /*解析成功,拷贝数据结构体*/
|
|
|
|
|
- for(unsigned copyi=0;copyi<messagelen;copyi++){
|
|
|
|
|
- *pdata++ = pInBuffer[(header + i + copyi)%maxlen];
|
|
|
|
|
- }
|
|
|
|
|
- *pheader = (header + messagelen + i )%maxlen;
|
|
|
|
|
- return 1;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- *pheader = (header + i - 1)%maxlen;
|
|
|
|
|
- return 0;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-/*******************************************************************************
|
|
|
|
|
- * 函数名称: unPack_Cmd 串口消息解码
|
|
|
|
|
- *******************************************************************************/
|
|
|
|
|
-
|
|
|
|
|
-void unPack_Cmd(void){
|
|
|
|
|
- if(((uart1_last + MAX_UART_BUFFER_SIZE - uart1_header) % MAX_UART_BUFFER_SIZE ) >= ALPS_MASSAGE_MIN_SIZE)
|
|
|
|
|
- {
|
|
|
|
|
- uart1_recOK = DecodeNew(NULL,g_ucU1RX_Data,g_ucU1RX_Buf, &uart1_header,uart1_last,MAX_UART_BUFFER_SIZE);
|
|
|
|
|
- if(uart1_recOK){
|
|
|
|
|
- if(g_BUSY1){
|
|
|
|
|
- /*忙应答*/
|
|
|
|
|
- }else{
|
|
|
|
|
- g_BUSY1 = 1;
|
|
|
|
|
- g_ucUART1_flag = 1;
|
|
|
|
|
- g_CmdFrom_UartNum = 1;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- else if(((uart4_last + MAX_UART_BUFFER_SIZE - uart4_header) % MAX_UART_BUFFER_SIZE ) >= ALPS_MASSAGE_MIN_SIZE)
|
|
|
|
|
- {
|
|
|
|
|
- uart1_recOK = DecodeNew(NULL,g_ucU1RX_Data,g_ucU4RX_Buf, &uart4_header,uart4_last,MAX_UART_BUFFER_SIZE);
|
|
|
|
|
- if(uart1_recOK){
|
|
|
|
|
- if(g_BUSY1){
|
|
|
|
|
- /*忙应答*/
|
|
|
|
|
- }else{
|
|
|
|
|
- g_BUSY1 = 1;
|
|
|
|
|
- g_ucUART1_flag = 1;
|
|
|
|
|
- g_CmdFrom_UartNum = 1;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-/*******************************************************************************
|
|
|
|
|
- * 函数名称:Uart1_Ack
|
|
|
|
|
- *******************************************************************************/
|
|
|
|
|
-
|
|
|
|
|
-void Uart1_Ack_new(void) {
|
|
|
|
|
- unsigned int g_uiFrmLth;
|
|
|
|
|
- unsigned int sendTime;
|
|
|
|
|
- unsigned int outTime = OUTTIME2S;
|
|
|
|
|
- switch (g_ucCMD1) {
|
|
|
|
|
- case READ_EEPROM:
|
|
|
|
|
- case WRITE_EEPROM: {
|
|
|
|
|
- if (g_ucU1RX_Data[2] == 0) {
|
|
|
|
|
- if ((ulEE_address >= 0x0000) && (ulEE_address <= 0x1FFF)) {
|
|
|
|
|
- g_ucU1RX_Data[2] = 1;
|
|
|
|
|
- g_ucU1RX_Data[g_ucU1RX_Data[3] - 1] += 1;
|
|
|
|
|
- } else if ((ulEE_address >= 0x2000) && (ulEE_address <= 0xFFFF)) {
|
|
|
|
|
- g_ucU1RX_Data[2] = 2;
|
|
|
|
|
- g_ucU1RX_Data[g_ucU1RX_Data[3] - 1] += 2;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- } break;
|
|
|
|
|
- case PCR_RDTEMP:
|
|
|
|
|
- case RD_PCRDATA:
|
|
|
|
|
- case PCR_MOTOR:
|
|
|
|
|
- outTime = OUTTIME60S;
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- switch (g_ucU1RX_Data[2]) {
|
|
|
|
|
- case 0: {
|
|
|
|
|
- g_uiFrmLth = 6;
|
|
|
|
|
- g_ucU1TX_Data[0] = FRAME_HEAD;
|
|
|
|
|
- g_ucU1TX_Data[1] = g_ucCMD1 | 0X80;
|
|
|
|
|
- g_ucU1TX_Data[2] = 0;
|
|
|
|
|
- g_ucU1TX_Data[3] = g_uiFrmLth & 0xff;
|
|
|
|
|
- g_ucU1TX_Data[4] = 0;
|
|
|
|
|
- g_ucU1TX_Data[5] = (unsigned char)Check(g_ucU1TX_Data, g_uiFrmLth - 1);
|
|
|
|
|
-// for (unsigned int n = 0; n < g_ucU1TX_Data[3]; n++) {
|
|
|
|
|
-// UART1SEND(g_ucU1TX_Data[n]);
|
|
|
|
|
-// }
|
|
|
|
|
- UART1SendDma(g_ucU1TX_Data,g_uiFrmLth);
|
|
|
|
|
-
|
|
|
|
|
- } break;
|
|
|
|
|
- case 1: {
|
|
|
|
|
- for (unsigned int n = 0; n < g_ucU1RX_Data[3]; n++) {
|
|
|
|
|
- UART2SEND(g_ucU1RX_Data[n]);
|
|
|
|
|
- }
|
|
|
|
|
- sendTime = ms10_conter;
|
|
|
|
|
- while (!g_ucUART2_flag && (ms10_conter - sendTime) < outTime)
|
|
|
|
|
- ;
|
|
|
|
|
- if (!g_ucUART2_flag) {
|
|
|
|
|
- g_uiFrmLth = 6;
|
|
|
|
|
- g_ucU1TX_Data[0] = FRAME_HEAD;
|
|
|
|
|
- g_ucU1TX_Data[1] = g_ucCMD1 | 0X80;
|
|
|
|
|
- g_ucU1TX_Data[2] = 1;
|
|
|
|
|
- g_ucU1TX_Data[3] = g_uiFrmLth & 0xff;
|
|
|
|
|
- g_ucU1TX_Data[4] = EnmErrCode_errTimeOut;
|
|
|
|
|
- g_ucU1TX_Data[5] = (unsigned char)Check(g_ucU1TX_Data, g_uiFrmLth - 1);
|
|
|
|
|
- for (unsigned int n = 0; n < g_ucU1TX_Data[3]; n++) {
|
|
|
|
|
- UART1SEND(g_ucU1TX_Data[n]);
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- g_ucU2RX_Data[0] = FRAME_HEAD;
|
|
|
|
|
- g_ucU2RX_Data[1] = g_ucCMD1 | 0X80;
|
|
|
|
|
- g_ucU2RX_Data[2] = 1;
|
|
|
|
|
- g_uiFrmLth = g_ucU2RX_Data[3];
|
|
|
|
|
- g_ucU2RX_Data[g_uiFrmLth - 1] =
|
|
|
|
|
- (unsigned char)Check(g_ucU2RX_Data, g_uiFrmLth - 1);
|
|
|
|
|
- for (unsigned int n = 0; n < g_ucU2RX_Data[3]; n++) {
|
|
|
|
|
- UART1SEND(g_ucU2RX_Data[n]);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- g_ucUART2_flag = 0;
|
|
|
|
|
- g_BUSY2 = 0;
|
|
|
|
|
-
|
|
|
|
|
- } break;
|
|
|
|
|
- case 2: {
|
|
|
|
|
- g_ucU3TX_Data[0] = FRAME_HEAD1;
|
|
|
|
|
- g_ucU3TX_Data[1] = g_ucCMD1;
|
|
|
|
|
- g_ucU3TX_Data[2] = 2;
|
|
|
|
|
- g_ucU3TX_Data[3] = 0;
|
|
|
|
|
- g_ucU3TX_Data[4] = g_ucU1RX_Data[3] + 1; // 6
|
|
|
|
|
- g_uiFrmLth = g_ucU3TX_Data[4];
|
|
|
|
|
- for (unsigned int i = 4; i < g_ucU1RX_Data[3]; i++) {
|
|
|
|
|
- g_ucU3TX_Data[i + 1] = g_ucU1RX_Data[i];
|
|
|
|
|
- }
|
|
|
|
|
- g_ucU3TX_Data[g_uiFrmLth - 1] =
|
|
|
|
|
- (unsigned char)Check(g_ucU3TX_Data, g_uiFrmLth - 1);
|
|
|
|
|
- for (unsigned int n = 0; n < g_ucU3TX_Data[4]; n++) {
|
|
|
|
|
- UART3SEND(g_ucU3TX_Data[n]);
|
|
|
|
|
- }
|
|
|
|
|
- sendTime = ms10_conter;
|
|
|
|
|
- while (!g_ucUART2_flag && (ms10_conter - sendTime) < outTime)
|
|
|
|
|
- ;
|
|
|
|
|
- if (!g_ucUART2_flag) {
|
|
|
|
|
- g_uiFrmLth = 6;
|
|
|
|
|
- g_ucU1TX_Data[0] = FRAME_HEAD;
|
|
|
|
|
- g_ucU1TX_Data[1] = g_ucCMD1 | 0X80;
|
|
|
|
|
- g_ucU1TX_Data[2] = 1;
|
|
|
|
|
- g_ucU1TX_Data[3] = g_uiFrmLth & 0xff;
|
|
|
|
|
- g_ucU1TX_Data[4] = EnmErrCode_errTimeOut;
|
|
|
|
|
- } else {
|
|
|
|
|
- g_ucU1TX_Data[0] = FRAME_HEAD;
|
|
|
|
|
- g_ucU1TX_Data[1] = g_ucCMD1 | 0X80;
|
|
|
|
|
- g_ucU1TX_Data[2] = 2;
|
|
|
|
|
- g_ucU1TX_Data[3] = g_ucU3RX_Data[4] - 1;
|
|
|
|
|
- g_uiFrmLth = g_ucU1TX_Data[3];
|
|
|
|
|
- for (unsigned int i = 4; i < g_ucU3RX_Data[4]; i++) {
|
|
|
|
|
- g_ucU1TX_Data[i] = g_ucU4RX_Data[i + 1];
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- g_ucU1TX_Data[g_uiFrmLth - 1] =
|
|
|
|
|
- (unsigned char)Check(g_ucU1TX_Data, g_uiFrmLth - 1);
|
|
|
|
|
- for (unsigned int n = 0; n < g_ucU1TX_Data[3]; n++) {
|
|
|
|
|
- UART1SEND(g_ucU1TX_Data[n]);
|
|
|
|
|
- }
|
|
|
|
|
- g_ucUART3_flag = 0;
|
|
|
|
|
- g_BUSY3 = 0;
|
|
|
|
|
-
|
|
|
|
|
- } break;
|
|
|
|
|
- default: {
|
|
|
|
|
- g_uiFrmLth = 6;
|
|
|
|
|
- g_ucU1TX_Data[0] = FRAME_HEAD;
|
|
|
|
|
- g_ucU1TX_Data[1] = g_ucCMD1 | 0X80;
|
|
|
|
|
- g_ucU1TX_Data[2] = 0;
|
|
|
|
|
- g_ucU1TX_Data[3] = g_uiFrmLth & 0xff;
|
|
|
|
|
- g_ucU1TX_Data[4] = EnmErrCode_errPara1;
|
|
|
|
|
- g_ucU1TX_Data[5] = (unsigned char)Check(g_ucU1TX_Data, g_uiFrmLth - 1);
|
|
|
|
|
- for (unsigned int n = 0; n < g_ucU1TX_Data[3]; n++) {
|
|
|
|
|
- UART1SEND(g_ucU1TX_Data[n]);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- } break;
|
|
|
|
|
- }
|
|
|
|
|
- g_ucUART1_flag = 0;
|
|
|
|
|
- g_uiUart1_No = 0;
|
|
|
|
|
- g_ucHeaderFlag1 = 0;
|
|
|
|
|
- memset(g_ucU1RX_Data, 0, g_uiLth1 * sizeof(unsigned char));
|
|
|
|
|
- g_BUSY1 = 0;
|
|
|
|
|
- g_CmdFrom_UartNum = 0;
|
|
|
|
|
-}
|
|
|
|
|
/*******************************************************************************
|
|
/*******************************************************************************
|
|
|
* 函数名称:Uart1_Ack
|
|
* 函数名称:Uart1_Ack
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|