Bläddra i källkod

增加 gear box;

Ye Jin 1 år sedan
förälder
incheckning
033aee67d0

+ 2 - 0
User project/1.FrameLayer/Include/gd32f30x_it.h

@@ -49,6 +49,8 @@ void DMA1_Channel2_IRQHandler(void);
 void DMA1_Channel4_IRQHandler(void);
 /* CAN0_RX0 handle function */
 void  CAN0_RX0_IRQHandler(void);
+/* CAN1_RX1 handle function */
+void  CAN1_RX1_IRQHandler(void);
 
 #endif /* GD32F3X0_IT_H */
 

+ 8 - 2
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -236,7 +236,13 @@ void  Event_1ms(void)
                 else
                 {
                     //do nothing
-                }      
+                }
+                
+                //Limit max speed
+//                if(cp_stBikeRunInfoPara.BikeSpeedKmH > (ass_stParaCong.uwThrottleMaxSpdKmH * 10))
+//                {
+//                    uart_slSpdRefRpm = 0;
+//                }
             }  
             else
             {
@@ -415,7 +421,7 @@ void  Event_200ms(void)
             alm_stBikeIn.uwThrottleReg = adc_stUpOut.uwThrottleReg;
             alm_stBikeIn.blThrottleExistFlg = FALSE;
             alm_stBikeIn.blMotorNTCExistFlg = FALSE;
-            alm_voDetec200MS(&alm_stBikeIn, &alm_stDetect200MSCoef);   
+            //alm_voDetec200MS(&alm_stBikeIn, &alm_stDetect200MSCoef);   
         }
         
         if (switch_flg.SysFault_Flag == TRUE)

+ 1 - 0
User project/1.FrameLayer/Source/app.c

@@ -172,6 +172,7 @@ void AppLoop()
         }
     }
 
+    GearBox_Loop();
 }
 
 void PeripheralInit()

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

@@ -19,6 +19,8 @@
 #include "FSM_1st.h"
 #include "api_rt.h"
 #include "sys_ctrl.h"
+#include "enviolo_can.h"
+#include "string.h"
 /******************************
  *  Parameter
  ******************************/
@@ -393,3 +395,36 @@ void  CAN0_RX0_IRQHandler(void)
     }       
     can_interrupt_enable(CAN0, CAN_INT_RFF0);
 }
+/*!
+    \brief      
+    \param[in]  none
+    \param[out] none
+    \retval     none
+*/
+void CAN0_RX1_IRQHandler(void)
+{   
+    can_message_receive(CAN0, CAN_FIFO1, pRxMsg2);
+    if((pRxMsg2->rx_ff != CAN_FF_STANDARD) || (pRxMsg2->rx_dlen == 0))
+    {
+        can_interrupt_enable(CAN0, CAN_INT_RFF1);
+        return;
+    }
+    
+    switch (pRxMsg2->rx_sfid)
+    {
+        case ID_ENVIOLO_TO_MC_1: 
+        case ID_ENVIOLO_TO_MC_2:
+        {
+            if(pRxMsg2->rx_dlen == 8)//由于没有帧头帧尾和CRC,故保证数据的准确性必须为8字节才解析
+            {
+                GearBox_CanData.RefreshFlag = TRUE;
+                GearBox_CanData.ID = pRxMsg2->rx_sfid;
+                memcpy((uint8_t*)GearBox_CanData.Data, (uint8_t*)pRxMsg2->rx_data, 8);
+            }
+            break;
+        } 
+        default:
+            break;
+    }
+    can_interrupt_enable(CAN0, CAN_INT_RFF1);
+}

+ 14 - 1
User project/1.FrameLayer/Source/main.c

@@ -37,6 +37,7 @@
 #include "hwsetup.h"
 #include "app.h"
 #include "Temp.h"
+#include "enviolo_can.h"
 /***************************
 *********************************************
  Exported Functions:
@@ -78,7 +79,9 @@ int main(void)
     /* MCU Self Test Init */
     stl_voRunTimeChecksInit();
     /* Watchdog 1s */
-    hw_voIWDGInit(FWDGT_PSC_DIV32,1250);//1s  
+    hw_voIWDGInit(FWDGT_PSC_DIV32,1250);//1s
+    //Enviolo gear sensor init
+    GearBox_Init();
     /* Enable all interrupts */
     ENABLE_IRQ;
     
@@ -228,6 +231,7 @@ void mn_voParaSet(void)
             {
                 cp_stFlg.RunPermitFlg = FALSE;
             }
+
             if (i2c_stRXCRCOut.blAssistParaFltFlg == FALSE)
             {
                 ass_stParaSet.uwStartupCoef = I2C_uwAssistParaRead[0];
@@ -251,6 +255,15 @@ void mn_voParaSet(void)
     }
     else
     {}
+    
+    if (i2c_stRXCRCOut.blGearBoxParaFltFlg == FALSE)
+    {
+        GearBox_OBC_SetParams.GearNum = I2C_uwGearBoxParaRead[0];
+        GearBox_OBC_SetParams.CadenceMin = I2C_uwGearBoxParaRead[1];
+        GearBox_OBC_SetParams.CadenceMax = I2C_uwGearBoxParaRead[2];
+    }
+    else
+    {}
 }
 
 /***************************************************************

+ 6 - 6
User project/3.BasicFunction/Include/bikelight.h

@@ -79,17 +79,17 @@
 
 typedef enum
 {
-    one_byte = 0,
+    one_byte = 1,
 
-    two_byte = 1,
+    two_byte = 2,
 
-    Three_byte = 2,
+    Three_byte = 3,
 
-    four_byte = 3,
+    four_byte = 4,
 
-    five_byte = 4,
+    five_byte = 5,
 
-    six_byte = 5
+    six_byte = 6
 
 } LED_TYPE_STR;
 

+ 16 - 4
User project/3.BasicFunction/Include/can.h

@@ -60,6 +60,12 @@ Revising History (ECL of this file):
 #define ID_BC_FILTER (UWORD)0x700
 #define ID_BC_MASK   (UWORD)0x70F
 
+#define ID_ENVIOLO_TO_MC_1       0x7AA
+#define ID_ENVIOLO_TO_MC_2       0x7AB
+
+#define ID_ENVIOLO_FILTER        0x7AA
+#define ID_ENVIOLO_MASK    	 0x7FE
+
 #define FRAME_BEGIN1 0x55
 #define FRAME_BEGIN2 0xAA
 #define FRAME_END    0xF0
@@ -106,10 +112,6 @@ ULONG    CRC32_Calculate(const UBYTE pData[], UWORD Length);
 /************************************************************************
  Definitions & Macros
 *************************************************************************/
-#define CAN_MC_ALARMCODE_DEFAULT \
-    {                            \
-        0x00000000               \
-    }
 #define ID_MC_BC     0x710
 #define ID_MC_TO_BMS 0x712
 #define ID_MC_TO_PBU 0x713
@@ -144,6 +146,12 @@ ULONG    CRC32_Calculate(const UBYTE pData[], UWORD Length);
 
 #define ID_BC_FILTER (UWORD)0x700
 #define ID_BC_MASK   (UWORD)0x70F
+    
+#define ID_ENVIOLO_TO_MC_1       0x7AA
+#define ID_ENVIOLO_TO_MC_2       0x7AB
+
+#define ID_ENVIOLO_FILTER        0x7AA
+#define ID_ENVIOLO_MASK    	 0x7FE
 
 #define FRAME_BEGIN1 0x55
 #define FRAME_BEGIN2 0xAA
@@ -176,6 +184,8 @@ typedef struct
 /* GD MCU */
 CAN_EXT can_receive_message_struct stRxMessage1;
 CAN_EXT can_receive_message_struct *pRxMsg = &stRxMessage1;
+CAN_EXT can_receive_message_struct stRxMessage2;
+CAN_EXT can_receive_message_struct *pRxMsg2 = &stRxMessage2;
 CAN_EXT can_trasnmit_message_struct  stTxMessage1;
 CAN_EXT can_trasnmit_message_struct *pTxMsg = &stTxMessage1;
 
@@ -193,6 +203,8 @@ CAN_EXT CAN_Buf_TypeDef CAN_RxBuf_Struct_CDL = {0, 255, 0, 0, 0, 0, CAN_RxBuf_CD
 /* GD MCU */
 CAN_EXT can_receive_message_struct stRxMessage1;
 CAN_EXT can_receive_message_struct *pRxMsg;
+CAN_EXT can_receive_message_struct stRxMessage2;
+CAN_EXT can_receive_message_struct *pRxMsg2;
 CAN_EXT can_trasnmit_message_struct  stTxMessage1;
 CAN_EXT can_trasnmit_message_struct *pTxMsg;
 

+ 2 - 1
User project/3.BasicFunction/Include/canAppl.h

@@ -86,7 +86,8 @@ typedef struct
     UBYTE  T_MCU;                         ///>MCU温度 +40℃,地址偏移23
     UWORD Ride_Km;                       ///>开机后骑行里程 0.1km, 地址偏移24
     UWORD Ride_Time;                     ///>开机后骑行时间 1s,地址偏移26
-    UBYTE  RS2[4];                        ///>预留 4bytes
+    UBYTE  RS2[3];                        ///>预留 4bytes
+    UBYTE  GearBoxInfo;                    ///gear sensor state
 } MC_RunInfo_Struct_t;
 
 /**

+ 179 - 0
User project/3.BasicFunction/Include/enviolo_can.h

@@ -0,0 +1,179 @@
+#ifndef __ENVIOLO_CAN_H_
+#define __ENVIOLO_CAN_H_
+
+#include "stdint.h"
+#include "can.h"
+#include "typedefine.h"
+
+#define ENVIOLO_CONFIG_ID    0x7AC
+#define ENVIOLO_CONTROL_ID   0x7AD
+
+/*********************************Enviolo自动变速器通信协议内容******************************/
+//变速器运行信息
+typedef struct GEAR_INFO1
+{
+	uint8_t Pedal_Rpm;                      //踏频 1bit = 1rpm
+	uint8_t Actual_Ratio;                   //变速比 1bit = 0.1ratio
+	uint8_t Bike_Speed;                     //车速 1bit = 0.5km/h
+	uint8_t Battery_Vol;                    //电池电压 1bit = 0.25V
+	uint16_t Wheel_Rpm;                     //车轮转速 1bit = 1rpm
+	union STATUS_FLAG                       //状态标志
+	{
+		struct
+		{
+			uint8_t RS1                :1;
+			uint8_t RS2                :1;
+			uint8_t RS3                :1;
+			uint8_t ShiftActiveFlag    :1;  //档位切换
+			uint8_t CaliNeedFlag       :1;  //需要校准
+			uint8_t CaliSuccessFlag    :1;  //校准成功
+			uint8_t PowerOnFlag        :1;  //开机
+			uint8_t InitialFlag        :1;  //初始化完成			
+		}StatusFlagBit;
+		uint8_t Flag;
+	}StatusFlag;
+	union ERROR_FLAG                        //错误标志
+	{
+	    struct
+		{
+			uint8_t OverCurrentFlag    :1;  //过流
+			uint8_t CaliFailFlag       :1;  //校准失败
+			uint8_t RS1                :1;
+			uint8_t StallFlag          :1;  //工作异常
+			uint8_t RS2                :1;
+			uint8_t RS3                :1;
+			uint8_t RS4                :1;
+			uint8_t RS5                :1;
+		}ErrorFlagBit;
+		uint8_t Flag;
+	}ErrorFlag;
+	uint8_t RS1;
+}EnvioloGearInfo1_Struct_t;
+
+//变速器运行参数
+typedef struct GEAR_INFO2
+{
+	uint8_t PCB_Version_Major;
+	uint8_t PCB_Version_Mino;
+	uint8_t PCB_Version_BugFix;
+	uint8_t RS1;
+	uint8_t Soft_Version;
+	uint8_t RS2;
+	uint8_t RS3;
+	uint8_t RS4;
+}EnvioloGearInfo2_Struct_t;
+
+//变速器配置参数
+typedef struct CONFIG_PARAMS
+{
+    uint8_t FrontChain;                      //前牙盘 1bit = 1tooth
+	uint8_t RearTeeth;                       //后牙盘 1bit = 1tooth
+	uint8_t CadenceMin;                      //自动模式最低踏频 1bit = 1rpm
+	uint8_t CadenceMax;                      //自动模式最高踏频 1bit = 1rpm
+	uint8_t RS1;
+	uint8_t WheelSize;                       //轮胎周长 1bit = 1cm, offset = 100cm
+	uint8_t SleepTime;                       //自动关机时间 1bit = 1min
+	uint8_t RS2;
+}EnvioloConfigParams_Struct_t;
+
+//变速器模式枚举
+typedef enum GEAR_MODE
+{
+	ENVIOLO_INACTIVE = 0x00,
+	ENVIOLO_ACTIVE = 0x01,
+	ENVIOLO_MANUAL_MODE = 0x03,
+	ENVIOLO_AUTO_MODE = 0x04,
+	ENVIOLO_CAL_MODE = 0x08
+}GearMode_Struct_t;
+
+//变速器控制参数
+typedef struct CONTROL_PARAMS
+{
+	GearMode_Struct_t GearMode;
+	uint16_t RatioMode_Data;
+	uint16_t CadenceMode_Data;
+	uint8_t RS1;
+	uint8_t RS2;
+	uint8_t RS3;
+}EnvioloControlParams_Struct_t;
+
+/**********************************End******************************/
+
+//变速器CAN报文数据
+typedef struct GEARBOX_CAN_DATA
+{
+	BOOL RefreshFlag;
+	uint8_t RS;
+	uint16_t ID;
+	uint8_t Data[8];
+}GearBox_CanData_Struct_t;
+
+/******************************仪表与变速器通信协议内容*******************************/
+//发送仪表运行信息变速器运行状态
+typedef enum GEAR_BOX_STATUS
+{
+    GEAR_STATUS_INITIAL = (uint8_t)(1 << 5),    //初始化模式
+	GEAR_STATUS_MANUAL = (uint8_t)(2 << 5),     //手动模式
+	GEAR_STATUS_AUTO = (uint8_t)(4 << 5),       //自动模式
+    GEAR_STATUS_OFFLINE = (uint8_t)0xF0         //离线模式
+}GearBox_Status_Struct_t;
+
+//仪表发送变速器工作模式
+typedef enum GEAR_BOX_MODE
+{
+    GEAR_MODE_NULL = (uint8_t)0x00,    //初始化模式位无效值
+	GEAR_MODE_MANUAL = (uint8_t)0x03,  //自动模式
+	GEAR_MODE_AUTO = (uint8_t)0x04,    //手动模式
+    GEAR_MODE_CAL = (uint8_t)0x08      //校准模式
+}GearBox_Mode_Struct_t;
+
+//发送仪表校准状态
+typedef enum GEAR_BOX_CAL_FLAG
+{
+	GEAR_CAL_SUCCESS = 0X00,           //无需校准或校准成功
+	GEAR_CAL_NEED = 0x01,              //需要校准
+	GEAR_CAL_PEDAL = 0x02              //提示踩踏
+}GearBox_CalFlag_Struct_t;
+
+//仪表设置变速器模式 0x4008
+typedef struct OBC_SET_MODE
+{
+    GearBox_Mode_Struct_t Mode;      //变速器工作模式,手动、自动、校准
+	uint8_t Value;                     //手动模式变速比或自动模式目标踏频
+	uint8_t RS[6];
+}GearBox_OBC_SetMode_Struct_t;
+
+//仪表配置变速器参数 0x4208
+typedef struct OBC_SET_PARAMS
+{
+    uint8_t GearNum;                 //手动模式档位数量
+ 	uint8_t CadenceMin;                //自动模式最低踏频
+	uint8_t CadenceMax;                //自动模式最高踏频
+	uint8_t RS[5];
+}GearBox_OBC_SetParams_Struct_t;
+
+/*************************************End*************************************/
+
+//全局变量定义
+extern EnvioloGearInfo1_Struct_t EnvioloGearInfo1;            //Enviolo变速器运行信息,踏频、传动比、车速、电压、车轮转速、状态、错误码等
+extern EnvioloGearInfo2_Struct_t EnvioloGearInfo2;            //Enviolo变速器版本信息
+extern EnvioloConfigParams_Struct_t EnvioloConfigParams;      //Enviolo变速器配置参数,前牙盘、后牙盘、最低踏频、最高踏频、周长、自动关机时间等
+extern EnvioloControlParams_Struct_t EnvioloControlParams;    //Enviolo变速器控制参数,运行模式(手动、自动、校准)、目标传动比或目标踏频
+
+extern GearBox_CanData_Struct_t GearBox_CanData;              //变速器CAN报文
+extern BOOL GearBox_ComIsOK_Flag;                             //变速器通信状态
+extern uint32_t GearBox_ComTrigTime;                          //变速器通信超时计数
+
+extern GearBox_OBC_SetMode_Struct_t GearBox_OBC_SetMode;      //仪表设置变速器配置参数,手动或自动或校准、手动变速比或自动踏频
+extern GearBox_OBC_SetParams_Struct_t GearBox_OBC_SetParams;  //仪表设置变速器工作参数,手动档位数量、自动最低踏频、自动最高踏频
+extern GearBox_Status_Struct_t GearBox_Status;                //变速器当前状态,初始化、手动、自动、离线
+extern GearBox_CalFlag_Struct_t GearBox_CalFlag;              //变速器校准标志,无需校准或校准成功、需要校准、提示踩踏
+extern uint16_t GearBox_RatioTable[24];                       //变速器变速比与档位对照表
+
+//全局函数定义
+extern void GearBox_CanProcess(GearBox_CanData_Struct_t* CanData);
+extern void GearBox_Send_OBC_Params(GearBox_CalFlag_Struct_t CalFlag, GearBox_OBC_SetParams_Struct_t* p_GearBox_OBC_SetParams, uint8_t* p_EnvioloSoftVer);
+extern void GearBox_Init(void);//根据Enviolo的通信状态确定变速器是否在线,初始化变速器工作参数
+extern void GearBox_Loop(void);//变速器数据处理主函数
+
+#endif

+ 46 - 5
User project/3.BasicFunction/Include/i2c_master.h

@@ -56,14 +56,16 @@
 #define I2C_MCONTROL_PARA_N_BYTES 36  // I2C_SLAVEADDR_BLOCK1
 #define I2C_SENSOR_PARA_N_BYTES   40  // I2C_SLAVEADDR_BLOCK1
 #define I2C_ASSIST_PARA_N_BYTES   40  // I2C_SLAVEADDR_BLOCK1
-#define I2C_HISTORY_PARA_N_BYTES  78  // I2C_SLAVEADDR_BLOCK3
+#define I2C_GEARBOX_PARA_N_BYTES  16 // I2C_SLAVEADDR_BLOCK1
+#define I2C_HISTORY_PARA_N_BYTES  78  // I2C_SLAVEADDR_BLOCK2
 
 #define I2C_MOTOR_PARA_N_WORDS    I2C_MOTOR_PARA_N_BYTES / 2     // I2C_SLAVEADDR_BLOCK1
 #define I2C_BIKE_PARA_N_WORDS     I2C_BIKE_PARA_N_BYTES / 2      // I2C_SLAVEADDR_BLOCK1
 #define I2C_MCONTROL_PARA_N_WORDS I2C_MCONTROL_PARA_N_BYTES / 2  // I2C_SLAVEADDR_BLOCK1
 #define I2C_SENSOR_PARA_N_WORDS   I2C_SENSOR_PARA_N_BYTES / 2    // I2C_SLAVEADDR_BLOCK1
 #define I2C_ASSIST_PARA_N_WORDS   I2C_ASSIST_PARA_N_BYTES / 2    // I2C_SLAVEADDR_BLOCK1
-#define I2C_HISTORY_PARA_N_WORDS  I2C_HISTORY_PARA_N_BYTES / 2   // I2C_SLAVEADDR_BLOCK3
+#define I2C_GEARBOX_PARA_N_WORDS  I2C_GEARBOX_PARA_N_BYTES / 2  // I2C_SLAVEADDR_BLOCK2
+#define I2C_HISTORY_PARA_N_WORDS  I2C_HISTORY_PARA_N_BYTES / 2   // I2C_SLAVEADDR_BLOCK2
 
 #define I2C_PBUFFER_NWORDS 5
 
@@ -73,18 +75,20 @@
 #define I2C_MCONTROL_PARA_ARDDR I2C_BIKE_PARA_ARDDR + I2C_BIKE_PARA_N_BYTES          
 #define I2C_SENSOR_PARA_ARDDR   I2C_MCONTROL_PARA_ARDDR + I2C_MCONTROL_PARA_N_BYTES  
 #define I2C_ASSIST_PARA_ARDDR   I2C_SENSOR_PARA_ARDDR + I2C_SENSOR_PARA_N_BYTES
+#define I2C_GEARBOX_PARA_ADDR   I2C_ASSIST_PARA_ARDDR + I2C_ASSIST_PARA_N_BYTES
 #define I2C_HISTORY_PARA_ARDDR  0x00
 
-#define I2C_MOTOR_PARA_CRC_ARDDR    I2C_ASSIST_PARA_ARDDR + I2C_ASSIST_PARA_N_BYTES
+#define I2C_MOTOR_PARA_CRC_ARDDR    I2C_GEARBOX_PARA_ADDR + I2C_GEARBOX_PARA_N_BYTES
 #define I2C_BIKE_PARA_CRC_ARDDR     I2C_MOTOR_PARA_CRC_ARDDR + 2
 #define I2C_MCONTROL_PARA_CRC_ARDDR I2C_BIKE_PARA_CRC_ARDDR + 2
 #define I2C_SENSOR_PARA_CRC_ARDDR   I2C_MCONTROL_PARA_CRC_ARDDR + 2
 #define I2C_ASSIST_PARA_CRC_ARDDR   I2C_SENSOR_PARA_CRC_ARDDR + 2
+#define I2C_GEARBOX_PARA_CRC_ADDR   I2C_ASSIST_PARA_CRC_ARDDR + 2
 #define I2C_HISTORY_PARA_CRC_ARDDR  I2C_HISTORY_PARA_ARDDR + I2C_HISTORY_PARA_N_BYTES
 
 /* I2C TX size: cannot exceed 255, CRC: 6 Bytes */
 #define I2C_TX1_NBYTES \
-        10 + I2C_MOTOR_PARA_N_BYTES + I2C_BIKE_PARA_N_BYTES + I2C_MCONTROL_PARA_N_BYTES + I2C_SENSOR_PARA_N_BYTES + I2C_ASSIST_PARA_N_BYTES // 172 bytes
+        12 + I2C_MOTOR_PARA_N_BYTES + I2C_BIKE_PARA_N_BYTES + I2C_MCONTROL_PARA_N_BYTES + I2C_SENSOR_PARA_N_BYTES + I2C_ASSIST_PARA_N_BYTES + I2C_GEARBOX_PARA_N_BYTES // 172 bytes
 #define I2C_RETX1_TIMES 1
 #define I2C_TX2_NBYTES  2 + I2C_HISTORY_PARA_N_BYTES // 78 Bytes
 #define I2C_RETX2_TIMES 1
@@ -556,6 +560,27 @@
             I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve                                        \
     }
 
+/*GearBox Params*/
+#define I2CuwGearBoxPara_GearNum \
+    {                                  \
+        9, 0, 0, 0, 0                  \
+    }
+
+#define I2CuwGearBoxPara_CadenceMin \
+    {                                     \
+        30, 0, 0, 0, 0                     \
+    }
+
+#define I2CuwGearBoxPara_CadenceMax \
+    {                                     \
+        120, 0, 0, 0, 0                     \
+    }
+
+#define I2CGearBoxPara      \
+    {                           \
+        I2CuwGearBoxPara_GearNum, I2CuwGearBoxPara_CadenceMin, I2CuwGearBoxPara_CadenceMax     \
+    }
+
 /* History Para */
 #define I2CuwAssModSelect \
     {                     \
@@ -700,7 +725,7 @@
 /* System Para */
 #define SYSPARA2                                                                                 \
     {                                                                                            \
-        I2CMotorPara, I2CBikePara, I2CMControlPara, I2CSensorPara, I2CAssistPara, I2CHistoryPara \
+        I2CMotorPara, I2CBikePara, I2CMControlPara, I2CSensorPara, I2CAssistPara, I2CGearBoxPara, I2CHistoryPara \
     }
 
 /************************************************************************
@@ -725,6 +750,7 @@ typedef struct
     BOOL blMControlParaFltFlg;
     BOOL blSensorParaFltFlg;
     BOOL blAssistParaFltFlg;
+    BOOL blGearBoxParaFltFlg;
     BOOL blHistoryParaFltFlg;
 
     BOOL ReadFinishFlg;
@@ -864,6 +890,18 @@ typedef struct
 
 } Assist_PARAMETER;
 
+typedef struct
+{
+    UWORD_VALUE uwGearBoxNum;
+    UWORD_VALUE uwGearBoxCadenceMin;
+    UWORD_VALUE uwGearBoxCadenceMax;
+    UWORD_VALUE reserve1;
+    UWORD_VALUE reserve2;
+    UWORD_VALUE reserve3;
+    UWORD_VALUE reserve4;
+    UWORD_VALUE reserve5;
+}GearBox_PARAMETER;
+
 typedef struct
 {
     UWORD_VALUE uwAssModSelect;
@@ -921,6 +959,7 @@ typedef struct
     MControl_PARAMETER stMControlPara;
     Sensor_PARAMETER   stSensorPara;
     Assist_PARAMETER   stAssistPara;
+    GearBox_PARAMETER  stGearBoxPara;
     History_PARAMETER  stHistoryPara;
 } SYSTEM_PARAMETER2;
 
@@ -943,6 +982,7 @@ _I2C_MASTER_EXT UWORD I2C_uwBikeParaRead[I2C_BIKE_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwMControlRead[I2C_MCONTROL_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwSensorRead[I2C_SENSOR_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwAssistParaRead[I2C_ASSIST_PARA_N_WORDS];
+_I2C_MASTER_EXT UWORD I2C_uwGearBoxParaRead[I2C_ASSIST_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwHistoryParaRead[I2C_HISTORY_PARA_N_WORDS];
 
 _I2C_MASTER_EXT UBYTE I2C_ubWriteBuffer[I2C_TX1_NBYTES];
@@ -965,6 +1005,7 @@ _I2C_MASTER_EXT UWORD I2C_uwBikeParaRead[I2C_BIKE_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwMControlRead[I2C_MCONTROL_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwSensorRead[I2C_SENSOR_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwAssistParaRead[I2C_ASSIST_PARA_N_WORDS];
+_I2C_MASTER_EXT UWORD I2C_uwGearBoxParaRead[I2C_GEARBOX_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwHistoryParaRead[I2C_HISTORY_PARA_N_WORDS];
 
 _I2C_MASTER_EXT UBYTE I2C_ubWriteBuffer[I2C_TX1_NBYTES];

+ 1 - 1
User project/3.BasicFunction/Source/bikelight.c

@@ -217,7 +217,7 @@ void bikelight_voBikeLightCoef(UWORD uwLightPara)
 void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 {
    UBYTE ubBackLedMode;
-   
+
    ubBackLedMode = (UBYTE)((uwLightPara & 0xF000) >> 12);
  //if( power_stPowStateOut.powerstate != POWER_ON) //关机状态
    if( power_stPowStateOut.blPowerStartupFlg  ==FALSE)

+ 28 - 10
User project/3.BasicFunction/Source/can.c

@@ -61,6 +61,7 @@ ULONG    CRC32_Calculate(const UBYTE pData[], UWORD Length)
 
 #include "gd32f30x.h"
 #include "hwsetup.h"
+#include "enviolo_can.h"
 static const ULONG Crc32Table[256] = {
     0x00000000U, 0x04C11DB7U, 0x09823B6EU, 0x0D4326D9U, 0x130476DCU, 0x17C56B6BU, 0x1A864DB2U, 0x1E475005U, 0x2608EDB8U, 0x22C9F00FU, 0x2F8AD6D6U, 0x2B4BCB61U,
     0x350C9B64U, 0x31CD86D3U, 0x3C8EA00AU, 0x384FBDBDU, 0x4C11DB70U, 0x48D0C6C7U, 0x4593E01EU, 0x4152FDA9U, 0x5F15ADACU, 0x5BD4B01BU, 0x569796C2U, 0x52568B75U,
@@ -401,6 +402,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             //电池关闭电源前控制器存储数据
             power_stPowStateOut.powerstate = POWER_OFF;
             power_stPowStateOut.blPowerStartupFlg = FALSE;
+            PowerOffDTimeOut = cp_ulSystickCnt;
             //发送关机就绪信号
             SendData(ID_MC_BC, MODE_REPORT, 0x1305, (UBYTE *)"READY");
             break;
@@ -421,6 +423,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             //仪表关闭电源前控制器存储数据
             power_stPowStateOut.powerstate = POWER_OFF;
             power_stPowStateOut.blPowerStartupFlg = FALSE;
+            PowerOffDTimeOut = cp_ulSystickCnt;
             //发送关机就绪信号
             SendData(ID_MC_BC, MODE_REPORT, 0x1305, (UBYTE *)"READY");
             break;
@@ -473,7 +476,8 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             cp_stFlg.ParaUpdateFlg = TRUE;
             cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;            
             cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
-            cp_stFlg.ParaSaveEEFlg = TRUE;                   
+            cp_stFlg.ParaSaveEEFlg = TRUE;
+            GearBox_Init();
             SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (UBYTE *)"ACK");
             break;
         }
@@ -509,6 +513,28 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             OBC_ButtonStatus.ulButtonSetTimeCnt = cp_ulSystickCnt;
             break;
         }
+        case 0x4008: //变速器控制参数
+        {
+            memcpy((uint8_t*)&GearBox_OBC_SetMode.Mode, Data, DataLength);
+            SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
+            break;
+        }
+        case 0x4100: //读取变速器参数
+        {
+            GearBox_Send_OBC_Params(GearBox_CalFlag, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
+            break;
+        }
+        case 0x4208: //设置变速器参数
+        {
+            memcpy((uint8_t*)&GearBox_OBC_SetParams.GearNum, Data, DataLength);
+            Syspara2.stGearBoxPara.uwGearBoxNum.uwReal = GearBox_OBC_SetParams.GearNum;
+            Syspara2.stGearBoxPara.uwGearBoxCadenceMin.uwReal = GearBox_OBC_SetParams.CadenceMin;
+            Syspara2.stGearBoxPara.uwGearBoxCadenceMax.uwReal = GearBox_OBC_SetParams.CadenceMax;
+            cp_stFlg.ParaSaveEEFlg = TRUE; 
+            GearBox_Init();
+	    SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
+            break;
+        }
         default:
             break;
         }
@@ -708,15 +734,6 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
         {
             if (strncmp("LOG CLEAR", (char *)Data, DataLength) == 0)
             {
-                CodeHistoryParaDelete();
-                MC_RideLog.TRIP_Km = 0;
-                MC_RideLog.TRIP_Time = 0;
-                MC_RideLog.ODO_Km = 0;
-                MC_RideLog.ODO_Time = 0;
-                cp_stHistoryPara.ulTripSum=0;
-                cp_stHistoryPara.ulTripSumTime=0;
-                cp_stHistoryPara.ulODOTrip = 0;
-                cp_stHistoryPara.ulODOTime = 0;
                 DISABLE_IRQ;
                 /* History Default Value Write */ 
                 i2c_voHistoryDefaultWriteBuffer();
@@ -766,6 +783,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             cp_stFlg.ParaUpdateFlg = TRUE;
             cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
             cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            GearBox_Init();
             SendData(ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
             break;
         }

+ 26 - 7
User project/3.BasicFunction/Source/canAppl.c

@@ -222,7 +222,7 @@ void Can_voInitMC_Run(void)
 	strncpy(MC_VerInfo.HW_Version, (char *)"TEST.           ", 16);
 #endif
     // Software version
-    char chFwVersion[16]="V0r1r9_";
+    char chFwVersion[16]="V0r1r10_";
     strncat(chFwVersion,COMMIT_TIME,9);
     strncpy(MC_VerInfo.FW_Version, (char *)chFwVersion, 16);
     
@@ -262,9 +262,9 @@ void Can_voMC_Run_1ms(void) /* parasoft-suppress METRICS-28 "
     }
 
 
-    if (adc_stUpOut.PCBTemp < ((SWORD)cp_stHistoryPara.uwNTCTempMaxCe))
+    if (adc_stUpOut.PCBTemp < ((SWORD)cp_stHistoryPara.uwNTCTempMinCe))
     {
-        cp_stHistoryPara.uwNTCTempMaxCe = adc_stUpOut.PCBTemp;
+        cp_stHistoryPara.uwNTCTempMinCe = adc_stUpOut.PCBTemp;
     }
 
     // Error Cnt record and Error Display Set
@@ -555,7 +555,7 @@ void Can_voMC_Run_200ms(void)
         //            35; // 600 0.1cm  3216 = Q10(3.1415926)  105 = Q20(1/10000)    0.1 km/h;
         //
         MC_RunInfoToCDL.BikeSpeed =
-        		(UWORD)((((SQWORD)bikespeed_stFreGetOut.uwLPFFrequencyPu * FBASE * ass_stParaCong.uwWheelPerimeter * 36 >> 20) * 1048 * 10) >> 20);
+        		(UWORD)((((SQWORD)bikespeed_stFreGetOut.uwLPFFrequencyPu * FBASE * (ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter)* 36 >> 20) * 1048 * 10) >> 20);
         MC_RunInfoToCDL.IqCurrent = (SWORD)(((SLONG)scm_swIqRefPu * (SLONG)cof_uwIbAp * (SLONG)100) >> 14);
         MC_RunInfoToCDL.AlarmCode = (UBYTE)(MC_ErrorCode.Code & 0x00FF);
         SendData(ID_MC_TO_CDL, MODE_REPORT, 0xF112, (UBYTE *)&MC_RunInfoToCDL.Torque);
@@ -759,11 +759,30 @@ UWORD        Can_SOC_Cal(void)
     
     if(blSOCSWitch == FALSE)
     {
-      SOC_Value = BMS_RunInfo.SOC;                      
+        SOC_Value = BMS_RunInfo.SOC;                      
     }
     else if (blSOCfirstSet == FALSE)
-    {
-        SOC_MIN = BMS_RunInfo.SOC;
+    {  
+        if(0 == ulBMS_ComTimeOutCount)
+        {
+            if (MC_RunInfo.BusVoltage >= slBMSMaxVol)
+            {
+                SOC_Value = 100;
+            }
+            else if (MC_RunInfo.BusVoltage <= slBMSMinVol)
+            {
+                SOC_Value = 0;
+            }
+            else
+            {
+                SOC_Value = (SWORD)(((SLONG)MC_RunInfo.BusVoltage - slBMSMinVol) * 100 / (slBMSMaxVol - slBMSMinVol));
+            }
+            SOC_MIN = SOC_Value;
+        }
+        else
+        {
+            SOC_MIN = BMS_RunInfo.SOC;
+        }
         blSOCfirstSet = TRUE;
     }
     //1min¸üÐÂÒ»´ÎµçÁ¿

+ 345 - 0
User project/3.BasicFunction/Source/enviolo_can.c

@@ -0,0 +1,345 @@
+#include "enviolo_can.h"
+#include "can.h"
+#include "canAppl.h"
+#include "string.h"
+#include "CodePara.h"
+#include "AssistCurve.h"
+
+/********全局变量定义********/
+EnvioloGearInfo1_Struct_t EnvioloGearInfo1 = {0, 0, 0, 0, 0, 0, 0, 0};
+EnvioloGearInfo2_Struct_t EnvioloGearInfo2 = {0, 0, 0, 0, 0, 0, 0, 0};
+EnvioloConfigParams_Struct_t EnvioloConfigParams = {43, 20, 30, 90, 0, 119, 5, 0};        //默认前牙盘43T,后牙盘20T,最低踏频30rpm,最高踏频90rpm,车轮周长219cm,自动关机时间5min
+EnvioloControlParams_Struct_t EnvioloControlParams = {ENVIOLO_INACTIVE, 0, 0, 0, 0, 0};   //默认未激活,目标变速比0,目标踏频0
+GearBox_CanData_Struct_t GearBox_CanData = {FALSE, 0, 0, {0, }};                          //CAN报文数据
+BOOL GearBox_ComIsOK_Flag = FALSE;                                                        //变速器通信状态
+uint32_t GearBox_ComTrigTime = 0;                                                         //变速器通信超时计数
+GearBox_OBC_SetMode_Struct_t GearBox_OBC_SetMode = {GEAR_MODE_NULL, 0, 0, 0, 0, 0, 0, 0}; //默认无效值,目标0
+GearBox_OBC_SetParams_Struct_t GearBox_OBC_SetParams = {9, 30, 120, 0, 0, 0, 0, 0};        //默认9档,最低踏频30rpm,最高踏频90rpm
+GearBox_Status_Struct_t GearBox_Status = GEAR_STATUS_OFFLINE;                             //变速器状态默认为初始化
+GearBox_CalFlag_Struct_t GearBox_CalFlag = GEAR_CAL_SUCCESS;                              //变速器默认校准完成
+uint16_t GearBox_RatioTable[24] = {500, 662, 824, 986, 1148, 1310, 1472, 1634, 1800, };   //变速器变速比与档位对照表,默认9速
+
+/********局部函数定义********/
+//发送Enviolo变速器配置参数
+void GearBox_Send_EnvioloConfigParams(EnvioloConfigParams_Struct_t* p_EnvioloConfigParams)
+{
+    uint8_t Data[8] = {0,};
+	memcpy(Data, (uint8_t*)&p_EnvioloConfigParams->FrontChain, 8);
+	CAN_SendData(ENVIOLO_CONFIG_ID, Data, 8);
+}
+
+//发送Enviolo变速器工作参数
+void GearBox_Send_EnvioloControlParams(EnvioloControlParams_Struct_t* p_EnvioloControlParams)
+{
+    uint8_t Data[8] = {0,};
+	//避免大小端和内存对齐问题,赋值处理
+	Data[0] = p_EnvioloControlParams->GearMode;
+	Data[1] = p_EnvioloControlParams->RatioMode_Data >> 8;
+	Data[2] = p_EnvioloControlParams->RatioMode_Data & 0xFF;
+	Data[3] = p_EnvioloControlParams->CadenceMode_Data >> 8;
+	Data[4] = p_EnvioloControlParams->CadenceMode_Data & 0xFF;
+	Data[5] = 0;
+	Data[6] = 0;
+	Data[7] = 0;
+	CAN_SendData(ENVIOLO_CONTROL_ID, Data, 8);
+}
+
+//根据变速器的变速比计算档位
+uint8_t GearBox_CalGearSt(uint16_t Ratio, uint8_t Num)
+{
+	uint8_t Result = 0;
+	if(Ratio <= 500)
+		Result = 1;
+	else if(Ratio >= 1800)
+		Result = Num;
+	else
+    Result = (Ratio - 500) / (1300 / Num) + 1;
+  return Result;
+}
+
+/*************************全局函数定义*******************************/
+
+//变速器CAN报文解析
+void GearBox_CanProcess(GearBox_CanData_Struct_t* CanData)
+{
+	if(CanData->RefreshFlag == TRUE)
+	{
+	    //更新通信检测标志
+		GearBox_ComIsOK_Flag = TRUE;
+		GearBox_ComTrigTime = cp_ulSystickCnt;
+		//数据解析
+		if(CanData->ID == ID_ENVIOLO_TO_MC_1)
+		{
+      		EnvioloGearInfo1.Pedal_Rpm = CanData->Data[0];
+			EnvioloGearInfo1.Actual_Ratio = CanData->Data[1];
+			EnvioloGearInfo1.Bike_Speed = CanData->Data[2];
+			EnvioloGearInfo1.Battery_Vol = CanData->Data[3];
+			EnvioloGearInfo1.Wheel_Rpm = (uint16_t)(CanData->Data[4] << 8) + CanData->Data[5];
+			EnvioloGearInfo1.StatusFlag.Flag = CanData->Data[6];
+			EnvioloGearInfo1.ErrorFlag.Flag = CanData->Data[7];
+			//变速器校准成功标志1
+			if(EnvioloGearInfo1.StatusFlag.StatusFlagBit.CaliSuccessFlag == 1)
+			{
+				GearBox_CalFlag = GEAR_CAL_SUCCESS;
+			}
+			//变速器校准成功标志0
+			else
+			{
+				GearBox_CalFlag = GEAR_CAL_NEED;
+			}
+		}
+		else if(CanData->ID == ID_ENVIOLO_TO_MC_2)
+		{
+            memcpy((uint8_t*)&EnvioloGearInfo2.PCB_Version_Major, (uint8_t*)CanData->Data, 8);
+		}
+		CanData->RefreshFlag = FALSE;
+	}
+}
+
+//发送仪表变速器参数
+void GearBox_Send_OBC_Params(GearBox_CalFlag_Struct_t CalFlag, GearBox_OBC_SetParams_Struct_t* p_GearBox_OBC_SetParams, uint8_t* p_EnvioloSoftVer)
+{
+    uint8_t Data[16] = {0,};
+	Data[0] = CalFlag;
+	memcpy(Data + 1, (uint8_t*)&p_GearBox_OBC_SetParams->GearNum, 3);
+	Data[4] = *p_EnvioloSoftVer;
+	SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5510, Data);
+}
+
+//初始化变速器工作参数
+void GearBox_Init(void)
+{
+    //根据仪表配置的变速器档位数量初始化变速比与档位对照表    
+    do
+	{
+    uint16_t K;
+		if(GearBox_OBC_SetParams.GearNum < 5)
+			GearBox_OBC_SetParams.GearNum = 5;
+		else if(GearBox_OBC_SetParams.GearNum > 24)
+			GearBox_OBC_SetParams.GearNum = 24;
+		K = (18000 - 5000) / (GearBox_OBC_SetParams.GearNum - 1);
+                for(uint8_t i = 0 ; i < (sizeof(GearBox_RatioTable) >> 1); i++)
+                    GearBox_RatioTable[i] = 0;
+		for(uint8_t i = 0; i < (GearBox_OBC_SetParams.GearNum - 1); i++)
+		{
+			GearBox_RatioTable[i] = 500 + (i * K) / 10;
+		}
+		GearBox_RatioTable[GearBox_OBC_SetParams.GearNum - 1] = 1800;
+	}while(0);
+
+	//初始化变速器参数
+	do
+	{
+		EnvioloConfigParams.FrontChain = MC_UpcInfo.stBikeInfo.uwNmFrontChainring;  //前牙盘,小牙盘升速比2.4
+		EnvioloConfigParams.RearTeeth = MC_UpcInfo.stBikeInfo.uwNmBackChainring;             //后牙盘
+		EnvioloConfigParams.WheelSize = MC_UpcInfo.stBikeInfo.uwWheelPerimeter + MC_UpcInfo.stBikeInfo.swWheelSizeAdjust - 100;  //周长,偏移100cm
+		EnvioloConfigParams.CadenceMin = GearBox_OBC_SetParams.CadenceMin;  //最低踏频
+		EnvioloConfigParams.CadenceMax = GearBox_OBC_SetParams.CadenceMax;  //最高踏频
+	}while(0);
+}
+
+//变速器处理主函数
+void GearBox_Loop(void)
+{
+    //开机3s后变速器仍离线直接退出
+	if((cp_ulSystickCnt > 3000) && (GearBox_Status == GEAR_STATUS_OFFLINE))
+	{
+		MC_RunInfo.GearBoxInfo = GEAR_STATUS_OFFLINE;
+		return;
+	}
+	
+	//解析变速器CAN数据
+	GearBox_CanProcess(&GearBox_CanData);
+
+	//变速器在线检测
+	if(GearBox_ComIsOK_Flag == TRUE)
+	{
+    if((cp_ulSystickCnt - GearBox_ComTrigTime) > 1000) //变速器超时1s认为离线
+		{
+			GearBox_ComIsOK_Flag = FALSE;
+		}
+	}
+
+	//变速器状态更新
+	switch(GearBox_Status)
+	{
+		case GEAR_STATUS_OFFLINE: //初始状态为离线模式,检测到变速器通讯正常,跳转为初始化模式
+		{
+			MC_RunInfo.GearBoxInfo = GearBox_Status;
+			//发送指令,激活变速器
+			do
+			{
+				static uint32_t SendPeriodCnt = 0;
+				if((cp_ulSystickCnt - SendPeriodCnt) > 200)
+				{
+					EnvioloControlParams.GearMode = ENVIOLO_ACTIVE;
+					GearBox_Send_EnvioloControlParams(&EnvioloControlParams);
+					SendPeriodCnt = cp_ulSystickCnt;
+				}
+			}while(0);
+
+			//变速器通讯正常,跳转初始化模式
+			if(GearBox_ComIsOK_Flag == TRUE)
+			{
+				GearBox_Status = GEAR_STATUS_INITIAL;
+			}
+			break;
+		}
+		case GEAR_STATUS_INITIAL:  //初始化模式,发送变速器状态给仪表
+		{
+            MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + 0x00;
+			//初始化完成,主动发送OBC变速器参数,发送5次。
+			do
+			{
+				static uint32_t SendPeriodCnt = 0;
+				static uint8_t SendCount = 0;
+				if(SendCount >= 5)
+					continue;
+				if((cp_ulSystickCnt - SendPeriodCnt) > 200)
+				{
+					GearBox_Send_OBC_Params(GearBox_CalFlag, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
+					SendPeriodCnt = cp_ulSystickCnt;
+					SendCount++;
+				}
+			}while(0);
+			
+			//等待仪表设置变速器工作模式,跳转到对应的模式
+			if(GearBox_OBC_SetMode.Mode != GEAR_MODE_NULL)
+			{
+				if(GearBox_OBC_SetMode.Mode == GEAR_MODE_MANUAL) //仪表设置变速器进入手动模式
+				{
+					GearBox_Status = GEAR_STATUS_MANUAL;
+				}
+				else if((GearBox_OBC_SetMode.Mode == GEAR_MODE_AUTO) || (GearBox_OBC_SetMode.Mode == GEAR_MODE_CAL)) //仪表设置变速器进入自动模式或校准模式
+				{
+					GearBox_Status = GEAR_STATUS_AUTO;
+				}
+			}			
+			break;
+		}
+		case GEAR_STATUS_MANUAL: case GEAR_STATUS_AUTO:  //手动、自动、校准,三种模式共用一个状态
+		{
+			//进入校准模式
+			if(GearBox_OBC_SetMode.Mode == GEAR_MODE_CAL)
+			{
+				EnvioloControlParams.GearMode = ENVIOLO_CAL_MODE;
+				EnvioloControlParams.RatioMode_Data = 0;
+				EnvioloControlParams.CadenceMode_Data = 0;
+			}
+			//进入手动模式
+			else if(GearBox_OBC_SetMode.Mode == GEAR_MODE_MANUAL)
+			{
+				GearBox_Status = GEAR_STATUS_MANUAL;
+				EnvioloControlParams.GearMode = ENVIOLO_MANUAL_MODE;
+				if(GearBox_OBC_SetMode.Value < 1)
+					EnvioloControlParams.RatioMode_Data = GearBox_RatioTable[0];
+				else if(GearBox_OBC_SetMode.Value > GearBox_OBC_SetParams.GearNum)
+					EnvioloControlParams.RatioMode_Data = GearBox_RatioTable[GearBox_OBC_SetParams.GearNum - 1];
+				else
+					EnvioloControlParams.RatioMode_Data = GearBox_RatioTable[GearBox_OBC_SetMode.Value - 1];
+				EnvioloControlParams.CadenceMode_Data = 0;
+			}
+			//进入自动模式
+			else if(GearBox_OBC_SetMode.Mode == GEAR_MODE_AUTO)
+			{
+				GearBox_Status = GEAR_STATUS_AUTO;
+				EnvioloControlParams.GearMode = ENVIOLO_AUTO_MODE;
+				if(GearBox_OBC_SetMode.Value < GearBox_OBC_SetParams.CadenceMin)
+					EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetParams.CadenceMin;
+				else if(GearBox_OBC_SetMode.Value > GearBox_OBC_SetParams.CadenceMax)
+					EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetParams.CadenceMax;
+				EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetMode.Value;
+				EnvioloControlParams.RatioMode_Data = 0;
+			}
+			//更新变速器运行信息,高5位表示变速器状态,低5位表示变速器当前档位
+			if(GearBox_ComIsOK_Flag == FALSE) //离线模式
+			{
+				MC_RunInfo.GearBoxInfo = GEAR_STATUS_OFFLINE;
+			}
+			else //在线时发送变速器信息
+			{
+        		if(GearBox_Status == GEAR_STATUS_MANUAL) //手动模式低五位发送挡位
+				{
+					MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + (GearBox_CalGearSt(EnvioloGearInfo1.Actual_Ratio * 100, GearBox_OBC_SetParams.GearNum) & 0x1F);
+				}
+				else if(GearBox_Status == GEAR_STATUS_AUTO) //自动模式低五位发送变速比,单位0.1
+				{
+					MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + (EnvioloGearInfo1.Actual_Ratio & 0x1F);
+				}
+			}					
+			//定时发送变速器控制指令
+			do
+			{
+				static uint32_t SendPeriodCnt = 0;
+				static uint8_t SendPluseCnt = 0;
+				static uint8_t SendCalCnt = 0;
+
+				if((cp_ulSystickCnt - SendPeriodCnt) > 1000) 
+				{
+					if(GearBox_OBC_SetMode.Mode == GEAR_MODE_CAL) //校准指令只发送5次
+					{
+						if(SendCalCnt < 5)
+						{
+							GearBox_Send_EnvioloControlParams(&EnvioloControlParams); //发送控制指令
+							SendCalCnt++;
+						}
+						SendPluseCnt = 0;
+					}
+					else //手动和自动指令定时发送
+					{
+						if(SendPluseCnt < 1)
+						{
+							GearBox_Send_EnvioloConfigParams(&EnvioloConfigParams); //发送配置参数
+							SendPluseCnt++;
+						}
+						else if(SendPluseCnt < 5)
+						{
+							GearBox_Send_EnvioloControlParams(&EnvioloControlParams); //发送控制指令
+							SendPluseCnt++;
+							if(SendPluseCnt >= 5)
+							{
+								SendPluseCnt = 0;
+							}
+						}
+						SendCalCnt = 0;
+					}
+					SendPeriodCnt = cp_ulSystickCnt;
+				}				 
+			}while(0);
+			//校准模式定时发送踩踏提示
+			do
+			{
+			  static uint32_t SendPeriodCnt = 0;
+				static uint8_t SendCount = 0xFF;
+				GearBox_CalFlag_Struct_t CalFlgTemp = GEAR_CAL_PEDAL;				
+				
+				if((cp_ulSystickCnt - SendPeriodCnt) > 1000)
+				{
+				  //校准中发送踩踏提示
+					if(GearBox_CalFlag == GEAR_CAL_NEED)
+					{
+					  CalFlgTemp = GEAR_CAL_PEDAL;
+						GearBox_Send_OBC_Params(CalFlgTemp, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
+						SendCount = 0;
+					}
+					//校准成功发送校准完成,发送5次
+					else if(GearBox_CalFlag == GEAR_CAL_SUCCESS)
+					{
+					  CalFlgTemp = GEAR_CAL_SUCCESS;
+						if(SendCount < 5)
+						{
+							GearBox_Send_OBC_Params(CalFlgTemp, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
+							SendCount++;
+						}
+					}
+					SendPeriodCnt = cp_ulSystickCnt;
+				}
+			}while(0);
+			break;
+		}		
+		default:
+			break;
+	}
+
+}
+

+ 52 - 7
User project/3.BasicFunction/Source/i2c_master.c

@@ -84,6 +84,14 @@ void i2c_voDefaultWriteBuffer(void)
         I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
         I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     }
+    
+    I2C_pBuffer = &Syspara2.stGearBoxPara.uwGearBoxNum.uwDefault1;
+    for (i = 0; i < I2C_GEARBOX_PARA_N_WORDS; i++)
+    {
+        I2C_ubWriteBuffer[I2C_GEARBOX_PARA_ADDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
+        I2C_ubWriteBuffer[I2C_GEARBOX_PARA_ADDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
+        I2C_pBuffer += I2C_PBUFFER_NWORDS;
+    }
 
     I2C_pWriteBuffer = I2C_ubWriteBuffer;
     I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES) >> 8);
@@ -104,6 +112,10 @@ void i2c_voDefaultWriteBuffer(void)
     I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_ASSIST_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES) >> 8);
     I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES));
+    
+    I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_GEARBOX_PARA_ADDR;
+    I2C_ubWriteBuffer[I2C_GEARBOX_PARA_CRC_ADDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_GEARBOX_PARA_N_BYTES) >> 8);
+    I2C_ubWriteBuffer[I2C_GEARBOX_PARA_CRC_ADDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_GEARBOX_PARA_N_BYTES));
 }
 /*************************************************************************
  Function:
@@ -159,6 +171,14 @@ void i2c_voParaWriteBuffer(void)
         I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
         I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     }
+    
+    I2C_pBuffer = &Syspara2.stGearBoxPara.uwGearBoxNum.uwDefault1;
+    for (i = 0; i < I2C_GEARBOX_PARA_N_WORDS; i++)
+    {
+        I2C_ubWriteBuffer[I2C_GEARBOX_PARA_ADDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8);
+        I2C_ubWriteBuffer[I2C_GEARBOX_PARA_ADDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1));
+        I2C_pBuffer += I2C_PBUFFER_NWORDS;
+    }
 
     I2C_pWriteBuffer = I2C_ubWriteBuffer;
     I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES) >> 8);
@@ -179,6 +199,10 @@ void i2c_voParaWriteBuffer(void)
     I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_ASSIST_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES) >> 8);
     I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES));
+    
+    I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_GEARBOX_PARA_ADDR;
+    I2C_ubWriteBuffer[I2C_GEARBOX_PARA_CRC_ADDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_GEARBOX_PARA_N_BYTES) >> 8);
+    I2C_ubWriteBuffer[I2C_GEARBOX_PARA_CRC_ADDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_GEARBOX_PARA_N_BYTES));
 }
 /*************************************************************************
  Function:
@@ -224,14 +248,14 @@ void i2c_voHistoryWriteBuffer(void)
     I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
     for (i = 0; i < I2C_HISTORY_PARA_N_WORDS; i++)
     {
-        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = *(I2C_pBuffer + 1) >> 8;
-        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = *(I2C_pBuffer + 1);
+        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8);
+        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1));
         I2C_pBuffer += I2C_PBUFFER_NWORDS;
     }
 
     I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
-    I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR] = i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES) >> 8;
-    I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR + 1] = i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES);
+    I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES) >> 8);
+    I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES));
 }
 /*************************************************************************
  Function:
@@ -420,9 +444,9 @@ UWORD i2c_uwCRCCcitt(const UBYTE *ptubBuf, UWORD length)
 void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
 {
     UWORD uwMotorParaCRC, uwBikeParaCRC, uwMControlParaCRC;
-    UWORD uwSensorParaCRC, uwAssistParaCRC, uwHistoryParaCRC;
+    UWORD uwSensorParaCRC, uwAssistParaCRC, uwGearBoxParaCRC, uwHistoryParaCRC;
     UWORD uwMotorParaRdCRC, uwBikeParaRdCRC, uwMControlParaRdCRC;
-    UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwHistoryParaRdCRC;
+    UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwGearBoxParaRdCRC, uwHistoryParaRdCRC;
 
     I2C_pReadBuffer = I2C_ubReadBuffer[0];
     uwMotorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_MOTOR_PARA_N_BYTES);
@@ -430,7 +454,8 @@ void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
     uwMControlParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_MCONTROL_PARA_ARDDR, I2C_MCONTROL_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     uwSensorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_SENSOR_PARA_ARDDR, I2C_SENSOR_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     uwAssistParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_ASSIST_PARA_ARDDR, I2C_ASSIST_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
-
+    uwGearBoxParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_GEARBOX_PARA_ADDR, I2C_GEARBOX_PARA_N_BYTES);
+    
     I2C_pReadBuffer = I2C_ubReadBuffer[1];
     uwHistoryParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_HISTORY_PARA_N_BYTES);
 
@@ -439,6 +464,7 @@ void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
     uwMControlParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR + 1];
     uwSensorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR + 1];
     uwAssistParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR + 1];
+    uwGearBoxParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_GEARBOX_PARA_CRC_ADDR] << 8) + I2C_ubReadBuffer[0][I2C_GEARBOX_PARA_CRC_ADDR + 1];
     uwHistoryParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR + 1];
 
     if (uwMotorParaCRC != uwMotorParaRdCRC)
@@ -461,6 +487,10 @@ void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
     {
         out->blAssistParaFltFlg = TRUE;
     }
+    if (uwGearBoxParaCRC != uwGearBoxParaRdCRC)
+    {
+        out->blGearBoxParaFltFlg = TRUE;
+    }
     if (uwHistoryParaCRC != uwHistoryParaRdCRC)
     {
         out->blHistoryParaFltFlg = TRUE;
@@ -532,6 +562,17 @@ void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
     else
     {}
 
+    if (out->blGearBoxParaFltFlg != TRUE)
+    {
+        for (j = 0; j < I2C_GEARBOX_PARA_N_WORDS; j++)
+        {
+            I2C_uwGearBoxParaRead[j] =
+                        (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_GEARBOX_PARA_ADDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_GEARBOX_PARA_ADDR + 2 * j + 1];
+        }
+    }
+    else
+    {}
+    
     if (out->blHistoryParaFltFlg != TRUE)
     {
         for (j = 0; j < I2C_HISTORY_PARA_N_WORDS; j++)
@@ -612,6 +653,10 @@ void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
     Syspara2.stAssistPara.uwAssistLimitBikeSpdStart.uwReal = I2C_uwAssistParaRead[9];
     Syspara2.stAssistPara.uwAssistLimitBikeSpdStop.uwReal = I2C_uwAssistParaRead[10];
     Syspara2.stAssistPara.uwCadenceAssistWeight.uwReal = I2C_uwAssistParaRead[11];
+    
+    Syspara2.stGearBoxPara.uwGearBoxNum.uwReal = I2C_uwGearBoxParaRead[0];
+    Syspara2.stGearBoxPara.uwGearBoxCadenceMin.uwReal = I2C_uwGearBoxParaRead[1];
+    Syspara2.stGearBoxPara.uwGearBoxCadenceMax.uwReal = I2C_uwGearBoxParaRead[2];
 
     Syspara2.stHistoryPara.uwAssModSelect.uwReal = I2C_uwHistoryParaRead[0];
     Syspara2.stHistoryPara.uwOpenTimes.uwReal = I2C_uwHistoryParaRead[1];

+ 2 - 2
User project/3.BasicFunction/Source/power.c

@@ -68,7 +68,7 @@ void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_Butt
     ULONG ulPowerOFFDelayTime;
     
     ulPowerStartDelayTime =  (ULONG)(power_stPowStateCof.uwPowerStartTouchTimeCnt + ((uwPowerPara & 0xF000)>>12) * 200);//ms
-    ulPowerStartDelayTime =  (ULONG)(power_stPowStateCof.uwPowerShutTouchTimeCnt + ((uwPowerPara & 0x0F00)>>8) * 200);//ms
+    ulPowerOFFDelayTime =  (ULONG)(power_stPowStateCof.uwPowerShutTouchTimeCnt + ((uwPowerPara & 0x0F00)>>8) * 200);//ms
     ulAutoPowerOffDelayTime = (ULONG)((uwPowerPara & 0x00FF) * 60);//s
     
     switch(power_stPowStateOut.powerstate)
@@ -109,7 +109,7 @@ void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_Butt
             if (iGpio_Read(HW_GPIO_POWERSTATE_PIN) != 0)
             {
                 power_stPowStateOut.uwPowerShutdnCnt++;
-                if (power_stPowStateOut.uwPowerShutdnCnt >= ulPowerStartDelayTime)
+                if (power_stPowStateOut.uwPowerShutdnCnt >= ulPowerOFFDelayTime)
                 {
                     power_stPowStateOut.powerstate = POWER_OFF;
                     power_stPowStateOut.blPowerStartupFlg = FALSE;

+ 2 - 2
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Include/board_config.h

@@ -123,8 +123,8 @@
 /* GPIO*/
 #define HW_GPIO_POWERSTATE_PIN     0  ///> GPIOC  PIN0
 #define HW_GPIO_POWERLOCK_PIN      1  ///> GPIOC  PIN1
-#define HW_GPIO_BLIG_EN_PIN        2  ///> GPIOC  PIN7
-#define HW_GPIO_BLIG_6V_12V_EN_PIN 3  ///> GPIOC  PIN8
+#define HW_GPIO_BLIG_6V_12V_EN_PIN 2  ///> GPIOC  PIN7
+#define HW_GPIO_BLIG_EN_PIN        3  ///> GPIOC  PIN8
 #define HW_GPIO_FLIG_EN_PIN        4  ///> GPIOC  PIN15
 #define HW_GPIO_FLIG_6V_12V_EN_PIN 5  ///> GPIOC  PIN13
 #define HW_GPIO_BREAK_PIN          6  ///> GPIOC  PIN14

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

@@ -1048,6 +1048,18 @@ void hw_voInitCAN(void)
     can_filter.filter_enable = ENABLE;
     can_filter_init(&can_filter);
 
+    /* initialize filter 2 */ 
+    //配置过滤器2,Enviolo自动变速器
+    can_filter.filter_number = 2;
+    can_filter.filter_mode = CAN_FILTERMODE_MASK;
+    can_filter.filter_bits = CAN_FILTERBITS_32BIT;
+    can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_ENVIOLO_FILTER << 21) & 0xFFFF0000U) >> 16);// ((ulExtId<<3)>>16)&0xFFFF;
+    can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_ENVIOLO_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF;//((ulExtId<<3)&0xFFFF)|CAN_ID_EXT|CAN_RTR_Data;
+    can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_ENVIOLO_MASK << 21) & 0xFFFF0000U) >> 16); //((ulFilter<<3)>>16)&0xFFFF;
+    can_filter.filter_mask_low =  (uint16_t)((((uint32_t)ID_ENVIOLO_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA);
+    can_filter.filter_fifo_number = CAN_FIFO1;//过滤器2关联到FIFO1
+    can_filter.filter_enable = ENABLE;//激活过滤器0
+    can_filter_init(&can_filter);//滤波器初始化
 }
 /*************************************************************************
  Function:

+ 1 - 1
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h

@@ -47,7 +47,7 @@ Update Time
 #define MOTOR_WELLING_CITY_48V    0x30
 #define MOTOR_WELLING_MTB_48V     0x31
 
-#define MOTOR_ID_SEL              MOTOR_WELLING_MTB_36V    ///< syspar.h中也需要选择36V/48V系统
+#define MOTOR_ID_SEL              MOTOR_WELLING_MTB_48V    ///< syspar.h中也需要选择36V/48V系统
 
 /*======================================================================*
     Motor Parameters

+ 7 - 1
WLMCP_PACKED.ewp

@@ -660,7 +660,7 @@
                 </option>
                 <option>
                     <name>OOCOutputFile</name>
-                    <state>MC_CITY_V.0.1.0_20221125.bin</state>
+                    <state>MC_CITY_V0.1.10_20231023.bin</state>
                 </option>
                 <option>
                     <name>OOCCommandLineProducer</name>
@@ -2648,6 +2648,9 @@
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Include\display.h</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Include\enviolo_can.h</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Include\flash_master.h</name>
                 </file>
@@ -2708,6 +2711,9 @@
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Source\display.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Source\enviolo_can.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Source\flash_master.c</name>
                 </file>