Bläddra i källkod

CAN接收采用帧缓存的方式,在主程序中解析

Ye Jin 6 månader sedan
förälder
incheckning
cf0f44febd

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

@@ -360,7 +360,7 @@ void CAN0_RX1_IRQHandler(void)
         return;
     }
         
-    giant_DataProcess();
+    CANFrame_Rx_ISR();
     
     can_interrupt_enable(CAN0, CAN_INT_RFF1);
 }

+ 26 - 4
User project/3.BasicFunction/Include/giant_can.h

@@ -22,6 +22,7 @@
  *          Definitions & Macros
  *
  ****************************************/
+#define MAXFRAME_SIZE 16
 //Data Frame- Function group
 #define FG_NETWORKMANAGER    0x0
 #define FG_EVENT             0x1
@@ -63,6 +64,24 @@
  * @brief Rx Standard Data ID
  *
  */
+   
+
+typedef struct
+{
+    UBYTE  ucFrameSize;     //缓冲区数组:缓冲区大小
+    UBYTE  ucFrameWrInde;   //缓冲区数组:写索引
+    UBYTE  ucFrameRdInde;   //缓冲区数组:读索引
+    UBYTE  ucFrameCnt;      //缓冲区数组:数据计数
+} CANFrame_Info_Struct_t;
+
+typedef struct
+{
+    ULONG id;                                                   /*!< standard format frame identifier */
+    UBYTE rx_ft;                                                      /*!< type of frame, data or remote */
+    UBYTE rx_dlen;                                                    /*!< data length */
+    UBYTE rx_data[8];                                                 /*!< receive data */
+} CAN_ReceiveFrame_Struct_t;
+
 typedef struct
 {
     UBYTE FunctionGroup;//2 bits
@@ -105,9 +124,11 @@ typedef struct
  *           Exported variable
  *
  ****************************************/
-extern GiantStandardDataFrameID_Struct_t stGiantStandardDataFrameID_rx;
-extern GiantStandardRemoteFrameID_Struct_t stGiantStandardRemoteFrameID_rx;
+//extern GiantStandardDataFrameID_Struct_t stGiantStandardDataFrameID_rx;
+//extern GiantStandardRemoteFrameID_Struct_t stGiantStandardRemoteFrameID_rx;
 extern GiantControlParams_Struct_t stGiantControlParams;
+//extern CANFrame_Info_Struct_t stCANFrame_InfoRx;
+//extern CAN_ReceiveFrame_Struct_t stCAN_ReceiveFrame_Buf_Rx[MAXFRAME_SIZE];
 /***************************************
  *
  *          Function  Definations
@@ -115,11 +136,12 @@ extern GiantControlParams_Struct_t stGiantControlParams;
  ***************************************/
 void giant_Init(void);
 void giant_10msTask(void);
-void giant_DataProcess(void);
+void CANFrame_Rx_ISR(void);
+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_CANRxData_Process(void);
+void giant_DataProcess(void);
 SLONG giant_slPolynomial(const SWORD *value);
 /************************************************************************/
 

+ 81 - 43
User project/3.BasicFunction/Source/giant_can.c

@@ -30,6 +30,8 @@
 GiantStandardDataFrameID_Struct_t stGiantStandardDataFrameID_rx;
 GiantStandardRemoteFrameID_Struct_t stGiantStandardRemoteFrameID_rx;
 GiantControlParams_Struct_t stGiantControlParams;
+CANFrame_Info_Struct_t stCANFrame_InfoRx = {MAXFRAME_SIZE, 0, 0, 0};
+CAN_ReceiveFrame_Struct_t stCAN_ReceiveFrame_Buf_Rx[MAXFRAME_SIZE];
 /***************************************************************
  Function: 
  Description: 
@@ -42,7 +44,7 @@ GiantControlParams_Struct_t stGiantControlParams;
 void giant_Init(void)
 {
     stGiantControlParams.RidingModeEn = 0;
-    stGiantControlParams.AdjustingMode = 0x0B;//check mode
+    stGiantControlParams.AdjustingMode = AD_CHECKMODE;//check mode
     stGiantControlParams.WheelCircumference = 2182;//mm
     stGiantControlParams.StartMode = 2;
     stGiantControlParams.SpeedLimitation = 4500;
@@ -126,14 +128,39 @@ void giant_10msTask(void)
     }
 }
 
-void giant_DataProcess(void)
+void CANFrame_Rx_ISR(void)
 {
-    if(pRxMsg2->rx_ft == CAN_FT_DATA)
+    stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameWrInde].id = (UWORD)pRxMsg2->rx_sfid;
+    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);
+      
+    stCANFrame_InfoRx.ucFrameWrInde++;
+    if (stCANFrame_InfoRx.ucFrameWrInde >= stCANFrame_InfoRx.ucFrameSize)
+    {
+        stCANFrame_InfoRx.ucFrameWrInde = 0;
+    }
+    
+    stCANFrame_InfoRx.ucFrameCnt++;
+    if (stCANFrame_InfoRx.ucFrameCnt >= stCANFrame_InfoRx.ucFrameSize)
     {
-        stGiantStandardDataFrameID_rx.FunctionGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x600)>>9);
-        stGiantStandardDataFrameID_rx.NodeGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x1E0)>>5);
-        stGiantStandardDataFrameID_rx.DataBehaviors = (UBYTE)((pRxMsg2->rx_sfid & 0x010)>>4);
-        stGiantStandardDataFrameID_rx.DataAddress = (UBYTE)(pRxMsg2->rx_sfid & 0x00F);
+        stCANFrame_InfoRx.ucFrameCnt = stCANFrame_InfoRx.ucFrameSize;
+    }
+}
+
+void giant_CANRxData_Process(void)
+{
+  CAN_ReceiveFrame_Struct_t *CAN_ReceiveFrame_tmp;
+  if(stCANFrame_InfoRx.ucFrameCnt > 0)
+  {
+    CAN_ReceiveFrame_tmp = &stCAN_ReceiveFrame_Buf_Rx[stCANFrame_InfoRx.ucFrameRdInde];
+    
+    if(CAN_ReceiveFrame_tmp->rx_ft == CAN_FT_DATA)
+    {
+        stGiantStandardDataFrameID_rx.FunctionGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x600)>>9);
+        stGiantStandardDataFrameID_rx.NodeGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x1E0)>>5);
+        stGiantStandardDataFrameID_rx.DataBehaviors = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x010)>>4);
+        stGiantStandardDataFrameID_rx.DataAddress = (UBYTE)(CAN_ReceiveFrame_tmp->id & 0x00F);
         
         switch (stGiantStandardDataFrameID_rx.NodeGroup)
         {
@@ -149,29 +176,29 @@ void giant_DataProcess(void)
                 {
                     case 0x0:
                     {
-                        if(pRxMsg2->rx_dlen == 2)//error
+                        if(CAN_ReceiveFrame_tmp->rx_dlen == 2)//error
                         {
-                            stGiantControlParams.Error = (pRxMsg2->rx_data[0] & 0x01);//Error value
+                            stGiantControlParams.Error = (CAN_ReceiveFrame_tmp->rx_data[0] & 0x01);//Error value
                         }
                         break;
                     }
                     case 0x1:
                     {
-                        if(pRxMsg2->rx_dlen == 7)//cmd1
+                        if(CAN_ReceiveFrame_tmp->rx_dlen == 7)//cmd1
                         {
-                            stGiantControlParams.ManualSleepEn = ((pRxMsg2->rx_data[0] & 0x40)>>6);//Manual sleep
-                            stGiantControlParams.AutomaticSleepEn = ((pRxMsg2->rx_data[0] & 0x20)>>5);//Automatic sleep
+                            stGiantControlParams.ManualSleepEn = ((CAN_ReceiveFrame_tmp->rx_data[0] & 0x40)>>6);//Manual sleep
+                            stGiantControlParams.AutomaticSleepEn = ((CAN_ReceiveFrame_tmp->rx_data[0] & 0x20)>>5);//Automatic sleep
                             
-                            stGiantControlParams.InactivateErrorDetection = ((pRxMsg2->rx_data[1] & 0x80)>>7);//Inactivate the error detection
+                            stGiantControlParams.InactivateErrorDetection = ((CAN_ReceiveFrame_tmp->rx_data[1] & 0x80)>>7);//Inactivate the error detection
                             
-                            if((pRxMsg2->rx_data[1] & 0x10) == 0x10)//Reset fault history
+                            if((CAN_ReceiveFrame_tmp->rx_data[1] & 0x10) == 0x10)//Reset fault history
                             {
                               
                             }
                             
-                            stGiantControlParams.ThrottleEn = ((pRxMsg2->rx_data[1] & 0x08)>>3);//Throttle state
+                            stGiantControlParams.ThrottleEn = ((CAN_ReceiveFrame_tmp->rx_data[1] & 0x08)>>3);//Throttle state
                             
-                            if((pRxMsg2->rx_data[1] & 0x04) == 0x04)//Reset trip distance and trip time
+                            if((CAN_ReceiveFrame_tmp->rx_data[1] & 0x04) == 0x04)//Reset trip distance and trip time
                             {
                                 MC_RideLog.TRIP_Km = 0;
                                 MC_RideLog.TRIP_Time = 0;
@@ -183,22 +210,22 @@ void giant_DataProcess(void)
                                 cp_stBikeRunInfoPara.ulRiTime = 0;
                             }
                             
-                            stGiantControlParams.BrakeleEn = ((pRxMsg2->rx_data[1] & 0x02)>>1);//Brake state
-                            stGiantControlParams.WalkEn = (pRxMsg2->rx_data[1] & 0x01);//Walk
+                            stGiantControlParams.BrakeleEn = ((CAN_ReceiveFrame_tmp->rx_data[1] & 0x02)>>1);//Brake state
+                            stGiantControlParams.WalkEn = (CAN_ReceiveFrame_tmp->rx_data[1] & 0x01);//Walk
                             
-                            if(pRxMsg2->rx_data[2] > 100)
+                            if(CAN_ReceiveFrame_tmp->rx_data[2] > 100)
                             {
                                 stGiantControlParams.ThrottlePowerPercentage = 0;
                             }
                             else
                             {
-                                stGiantControlParams.ThrottlePowerPercentage = pRxMsg2->rx_data[2];//Throttle power percentage %,else 0%
+                                stGiantControlParams.ThrottlePowerPercentage = CAN_ReceiveFrame_tmp->rx_data[2];//Throttle power percentage %,else 0%
                             }
                             
-                            stGiantControlParams.RidingModeEn = ((pRxMsg2->rx_data[3] & 0x80)>>7);//Riding mode
-                            stGiantControlParams.AdjustingMode = (pRxMsg2->rx_data[3] & 0x1F);//Adjusting mode
+                            stGiantControlParams.RidingModeEn = ((CAN_ReceiveFrame_tmp->rx_data[3] & 0x80)>>7);//Riding mode
+                            stGiantControlParams.AdjustingMode = (CAN_ReceiveFrame_tmp->rx_data[3] & 0x1F);//Adjusting mode
                             
-                            if((pRxMsg2->rx_data[4] & 0x04) == 0x04)//Reset odometer distance and odometer time
+                            if((CAN_ReceiveFrame_tmp->rx_data[4] & 0x04) == 0x04)//Reset odometer distance and odometer time
                             {
                                 MC_RideLog.ODO_Km = 0;
                                 MC_RideLog.ODO_Time = 0;
@@ -220,19 +247,19 @@ void giant_DataProcess(void)
                                 cp_stBikeRunInfoPara.ulRiTime = 0;
                             }
                             
-                            stGiantControlParams.StartMode = ((pRxMsg2->rx_data[6] & 0xC0) >> 6);//Start mode,1-soft,2-normal,3-strong
+                            stGiantControlParams.StartMode = ((CAN_ReceiveFrame_tmp->rx_data[6] & 0xC0) >> 6);//Start mode,1-soft,2-normal,3-strong
                         }
                         break;
                     }
                     case 0x2:
                     {
-                        if(pRxMsg2->rx_dlen == 7)//cmd2
+                        if(CAN_ReceiveFrame_tmp->rx_dlen == 7)//cmd2
                         {
-                            if((pRxMsg2->rx_data[0] & 0x30) == 0x00)
+                            if((CAN_ReceiveFrame_tmp->rx_data[0] & 0x30) == 0x00)
                             {
                                 MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;//light off
                             }
-                            else if((pRxMsg2->rx_data[0] & 0x30) == 0x10)
+                            else if((CAN_ReceiveFrame_tmp->rx_data[0] & 0x30) == 0x10)
                             {
                                 MC_ControlCode.LightSwitch = MC_LightSwitch_ON;//light on
                             }
@@ -242,31 +269,31 @@ void giant_DataProcess(void)
                             }
                             MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
                             
-                            stGiantControlParams.WheelCircumference = (pRxMsg2->rx_data[2] + (pRxMsg2->rx_data[3]<<8));//Tire circumference,900-2500mm                            
+                            stGiantControlParams.WheelCircumference = (CAN_ReceiveFrame_tmp->rx_data[2] + (CAN_ReceiveFrame_tmp->rx_data[3]<<8));//Tire circumference,900-2500mm                            
         
-                            stGiantControlParams.MaximumTorque = ((pRxMsg2->rx_data[4] & 0xF0)>>4);//Maximum torque,*10Nm
+                            stGiantControlParams.MaximumTorque = ((CAN_ReceiveFrame_tmp->rx_data[4] & 0xF0)>>4);//Maximum torque,*10Nm
 //                            if(0 == stGiantControlParams.MaximumTorque)
 //                            {
 //                                stGiantControlParams.MaximumTorque = 0;//default
 //                            }
                             
-                            stGiantControlParams.Acceleration = (pRxMsg2->rx_data[4] & 0x0F);//Acceleration,*30Nm/s
+                            stGiantControlParams.Acceleration = (CAN_ReceiveFrame_tmp->rx_data[4] & 0x0F);//Acceleration,*30Nm/s
 //                            if(0 == stGiantControlParams.Acceleration)
 //                            {
 //                                stGiantControlParams.Acceleration = 0;//default
 //                            }
                             
-                            stGiantControlParams.AssistRatio = pRxMsg2->rx_data[5];;//Assist ratio, *10%
+                            stGiantControlParams.AssistRatio = CAN_ReceiveFrame_tmp->rx_data[5];;//Assist ratio, *10%
                             
-                            stGiantControlParams.MaximumPower = pRxMsg2->rx_data[6];//Maximum power, *10Watt
+                            stGiantControlParams.MaximumPower = CAN_ReceiveFrame_tmp->rx_data[6];//Maximum power, *10Watt
                         }
                         break;
                     }
                     case 0x3:
                     {
-                        if(pRxMsg2->rx_dlen == 7)//cmd3
+                        if(CAN_ReceiveFrame_tmp->rx_dlen == 7)//cmd3
                         {
-                            stGiantControlParams.SpeedLimitation = (UWORD)(pRxMsg2->rx_data[5] + (pRxMsg2->rx_data[6]<<8));//speed limitation,0.01km/h
+                            stGiantControlParams.SpeedLimitation = (UWORD)(CAN_ReceiveFrame_tmp->rx_data[5] + (CAN_ReceiveFrame_tmp->rx_data[6]<<8));//speed limitation,0.01km/h
 //                            if(0 == stGiantControlParams.SpeedLimitation)
 //                            {
 //                                stGiantControlParams.SpeedLimitation = 2500;//DU default
@@ -290,9 +317,9 @@ void giant_DataProcess(void)
                 {
                     case 0x1:
                     {
-                        if(pRxMsg2->rx_dlen == 8)//Capacity
+                        if(CAN_ReceiveFrame_tmp->rx_dlen == 8)//Capacity
                         {
-                            BMS_RunInfo.SOC = pRxMsg2->rx_data[0];
+                            BMS_RunInfo.SOC = CAN_ReceiveFrame_tmp->rx_data[0];
                         }
                         break;
                     }
@@ -307,9 +334,9 @@ void giant_DataProcess(void)
                 {
                     case 0x4:
                     {
-                        if(pRxMsg2->rx_dlen == 8)//Customized Version
+                        if(CAN_ReceiveFrame_tmp->rx_dlen == 8)//Customized Version
                         {
-                            memcpy(MC_RsASSCII.CustomASCII1, pRxMsg2->rx_data, 8);
+                            memcpy(MC_RsASSCII.CustomASCII1, CAN_ReceiveFrame_tmp->rx_data, 8);
                             //执行存储操作
                             memcpy(flash_stPara.ubRsASSCII.CustomASCII1, MC_RsASSCII.CustomASCII1, sizeof(MC_RsASSCII.CustomASCII1));
                         }
@@ -324,11 +351,11 @@ void giant_DataProcess(void)
                 break;
         }
     }
-    else if(pRxMsg2->rx_ft == CAN_FT_REMOTE)
+    else if(CAN_ReceiveFrame_tmp->rx_ft == CAN_FT_REMOTE)
     {
-        stGiantStandardRemoteFrameID_rx.MotionGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x700)>>8);
-        stGiantStandardRemoteFrameID_rx.RequireNodeGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x0F0)>>4);
-        stGiantStandardRemoteFrameID_rx.ResponseNodeGroup = (UBYTE)(pRxMsg2->rx_sfid & 0x00F);
+        stGiantStandardRemoteFrameID_rx.MotionGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x700)>>8);
+        stGiantStandardRemoteFrameID_rx.RequireNodeGroup = (UBYTE)((CAN_ReceiveFrame_tmp->id & 0x0F0)>>4);
+        stGiantStandardRemoteFrameID_rx.ResponseNodeGroup = (UBYTE)(CAN_ReceiveFrame_tmp->id & 0x00F);
         
         if(stGiantStandardRemoteFrameID_rx.RequireNodeGroup == NODE_USERINTERFACE)
         {
@@ -397,6 +424,16 @@ void giant_DataProcess(void)
             }
         }
     }
+    
+    giant_DataProcess();
+    
+    stCANFrame_InfoRx.ucFrameCnt--;
+    stCANFrame_InfoRx.ucFrameRdInde++;
+    if (stCANFrame_InfoRx.ucFrameRdInde >= stCANFrame_InfoRx.ucFrameSize)
+    {
+        stCANFrame_InfoRx.ucFrameRdInde = 0;
+    }
+  }
 }
 
 void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr)
@@ -631,7 +668,7 @@ void giant_SendRemote(UBYTE motiongroup)
     CAN_SendRemote(ID);
 }
 
-void giant_CANRxData_Process(void)
+void giant_DataProcess(void)
 {
     if(stGiantControlParams.RefreshFlag)
     {
@@ -732,6 +769,7 @@ SLONG giant_slPolynomial(const SWORD *value)
     
     return out;
 }
+
 /*************************************************************************
  End of this File (EOF)!
  Do not put anything after this part!