|
@@ -4,15 +4,26 @@
|
|
|
/*******************************************************************************
|
|
/*******************************************************************************
|
|
|
* 函数名称:Check
|
|
* 函数名称:Check
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
-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;
|
|
|
|
|
|
|
+#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;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void InitUart1(void){
|
|
void InitUart1(void){
|
|
@@ -22,21 +33,47 @@ void InitUart1(void){
|
|
|
U1MODEbits.ABAUD = 0;
|
|
U1MODEbits.ABAUD = 0;
|
|
|
U1MODEbits.LPBACK = 0;
|
|
U1MODEbits.LPBACK = 0;
|
|
|
|
|
|
|
|
- // 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;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ // 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;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
void InitUart2(void){
|
|
void InitUart2(void){
|
|
|
|
|
|
|
@@ -61,51 +98,71 @@ 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=1;
|
|
|
|
|
-
|
|
|
|
|
- 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 = 0;
|
|
|
|
|
+
|
|
|
|
|
+ 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;
|
|
|
|
|
-
|
|
|
|
|
|
|
+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 InitUart5(void){
|
|
void InitUart5(void){
|
|
|
|
|
|
|
@@ -153,12 +210,38 @@ void InitUart6(void){
|
|
|
IPC28bits.U6TXIP = 6;
|
|
IPC28bits.U6TXIP = 6;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
-void UART1SEND(char data)
|
|
|
|
|
-{
|
|
|
|
|
- U1TXREG = data;
|
|
|
|
|
- while(!IFS0bits.U1TXIF);
|
|
|
|
|
- IFS0bits.U1TXIF=0;
|
|
|
|
|
|
|
+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 Uart1_Receive(char num){
|
|
void Uart1_Receive(char num){
|
|
|
|
|
|
|
|
U1TXREG = num;
|
|
U1TXREG = num;
|
|
@@ -226,47 +309,50 @@ void Uart6_Receive(char num){
|
|
|
IFS7bits.U6RXIF=0;
|
|
IFS7bits.U6RXIF=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;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+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;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+// 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 ){
|
|
@@ -348,45 +434,53 @@ void __attribute__ ( ( interrupt, no_auto_psv ) ) _U3RXInterrupt( void ){
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-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)) _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 ) ) _U5RXInterrupt( void ){//√
|
|
void __attribute__ ( ( interrupt, no_auto_psv ) ) _U5RXInterrupt( void ){//√
|
|
@@ -470,6 +564,279 @@ 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
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|