Browse Source

接收发送扩展帧进行程序升级,控制器在app中自锁电平。

Ye Jin 5 months ago
parent
commit
0986e8962f

+ 5 - 5
User project/1.FrameLayer/Source/gd32f30x_it.c

@@ -354,11 +354,11 @@ void CAN0_RX1_IRQHandler(void)
 //        OVtim++;
 //    } //等待发送结束
         
-    if(pRxMsg2->rx_ff != CAN_FF_STANDARD)
-    {
-        can_interrupt_enable(CAN0, CAN_INT_RFF1);
-        return;
-    }
+//    if(pRxMsg2->rx_ff != CAN_FF_STANDARD)
+//    {
+//        can_interrupt_enable(CAN0, CAN_INT_RFF1);
+//        return;
+//    }
         
     CANFrame_Rx_ISR();
     

+ 5 - 0
User project/3.BasicFunction/Include/giant_can.h

@@ -23,6 +23,9 @@
  *
  ****************************************/
 #define MAXFRAME_SIZE 16
+//DriveChain Dir -for updata
+#define MC_FILEMAINDIR       0x0006
+#define MC_FILESUBDIR        0x0100
 //Data Frame- Function group
 #define FG_NETWORKMANAGER    0x0
 #define FG_EVENT             0x1
@@ -77,6 +80,7 @@ typedef struct
 typedef struct
 {
     ULONG id;                                                   /*!< standard format frame identifier */
+    UBYTE rx_ff;                                                      /*!< format of frame, standard or extended format */
     UBYTE rx_ft;                                                      /*!< type of frame, data or remote */
     UBYTE rx_dlen;                                                    /*!< data length */
     UBYTE rx_data[8];                                                 /*!< receive data */
@@ -141,6 +145,7 @@ void giant_CANRxData_Process(void);
 void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr);
 void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr);
 void giant_SendRemote(UBYTE motiongroup);
+void giant_SendExtendData(UBYTE dataaddr, UBYTE datatype, UBYTE *data, UBYTE len);
 void giant_DataProcess(void);
 SLONG giant_slPolynomial(const SWORD *value);
 /************************************************************************/

+ 67 - 3
User project/3.BasicFunction/Source/giant_can.c

@@ -130,7 +130,15 @@ void giant_10msTask(void)
 
 void CANFrame_Rx_ISR(void)
 {
-    stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].id = (UWORD)pRxMsg2->rx_sfid;
+    if(pRxMsg2->rx_ff == CAN_FF_STANDARD)
+    {
+        stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].id = pRxMsg2->rx_sfid;
+    }
+    else if(pRxMsg2->rx_ff == CAN_FF_EXTENDED)
+    {
+        stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].id = pRxMsg2->rx_efid;
+    }
+    stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].rx_ff = (UBYTE)pRxMsg2->rx_ff;
     stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].rx_ft = (UBYTE)pRxMsg2->rx_ft;
     stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].rx_dlen = (UBYTE)pRxMsg2->rx_dlen;
     memcpy(stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].rx_data, (uint8_t*)pRxMsg2->rx_data, pRxMsg2->rx_dlen);
@@ -155,7 +163,36 @@ void giant_CANRxData_Process(void)
   {
     CAN_ReceiveFrame_tmp = &stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameRdInde];
     
-    if(CAN_ReceiveFrame_tmp->rx_ft == CAN_FT_DATA)
+    if(CAN_ReceiveFrame_tmp->rx_ff == CAN_FF_EXTENDED)
+    {
+        stGiantStandardDataFrameID_rx.FunctionGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x38000)>>15);
+        stGiantStandardDataFrameID_rx.NodeGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x07E00)>>9);
+        stGiantStandardDataFrameID_rx.DataBehaviors = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x001C0)>>6);
+        stGiantStandardDataFrameID_rx.DataAddress = (UBYTE)(CAN_ReceiveFrame_tmp->id & 0x0003F);
+        
+        if(stGiantStandardDataFrameID_rx.NodeGroup == NODE_SERVICETOOL)
+        {
+            if((stGiantStandardDataFrameID_rx.DataAddress == 0x1) && (CAN_ReceiveFrame_tmp->rx_dlen == 6))
+            {
+                UWORD Filemain_dir = ((CAN_ReceiveFrame_tmp->rx_data[1]) + (CAN_ReceiveFrame_tmp->rx_data[2]<<8));
+                UWORD Filesub_dir = ((CAN_ReceiveFrame_tmp->rx_data[3]) + (CAN_ReceiveFrame_tmp->rx_data[4]<<8));
+                if(((CAN_ReceiveFrame_tmp->rx_data[0] & 0x3F) == NODE_DRIVECHAIN) && (Filemain_dir == MC_FILEMAINDIR) && (Filesub_dir == MC_FILESUBDIR))
+                {
+                    if((CAN_ReceiveFrame_tmp->rx_data[5] & 0x0F) == 0x01)
+                    {
+                        UBYTE reply_data[6];
+                        memcpy(reply_data, CAN_ReceiveFrame_tmp->rx_data, CAN_ReceiveFrame_tmp->rx_dlen);
+                        reply_data[5] = 0x10;
+                        giant_SendExtendData(0x01, DB_ACTIVEDATA, reply_data, CAN_ReceiveFrame_tmp->rx_dlen);
+                        
+                        power_stPowStateOut.powerstate = POWER_RESET;
+                        power_stPowStateOut.blPowerStartupFlg = FALSE;
+                    }
+                }
+            }
+        }
+    }
+    else if(CAN_ReceiveFrame_tmp->rx_ft == CAN_FT_DATA)//Standard
     {
         stGiantStandardDataFrameID_rx.FunctionGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x600)>>9);
         stGiantStandardDataFrameID_rx.NodeGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x1E0)>>5);
@@ -351,7 +388,7 @@ void giant_CANRxData_Process(void)
                 break;
         }
     }
-    else if(CAN_ReceiveFrame_tmp->rx_ft == CAN_FT_REMOTE)
+    else if(CAN_ReceiveFrame_tmp->rx_ft == CAN_FT_REMOTE)//Standard
     {
         stGiantStandardRemoteFrameID_rx.MotionGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x700)>>8);
         stGiantStandardRemoteFrameID_rx.RequireNodeGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x0F0)>>4);
@@ -668,6 +705,33 @@ void giant_SendRemote(UBYTE motiongroup)
     CAN_SendRemote(ID);
 }
 
+void giant_SendExtendData(UBYTE dataaddr, UBYTE datatype, UBYTE *data, UBYTE len)
+{
+    ULONG ID = 0;
+    can_trasnmit_message_struct can_trasnmit_message1;
+    ULONG OVtim = 0;
+    
+    ID = 0x1FFC0000 + (FG_NORMALDATA<<15) + (NODE_DRIVECHAIN<<9) + (datatype<<6) + dataaddr;
+    
+    can_trasnmit_message1.tx_efid = ID;
+    can_trasnmit_message1.tx_ff = CAN_FF_EXTENDED;
+    can_trasnmit_message1.tx_ft = CAN_FT_DATA;
+    can_trasnmit_message1.tx_dlen = len;
+    memcpy(can_trasnmit_message1.tx_data, data, len);
+    
+    can_ubMbox = can_message_transmit(CAN0, &can_trasnmit_message1);
+    
+    while((can_transmit_states(CAN0,can_ubMbox) != CAN_TRANSMIT_OK) && (OVtim < 0XFFF))
+    {
+        OVtim++;
+    }
+
+    if (OVtim >= 0XFFF)
+    {
+        return;
+    }
+}
+
 void giant_DataProcess(void)
 {
     if(stGiantControlParams.RefreshFlag)

+ 2 - 0
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Source/hwsetup.c

@@ -300,6 +300,8 @@ void hw_voInitGPIO(void)
     =======================================================================*/
     gpio_init(GPIOD,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_2); /* SPI Chip Select */
     gpio_bit_set(GPIOD, GPIO_PIN_2);
+    
+    gpio_bit_set(GPIOC, GPIO_PIN_1);//Power On
    
 }