Sfoglia il codice sorgente

1、完成协议接收和数据转换;
2、已测试根据ID过滤正确;
3、待增加与仪表通信指令。

Dail 1 anno fa
parent
commit
c8627d0571

+ 3 - 0
Core/Inc/can.h

@@ -96,6 +96,9 @@ extern CAN_HandleTypeDef hcan;
 #define ID_ENVIOLO_FILTER   	(uint16_t)(0x7AA)
 #define ID_ENVIOLO_MASK    		(uint16_t)(0x7FE)
 
+#define ID_BMS_MAGENE_FILTER  (uint16_t)(0x190)
+#define ID_BMS_MAGENE_MASK    (uint16_t)(0x7FC)
+
 #define ID_CDL_TO_MC_TE       0x651
 #define ID_MC_TE_TO_CDL       0x615
 

+ 16 - 26
Core/Src/can.c

@@ -41,7 +41,7 @@
 #include "can.h"
 #include "gpio.h"
 #include "can_process.h"
-#include "enviolo_can.h"
+#include "bms_magene.h"
 
 /* USER CODE BEGIN 0 */
 CanTxMsgTypeDef CAN_TxMessaage;
@@ -226,13 +226,13 @@ void HAL_CAN_Rx1CpltCallback(CAN_HandleTypeDef *CanHandle)
 	}
 	switch(CanHandle->pRx1Msg->StdId)
 	{
-		case ID_ENVIOLO_TO_MC_1: case ID_ENVIOLO_TO_MC_2:
+		case BMS_MAGENE_BASE_RPDO + BMS_MAGENE_ADDRESS_MAIN: case BMS_MAGENE_BASE_RPDO + BMS_MAGENE_ADDRESS_BACK:
 		{
 			if(CanHandle->pRx1Msg->DLC == 8)//由于没有帧头帧尾和CRC,故保证数据的准确性必须为8字节才解析
 			{
-				GearBox_CanData.RefreshFlag = TRUE;
-				GearBox_CanData.ID = CanHandle->pRx1Msg->StdId;
-				memcpy((uint8_t*)GearBox_CanData.Data, (uint8_t*)CanHandle->pRx1Msg->Data, 8);
+				BMS_Magene_CanData.RefreshFlag = 1;
+        BMS_Magene_CanData.ID = CanHandle->pRx1Msg->StdId;
+				memcpy((uint8_t*)BMS_Magene_CanData.Data, (uint8_t*)CanHandle->pRx1Msg->Data, 8);
 			}
 			break;
 		}
@@ -295,32 +295,20 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
 {
   CAN_FilterConfTypeDef  sFilterConfig;  
   
-	//设置过滤器组0,指定接收发送给PBU的数据
+	//设置过滤器组0,指定接收发送给PBU和CDL的数据
   sFilterConfig.FilterNumber = 0;//使用过滤器0             
   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//配置为掩码模式   
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//设置为32位宽 
 	
-  //过滤寄存器判断接收的报文ID,符合过滤寄存器的则接收
-  //屏蔽寄存器判断接收的报文ID,符合屏蔽寄存器的则丢弃
-  //当屏蔽寄存器的某位为0时,过滤寄存器的相应位不起作用,即信息标识符相应位无论是0还是1都会被接收
-  //当屏蔽寄存器的某位为1时,信息标识符相应位与过滤器的相应位必须一致才能接收
-	//设置过滤寄存器
-  //(0x701 & 0x605)=601
-  //0X601<<21 0110 0000 0001 <<21 --> 1100 0000 0010 0000 0000 0000 0000 0000 -->C0200000
-  //0XC0200000&0XFFFF0000=0XC0200000
-  //0XC0200000>>16=0XC020
-  //0xC0200000|0x00000000U|0x00000000U=0XC0200000=0X0000
+  //设置过滤寄存器
   sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_TO_MC_FILTER << 21) & 0xFFFF0000) >> 16); //0XC020  
   sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_TO_MC_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;//0X0000  
   
-  //(0x70F & 0x60F)=60F  
-  //60F<<21 0110 0000 1111<<21 -->1100 0001 1110 0000 0000 0000 0000 0000 -->0XC1E0 0000
 	//设置屏蔽寄存器
   sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_TO_MC_MASK << 21) & 0xFFFF0000) >> 16);//0XC1E0  
   sFilterConfig.FilterMaskIdLow = 0xFFFF;       
-  //以上定义的含义为:1100 0000 0010 0000 0000 0000 0000 0000
-  //                 1100 0001 1110 0000 1111 1111 1111 1111
-  //                   
+
+  //FIFO0                  
   sFilterConfig.FilterFIFOAssignment = 0; //设置通过的数据帧进入到FIFO中   
   sFilterConfig.FilterActivation = ENABLE;   
     
@@ -341,7 +329,8 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
 	//设置屏蔽寄存器
   sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF0000) >> 16);;  
   sFilterConfig.FilterMaskIdLow = 0xFFFF;       
-    
+
+  //FIFO0  
   sFilterConfig.FilterFIFOAssignment = 0;    
   sFilterConfig.FilterActivation = ENABLE;   
     
@@ -356,13 +345,14 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//设置为32位宽  
 	
 	//设置过滤寄存器
-  sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_ENVIOLO_FILTER << 21) & 0xFFFF0000) >> 16);
-  sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_ENVIOLO_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;  
+  sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_BMS_MAGENE_FILTER << 21) & 0xFFFF0000) >> 16);
+  sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_BMS_MAGENE_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;  
     
 	//设置屏蔽寄存器
-  sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_ENVIOLO_MASK << 21) & 0xFFFF0000) >> 16);
+  sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_BMS_MAGENE_MASK << 21) & 0xFFFF0000) >> 16);
   sFilterConfig.FilterMaskIdLow = 0xFFFF;       
-    
+
+  //FIFO1  
   sFilterConfig.FilterFIFOAssignment = 1;    
   sFilterConfig.FilterActivation = ENABLE;   
     

+ 6 - 5
Core/Src/main.c

@@ -67,6 +67,7 @@
 #include "flash_read_protection.h"
 #include "hardware_check.h"
 #include "enviolo_can.h"
+#include "bms_magene.h"
 /* USER CODE END Includes */
 
 /* Private variables ---------------------------------------------------------*/
@@ -183,8 +184,8 @@ int main(void)
 	//MC控制初始化
 	MC_Init();//339ms
 	
-    //变速器参数初始化
-	GearBox_Init();
+    //BMS参数初始化
+	BMS_Magene_VarInit();
 
 	//检查电机是否授权
 	#if 0	
@@ -356,10 +357,10 @@ int main(void)
 			//指拨模式计算函数
 			SpdProportion_calculate();
 			
-			//变速器处理
-      GearBox_Loop();
+			//BMS处理主循环 
+     		BMS_Magene_Loop();    
 
-      //MCU自检
+      		//MCU自检
 			STU_TimeBase();
 			STU_DoRunTimeChecks();
 			

+ 11 - 1
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -14,6 +14,8 @@
         <TargetCommonOption>
           <Device>STM32F103RB</Device>
           <Vendor>STMicroelectronics</Vendor>
+          <PackID>Keil.STM32F1xx_DFP.2.3.0</PackID>
+          <PackURL>http://www.keil.com/pack/</PackURL>
           <Cpu>IROM(0x08000000,0x20000) IRAM(0x20000000,0x5000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
           <FlashUtilSpec></FlashUtilSpec>
           <StartupFile></StartupFile>
@@ -82,6 +84,8 @@
             <UserProg2Name>.\crc_gen_keil.bat</UserProg2Name>
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopA1X>0</nStopA1X>
+            <nStopA2X>0</nStopA2X>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
           <SVCSIdString></SVCSIdString>
@@ -143,7 +147,6 @@
             <RestoreToolbox>1</RestoreToolbox>
             <RestoreTracepoints>1</RestoreTracepoints>
             <RestoreSysVw>1</RestoreSysVw>
-            <UsePdscDebugDescription>1</UsePdscDebugDescription>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>6</TargetSelection>
@@ -360,6 +363,8 @@
             <uSurpInc>0</uSurpInc>
             <uC99>1</uC99>
             <useXO>0</useXO>
+            <v6Lang>0</v6Lang>
+            <v6LangP>0</v6LangP>
             <VariousControls>
               <MiscControls></MiscControls>
               <Define>USE_HAL_DRIVER,STM32F103xB,PEGASI_36V,BARD_250K</Define>
@@ -637,6 +642,11 @@
               <FileType>1</FileType>
               <FilePath>..\User\Src\hardware_check.c</FilePath>
             </File>
+            <File>
+              <FileName>bms_magene.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\User\Src\bms_magene.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

File diff suppressed because it is too large
+ 2621 - 2621
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 9 - 7
MDK-ARM/startup_stm32f103xb.lst

@@ -516,18 +516,20 @@ ARM Macro Assembler    Page 8
   334 00000004         
   335 00000004         
   336 00000004                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_stm32f103xb.o -ID:\So
+Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
+ork --depend=.\qd007a_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_
 
 
 
 ARM Macro Assembler    Page 9 
 
 
-ftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RT
-E -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Kei
-l\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICROLIB SETA 1" --list=sta
-rtup_stm32f103xb.lst startup_stm32f103xb.s
+stm32f103xb.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010
+A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CMSIS\Core\Include
+ -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include --predefine="__M
+ICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" --predefine="_RTE_ SET
+A 1" --predefine="STM32F10X_MD SETA 1" --list=startup_stm32f103xb.lst startup_s
+tm32f103xb.s
 
 
 
@@ -1257,4 +1259,4 @@ Symbol: __main
       At line 152 in file startup_stm32f103xb.s
 Comment: __main used once
 2 symbols
-405 symbols in table
+408 symbols in table

+ 16 - 8
MDK-ARM/stm32f1xx_stucpuregsaddressing.lst

@@ -121,13 +121,21 @@ ARM Macro Assembler    Page 2
                                                             ler
    98 00000096                 ENDP
    99 00000096                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\stm32f1xx_stucpuregsaddressing.d -o.\qd007a_ctl_app\stm32f1xx_stucpure
-gsaddressing.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-01
-0A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC
-:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICRO
-LIB SETA 1" --list=stm32f1xx_stucpuregsaddressing.lst ..\SelfTestUser\src_speci
-fic\stm32f1xx_STUCpuRegsAddressing.s
+Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
+ork --depend=.\qd007a_ctl_app\stm32f1xx_stucpuregsaddressing.d -o.\qd007a_ctl_a
+pp\stm32f1xx_stucpuregsaddressing.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-0
+10A_CTRL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.
+6.0\CMSIS\Core\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\In
+clude --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" 
+--predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_s
+
+
+
+ARM Macro Assembler    Page 3 
+
+
+tucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuRegsAddres
+sing.s
 
 
 
@@ -239,4 +247,4 @@ ssing.s
 ssing.s
 Comment: FailSafePOR used once
 3 symbols
-338 symbols in table
+341 symbols in table

+ 9 - 8
MDK-ARM/stm32f1xx_stucpuwalkpatkeil.lst

@@ -1591,13 +1591,14 @@ ARM Macro Assembler    Page 25
  1170 000006D0         
  1171 000006D0         
  1172 000006D0                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\stm32f1xx_stucpuwalkpatkeil.d -o.\qd007a_ctl_app\stm32f1xx_stucpuwalkp
-atkeil.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTR
-L_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC:\Keil
-_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICROLIB SE
-TA 1" --list=stm32f1xx_stucpuwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32
-f1xx_STUCpuWalkpatKEIL.s
+Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
+ork --depend=.\qd007a_ctl_app\stm32f1xx_stucpuwalkpatkeil.d -o.\qd007a_ctl_app\
+stm32f1xx_stucpuwalkpatkeil.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CT
+RL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CM
+SIS\Core\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include 
+--predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" --pred
+efine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_stucpuw
+alkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalkpatKEIL.s
 
 
 
@@ -2665,4 +2666,4 @@ KEIL.s
 KEIL.s
 
 1 symbol
-398 symbols in table
+401 symbols in table

+ 9 - 8
MDK-ARM/stm32f1xx_sturamwalkpatkeil.lst

@@ -428,13 +428,14 @@ ARM Macro Assembler    Page 7
   329 000001F2                 ENDP
   330 000001F2         
   331 000001F2                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\stm32f1xx_sturamwalkpatkeil.d -o.\qd007a_ctl_app\stm32f1xx_sturamwalkp
-atkeil.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTR
-L_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC:\Keil
-_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICROLIB SE
-TA 1" --list=stm32f1xx_sturamwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32
-f1xx_STURamWalkpatKEIL.s
+Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
+ork --depend=.\qd007a_ctl_app\stm32f1xx_sturamwalkpatkeil.d -o.\qd007a_ctl_app\
+stm32f1xx_sturamwalkpatkeil.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CT
+RL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CM
+SIS\Core\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include 
+--predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" --pred
+efine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_sturamw
+alkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWalkpatKEIL.s
 
 
 
@@ -811,4 +812,4 @@ IL.s
       None
 Comment: FailSafePOR unused
 1 symbol
-360 symbols in table
+363 symbols in table

+ 232 - 0
User/Inc/bms_magene.h

@@ -0,0 +1,232 @@
+#ifndef __BMS_MAGENE_H_
+#define __BMS_MAGENE_H_
+
+#include "stdint.h"
+#include "can.h"
+#include "var.h"
+
+//基础ID
+#define  BMS_MAGENE_BASE_TPDO 0x180
+#define  BMS_MAGENE_BASE_RPDO 0x200
+
+//电池地址
+#define BMS_MAGENE_ADDRESS_MAIN 0x11
+#define BMS_MAGENE_ADDRESS_BACK 0x12
+
+//PageID
+#define BMS_MAGENE_STATUS_PAGE_ID  0xF0
+#define BMS_MAGENE_CTRL_PAGE_ID    0xE4
+#define BMS_MAGENE_BROAD_PAGE_ID   0xE4
+
+//状态类别码
+#define BMS_MAGENE_FUC_CODE_BASE_INFO   (uint8_t)9
+#define BMS_MAGENE_FUC_CODE_CAP_INFO    (uint8_t)10
+#define BMS_MAGENE_FUC_CODE_CYC_INFO    (uint8_t)11
+#define BMS_MAGENE_FUC_CODE_STA_INFO    (uint8_t)12
+#define BMS_MAGENE_FUC_CODE_RTC_INFO    (uint8_t)13
+#define BMS_MAGENE_FUC_CODE_CELL1_INFO  (uint8_t)14
+#define BMS_MAGENE_FUC_CODE_CELL2_INFO  (uint8_t)15
+#define BMS_MAGENE_FUC_CODE_CELL3_INFO  (uint8_t)16
+#define BMS_MAGENE_FUC_CODE_CELL4_INFO  (uint8_t)17
+#define BMS_MAGENE_FUC_CODE_CELL5_INFO  (uint8_t)18
+#define BMS_MAGENE_FUC_CODE_TMP_INFO    (uint8_t)19
+#define BMS_MAGENE_FUC_CODE_SW_INFO     (uint8_t)20
+
+//控制命令码
+#define BMS_MAGENE_CTRL_CODE_SW_INFO    (uint8_t)6
+#define BMS_MAGENE_BRD_CODE_UPD_INFO    (uint8_t)5
+
+//电池基本状态数据 9
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t Voltage;
+    int16_t Current;
+    uint8_t Temperature;
+    uint8_t WorkState;
+}BMS_Magene_BaseInfo_Struct;
+
+//电池容量数据 10
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t FullCapcity;
+    uint16_t RemainCapcity;
+    uint8_t SOC;
+    uint8_t SOH;
+}BMS_Magene_CapInfo_Struct;
+
+//电池循环数据 11
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t CycleCount;
+    uint16_t DesignCapcity;
+    uint16_t ErrCode;
+}BMS_Magene_CycInfo_Struct;
+
+//电池状态数据 12
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t LastChargeTime;
+    uint16_t MaxChargeTime;
+    uint16_t BatState;
+}BMS_Magene_StaInfo_Struct;
+
+//电池时间数据 13
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint32_t Time;
+    uint16_t DesignVol;
+}BMS_Magene_RtcInfo_Struct;
+
+//电池电芯数据1 14
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t CellVol[3];    
+}BMS_Magene_CellInfo1_Struct;
+
+//电池电芯数据2 15
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t CellVol[3];    
+}BMS_Magene_CellInfo2_Struct;
+
+//电池电芯数据3 16
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t CellVol[3];    
+}BMS_Magene_CellInfo3_Struct;
+
+//电池电芯数据4 17
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t CellVol[3];    
+}BMS_Magene_CellInfo4_Struct;
+
+//电池电芯数据5 18
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint16_t CellVol[3];    
+}BMS_Magene_CellInfo5_Struct;
+
+//电池温度数据 19
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint8_t ChgMosT;
+    uint8_t DisChgMosT;
+    uint8_t CellT_Max;
+    uint8_t CellT_Min;
+    uint8_t CellT_Max_Num;
+    uint8_t CellT_Min_Num;
+}BMS_Magene_TmpInfo_Struct;
+
+//电池状态数据 20
+typedef struct
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint8_t Rsv1;
+    uint8_t State;
+    uint8_t Rsv2;
+    uint8_t Rsv3;
+    uint8_t Rsv4;
+    uint8_t Rsv5;
+}BMS_Magene_BatStInfo_Struct;
+
+//电池TPDO数据
+typedef struct
+{
+    BMS_Magene_BaseInfo_Struct BaseInfo;
+    BMS_Magene_CapInfo_Struct CapInfo;
+    BMS_Magene_CycInfo_Struct CycInfo;
+    BMS_Magene_StaInfo_Struct StaInfo; 
+    BMS_Magene_RtcInfo_Struct RtcInfo;
+    BMS_Magene_CellInfo1_Struct CellInfo1;
+    BMS_Magene_CellInfo2_Struct CellInfo2;
+    BMS_Magene_CellInfo3_Struct CellInfo3;
+    BMS_Magene_CellInfo4_Struct CellInfo4;
+    BMS_Magene_CellInfo5_Struct CellInfo5;
+    BMS_Magene_TmpInfo_Struct TmpInfo;
+    BMS_Magene_BatStInfo_Struct BatStInfo;
+}BMS_Magene_TPDOInfo_Struct;
+
+//主机控制
+typedef struct 
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint8_t Switch;
+    uint8_t Rsv1;
+    uint8_t MosCtrl;
+    uint8_t Rsv2;
+    uint8_t Rsv3;
+    uint8_t Rsv4;
+}BMS_Magene_CtrCode_Struct;
+
+//主机广播
+typedef struct 
+{
+    uint8_t PageID;
+    uint8_t Code;
+    uint8_t Upd;
+    uint8_t Rsv1;
+    uint8_t Rsv2;
+    uint8_t Rsv3;
+    uint8_t Rsv4;
+    uint8_t Rsv5;
+}BMS_Magene_BrdCode_Struct;
+
+//电池RPDO数据
+typedef struct
+{
+    BMS_Magene_CtrCode_Struct CtrCode;
+    BMS_Magene_BrdCode_Struct BrdCode;
+}BMS_Magene_RPDOInfo_Struct;
+
+//BMS在线状态
+typedef struct 
+{
+    uint8_t OnLineFlag; //0-在线,1-离线
+    uint32_t TimeCnt;
+}BMS_Magene_OnLineCheck_Struct;
+
+//BMS报文数据
+typedef struct
+{
+	uint8_t RefreshFlag; //0-更新,1-未更新
+	uint8_t RS;
+	uint16_t ID;
+	uint8_t Data[8];
+}BMS_Magene_CanData_Struct_t;
+
+//全局变量
+extern BMS_Magene_TPDOInfo_Struct BMS_Magene_TPDOInfo_Main, BMS_Magene_TPDOInfo_Back;  //电池主动上报数据
+extern BMS_Magene_RPDOInfo_Struct BMS_Magene_RPDOInfo_Main, BMS_Magene_RPDOInfo_Back;  //电池控制参数
+extern BMS_Magene_OnLineCheck_Struct BMS_Magene_OnLineCheck_Main, BMS_Magene_OnLineCheck_Back; //电池在线检测
+extern BMS_Magene_CanData_Struct_t BMS_Magene_CanData; 
+
+//全局函数
+extern void BMS_Magene_VarInit(void); //参数初始化
+extern void BMS_Magene_Loop(void);    //BMS处理主循环 
+
+#endif

+ 112 - 7
User/Inc/var.h

@@ -369,14 +369,14 @@ typedef union
 {
   struct
 	{
-		uint8_t Charge      :1;//充电
-		uint8_t Discharge   :1;//放电
+		uint8_t Charge  :1;//充电
 		uint8_t RS1 :1;
 		uint8_t RS2 :1;
 		uint8_t RS3 :1;
 		uint8_t RS4 :1;
 		uint8_t RS5 :1;
 		uint8_t RS6 :1;
+		uint8_t RS7 :1;
 	}Status_Bit;
   uint8_t Status;	
 }BMS_STATUS_Struct_t;
@@ -384,25 +384,125 @@ typedef union
 //电池运行信息,占用空间16bytes
 typedef struct
 {
-  uint16_t Voltage;              //电压 1mV,地址偏移0
+    uint16_t Voltage;              //电压 1mV,地址偏移0
 	uint16_t Current;              //电流 1mA,地址偏移2
 	uint16_t RC;                   //剩余容量 1mAh,地址偏移4
 	uint16_t FCC;                  //满充容量 1mAh,地址偏移6
 	uint8_t Cell_NTC;              //电芯温度 +40℃,地址偏移8
 	uint8_t SOC;                   //剩余电量 1%,地址偏移9
 	BMS_STATUS_Struct_t Status;    //运行状态,地址偏移10
-	uint8_t RS[5];
+	uint8_t SOH;                   //寿命状态
+	uint8_t CycleCount;            //循环次数
+	uint16_t RemainChgTime;        //剩余充电时间
 }BMS_RunInfo_Struct_t;
 
+//电池电芯电压
+typedef struct
+{
+	uint16_t Cell1;
+	uint16_t Cell2;
+	uint16_t Cell3;
+	uint16_t Cell4;
+	uint16_t Cell5;
+	uint16_t Cell6;
+	uint16_t Cell7;
+	uint16_t Cell8;
+	uint16_t Cell9;
+	uint16_t Cell10;
+	uint16_t Cell11;
+	uint16_t Cell12;
+	uint16_t Cell13;
+	uint16_t Cell14;
+	uint16_t Cell15;
+	uint16_t Cell16;
+}BMS_CellVol_Struct_t;
+
+//电池故障码
+typedef union
+{
+    struct
+	{
+		uint32_t DOC_Protect2     :1;//二级过流保护
+		uint32_t COC_Protect      :1;//充电过流保护
+		uint32_t SC_Protect       :1;//短路保护
+		uint32_t UV_Protect       :1;//过放保护
+
+		uint32_t OV_Protect       :1; //过充保护
+		uint32_t DUT_Protect      :1;//放电低温保护
+		uint32_t DOT_Protect      :1;//放电过热保护
+		uint32_t CUT_Protect      :1;//充电低温保护
+
+		uint32_t COT_Protect      :1;//充电过热保护
+		uint32_t DMOS_Fault       :1;//放电MOS故障
+		uint32_t CMOS_Fault       :1;//充电MOS故障
+		uint32_t NTC_Fault        :1;//温度传感器故障
+
+		uint32_t RS1              :1;//预留
+		uint32_t DOC_Protect1     :1;//一级过流保护
+		uint32_t AFE_Fault        :1;//AFE故障
+		uint32_t MCU_Fault        :1;//MCU故障
+
+		uint32_t OV_Alarm         :1;//充电过压警告
+		uint32_t UV_Alarm         :1;//放电低压警告
+		uint32_t COC_Alarm        :1;//充电过流警告
+		uint32_t DOC_Alarm        :1;//放电过流警告
+		
+		uint32_t COT_Alarm        :1;//充电过热警告
+		uint32_t CUT_Alarm        :1;//充电低温警告
+		uint32_t DOT_Alarm        :1;//放电过热警告
+		uint32_t DUT_Alarm        :1;//放电低温警告
+		
+		uint32_t MOS_OT_Alarm     :1;//MOS过热警告
+		uint32_t RS2 :1;
+		uint32_t RS3 :1;
+		uint32_t RS4 :1;
+
+		uint32_t RS5 :1;
+		uint32_t RS6 :1;
+		uint32_t RS7 :1;
+		uint32_t RS8 :1;
+	}Error_Bit;
+  uint32_t Code;	
+}BMS_ErrorCode_Struct_t;
+
 //BMS设计信息,占用空间16bytes
 typedef struct
 {
 	uint16_t Capacity;   //电池设计容量,地址偏移0
 	uint8_t Voltage;     //电池设计电压,地址偏移2
-	uint8_t CellMode[8]; //电芯型号,地址偏移3
-	uint8_t RS[5];
+	char CellMode[8]; //电芯型号,地址偏移3
+	uint8_t CellNum;     //电芯数量
+	uint8_t RS[4];
 }BMS_DesignInfo_Struct_t;
 
+//BMS版本信息,占用空间64bytes
+typedef struct
+{
+    char Mode[16];             //型号 ASCII,0x2E结束,无效填充0x20
+	char SN_Num[16];           //序列号 ASCII,0x2E结束,无效填充0x20
+	char HW_Version[16];       //硬件版本 ASCII,0x2E结束,无效填充0x20
+	char FW_Version[16];       //软件版本 ASCII,0x2E结束,无效填充0x20
+}BMS_VerInfo_Struct_t;
+
+//BMS生产信息
+typedef struct
+{
+    char Manufacturer[8];       //生产厂商 ASCII,0x2E结束,无效填充0x20
+	char MacAddr[8];            //生产地 ASCII,0x2E结束,无效填充0x20
+	char MacDate[8];            //生产日期 ASCII,0x2E结束,无效填充0x20
+	char ProductTag[8];         //产品标识
+}BMS_MacInfo_Struct_t;
+
+//BMS使用记录
+typedef struct
+{
+	uint8_t Max_Tmp;
+	uint8_t Min_Tmp;
+	uint16_t LastChgTime;
+	uint16_t MaxChgTime;
+	uint8_t Rsv[10];
+}BMS_UsrLog_Struct_t;
+
 //电池电芯放电信息,占用空间204bytes
 typedef struct BATTERY
 {
@@ -538,9 +638,14 @@ extern char Firmware_Special[32];
 extern uint8_t MC_TagInfo[32];
 extern OnLine_Status_Struct_t DeviceOnLine_Status;
 extern BMS_RunInfo_Struct_t BMS_RunInfo;
+extern BMS_CellVol_Struct_t BMS_CellVol;
+extern BMS_ErrorCode_Struct_t BMS_ErrorCode;
+extern BMS_DesignInfo_Struct_t BMS_DesignInfo;
+extern BMS_VerInfo_Struct_t BMS_VerInfo;
+extern BMS_MacInfo_Struct_t BMS_MacInfo; 
+extern BMS_UsrLog_Struct_t BMS_UsrLog;
 extern Device_CheckInfo_Struct_t BMS_CheckInfo;
 extern BatterCellInfo_Struct_t BatteryCellInfo;
-extern BMS_DesignInfo_Struct_t BMS_DesignInfo;
 extern Device_CheckInfo_Struct_t PBU_CheckInfo;
 extern PBU_ConfigParam_Struct_t PBU_ConfigParam;
 extern Device_CheckInfo_Struct_t HMI_CheckInfo;

+ 252 - 0
User/Src/bms_magene.c

@@ -0,0 +1,252 @@
+#include "bms_magene.h"
+
+//全局变量
+BMS_Magene_TPDOInfo_Struct BMS_Magene_TPDOInfo_Main, BMS_Magene_TPDOInfo_Back;  //电池主动上报数据
+BMS_Magene_RPDOInfo_Struct BMS_Magene_RPDOInfo_Main, BMS_Magene_RPDOInfo_Back;  //电池控制参数
+BMS_Magene_OnLineCheck_Struct BMS_Magene_OnLineCheck_Main, BMS_Magene_OnLineCheck_Back; //电池在线检测
+BMS_Magene_CanData_Struct_t BMS_Magene_CanData; //电池报文数据
+
+//局部函数
+/*BMS数据更新*/
+void BMS_InfoUpdate(void)
+{
+    static uint32_t PeriodCnt = 0;
+    if((HAL_GetTick() - PeriodCnt <= 1000))
+        return;
+    else
+        PeriodCnt = HAL_GetTick();
+    //仅主电池打开
+    if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 1) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 0))
+    {
+        //运行信息
+        BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Main.BaseInfo.Voltage;
+        BMS_RunInfo.Current = BMS_Magene_TPDOInfo_Main.BaseInfo.Current;
+        BMS_RunInfo.RC = BMS_Magene_TPDOInfo_Main.CapInfo.RemainCapcity;
+        BMS_RunInfo.FCC = BMS_Magene_TPDOInfo_Main.CapInfo.FullCapcity;
+        BMS_RunInfo.Cell_NTC = BMS_Magene_TPDOInfo_Main.BaseInfo.Temperature;
+        BMS_RunInfo.SOC = BMS_Magene_TPDOInfo_Main.CapInfo.SOC;
+        BMS_RunInfo.Status.Status = (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3) ? 0x01 : 0x00;
+        BMS_RunInfo.SOH = BMS_Magene_TPDOInfo_Main.CapInfo.SOH;
+        BMS_RunInfo.CycleCount = BMS_Magene_TPDOInfo_Main.CycInfo.CycleCount;
+        if(BMS_Magene_TPDOInfo_Main.BaseInfo.Current >= 100)        
+            BMS_RunInfo.RemainChgTime = (BMS_Magene_TPDOInfo_Main.CapInfo.FullCapcity - BMS_Magene_TPDOInfo_Main.CapInfo.RemainCapcity) * 60 / BMS_Magene_TPDOInfo_Main.BaseInfo.Current;        
+        else
+            BMS_RunInfo.RemainChgTime = 0;
+        //电芯电压
+        BMS_CellVol.Cell1 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[0];
+        BMS_CellVol.Cell2 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[1];
+        BMS_CellVol.Cell3 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[2];
+        BMS_CellVol.Cell4 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[0];
+        BMS_CellVol.Cell5 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[1];
+        BMS_CellVol.Cell6 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[2];
+        BMS_CellVol.Cell7 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[0];
+        BMS_CellVol.Cell8 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[1];
+        BMS_CellVol.Cell9 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[2];
+        BMS_CellVol.Cell10 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[0];
+        BMS_CellVol.Cell11 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[1];
+        BMS_CellVol.Cell12 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[2];
+        BMS_CellVol.Cell13 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[0];
+        BMS_CellVol.Cell14 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[1];
+        BMS_CellVol.Cell15 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[2];
+        BMS_CellVol.Cell16 = 0;
+        //故障码
+        BMS_ErrorCode.Code = 0; //BMS故障时无法放电,不处理
+        //设计信息        
+        BMS_DesignInfo.Capacity = BMS_Magene_TPDOInfo_Main.CycInfo.DesignCapcity;
+        BMS_DesignInfo.Voltage = BMS_Magene_TPDOInfo_Main.RtcInfo.DesignVol;
+        strcpy(BMS_DesignInfo.CellMode, "NONE    ");
+        BMS_DesignInfo.CellNum = 0;
+        //版本信息
+				strcpy(BMS_VerInfo.Mode, "MAGENE          ");
+				strcpy(BMS_VerInfo.SN_Num, "");
+				strcpy(BMS_VerInfo.HW_Version, "");
+			  strcpy(BMS_VerInfo.FW_Version, "");
+        //生产信息
+				strcpy(BMS_MacInfo.Manufacturer, "MAGENE  ");
+				strcpy(BMS_MacInfo.MacAddr, "");
+				strcpy(BMS_MacInfo.MacDate, "");
+				strcpy(BMS_MacInfo.ProductTag, "");				
+        //使用记录
+        BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Max;
+        BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Min;
+        BMS_UsrLog.LastChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.LastChargeTime;
+        BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.MaxChargeTime;       
+    }
+    //仅副电池打开
+    else if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 0) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 1))
+    {
+        //运行信息
+        BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Back.BaseInfo.Voltage;
+        BMS_RunInfo.Current = BMS_Magene_TPDOInfo_Back.BaseInfo.Current;
+        BMS_RunInfo.RC = BMS_Magene_TPDOInfo_Back.CapInfo.RemainCapcity;
+        BMS_RunInfo.FCC = BMS_Magene_TPDOInfo_Back.CapInfo.FullCapcity;
+        BMS_RunInfo.Cell_NTC = BMS_Magene_TPDOInfo_Back.BaseInfo.Temperature;
+        BMS_RunInfo.SOC = BMS_Magene_TPDOInfo_Back.CapInfo.SOC;
+        BMS_RunInfo.Status.Status = (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3) ? 0x01 : 0x00;
+        BMS_RunInfo.SOH = BMS_Magene_TPDOInfo_Back.CapInfo.SOH;
+        BMS_RunInfo.CycleCount = BMS_Magene_TPDOInfo_Back.CycInfo.CycleCount;
+        if(BMS_Magene_TPDOInfo_Back.BaseInfo.Current >= 100)        
+            BMS_RunInfo.RemainChgTime = (BMS_Magene_TPDOInfo_Back.CapInfo.FullCapcity - BMS_Magene_TPDOInfo_Back.CapInfo.RemainCapcity) * 60 / BMS_Magene_TPDOInfo_Back.BaseInfo.Current;        
+        else
+            BMS_RunInfo.RemainChgTime = 0;
+        //电芯电压
+        BMS_CellVol.Cell1 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[0];
+        BMS_CellVol.Cell2 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[1];
+        BMS_CellVol.Cell3 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[2];
+        BMS_CellVol.Cell4 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[0];
+        BMS_CellVol.Cell5 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[1];
+        BMS_CellVol.Cell6 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[2];
+        BMS_CellVol.Cell7 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[0];
+        BMS_CellVol.Cell8 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[1];
+        BMS_CellVol.Cell9 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[2];
+        BMS_CellVol.Cell10 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[0];
+        BMS_CellVol.Cell11 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[1];
+        BMS_CellVol.Cell12 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[2];
+        BMS_CellVol.Cell13 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[0];
+        BMS_CellVol.Cell14 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[1];
+        BMS_CellVol.Cell15 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[2];
+        BMS_CellVol.Cell16 = 0;
+        //故障码
+        BMS_ErrorCode.Code = 0; //BMS故障时无法放电,不处理
+        //设计信息        
+        BMS_DesignInfo.Capacity = BMS_Magene_TPDOInfo_Back.CycInfo.DesignCapcity;
+        BMS_DesignInfo.Voltage = BMS_Magene_TPDOInfo_Back.RtcInfo.DesignVol;
+        strcpy(BMS_DesignInfo.CellMode, "NONE    ");
+        BMS_DesignInfo.CellNum = 0;
+        //版本信息
+				strcpy(BMS_VerInfo.Mode, "MAGENE          ");
+				strcpy(BMS_VerInfo.SN_Num, "");
+				strcpy(BMS_VerInfo.HW_Version, "");
+			  strcpy(BMS_VerInfo.FW_Version, "");
+        //生产信息
+				strcpy(BMS_MacInfo.Manufacturer, "MAGENE  ");
+				strcpy(BMS_MacInfo.MacAddr, "");
+				strcpy(BMS_MacInfo.MacDate, "");
+				strcpy(BMS_MacInfo.ProductTag, "");	
+        //使用记录
+        BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Max;
+        BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Min;
+        BMS_UsrLog.LastChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.LastChargeTime;
+        BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.MaxChargeTime;
+    }
+    //主副电池同时打开
+    else if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 1) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 1))
+    {
+        //暂不考虑
+    }        
+}
+
+/*BMS开关控制*/
+void BMS_SwitchCtl(void)
+{
+    //暂时只考虑单电池,电池需要先打开
+}
+
+/*BMS在线检测*/
+void BMS_OnLineCheck(void)
+{
+    //主电池检测
+    if((HAL_GetTick() - BMS_Magene_OnLineCheck_Main.TimeCnt) > 1000)
+    {
+        BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
+    }
+    //备电池检测
+    if((HAL_GetTick() - BMS_Magene_OnLineCheck_Back.TimeCnt) > 1000)
+    {
+        BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
+    }
+}
+
+/*BMS数据解析*/
+void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
+{
+    if(CanData->RefreshFlag == 1)
+    {
+        if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_MAIN)) //主电池
+        {
+            if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
+            {
+                memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
+            }
+            BMS_Magene_OnLineCheck_Main.OnLineFlag = 0;
+            BMS_Magene_OnLineCheck_Main.TimeCnt = HAL_GetTick();
+        }
+        else if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_BACK)) //备电池
+        {
+            if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
+            {
+                memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
+            }
+            BMS_Magene_OnLineCheck_Back.OnLineFlag = 0;
+            BMS_Magene_OnLineCheck_Back.TimeCnt = HAL_GetTick();
+        }
+
+        CanData->RefreshFlag = 0;
+    }
+}
+
+//全局函数
+/*参数初始化*/
+void BMS_Magene_VarInit(void)
+{
+    BMS_Magene_TPDOInfo_Main.BaseInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.BaseInfo.Code = BMS_MAGENE_FUC_CODE_BASE_INFO;
+    BMS_Magene_TPDOInfo_Main.CapInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CapInfo.Code = BMS_MAGENE_FUC_CODE_CAP_INFO;
+    BMS_Magene_TPDOInfo_Main.CycInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CycInfo.Code = BMS_MAGENE_FUC_CODE_CYC_INFO;
+    BMS_Magene_TPDOInfo_Main.StaInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.StaInfo.Code = BMS_MAGENE_FUC_CODE_STA_INFO;
+    BMS_Magene_TPDOInfo_Main.RtcInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.RtcInfo.Code = BMS_MAGENE_FUC_CODE_RTC_INFO;
+    BMS_Magene_TPDOInfo_Main.CellInfo1.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CellInfo1.Code = BMS_MAGENE_FUC_CODE_CELL1_INFO;
+    BMS_Magene_TPDOInfo_Main.CellInfo2.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CellInfo2.Code = BMS_MAGENE_FUC_CODE_CELL2_INFO;
+    BMS_Magene_TPDOInfo_Main.CellInfo3.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CellInfo3.Code = BMS_MAGENE_FUC_CODE_CELL3_INFO;
+    BMS_Magene_TPDOInfo_Main.CellInfo4.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CellInfo4.Code = BMS_MAGENE_FUC_CODE_CELL4_INFO;
+    BMS_Magene_TPDOInfo_Main.CellInfo5.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.CellInfo5.Code = BMS_MAGENE_FUC_CODE_CELL5_INFO;
+    BMS_Magene_TPDOInfo_Main.TmpInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.TmpInfo.Code = BMS_MAGENE_FUC_CODE_TMP_INFO;
+    BMS_Magene_TPDOInfo_Main.BatStInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Main.BatStInfo.Code = BMS_MAGENE_FUC_CODE_SW_INFO;
+
+    BMS_Magene_TPDOInfo_Back.BaseInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.BaseInfo.Code = BMS_MAGENE_FUC_CODE_BASE_INFO;
+    BMS_Magene_TPDOInfo_Back.CapInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CapInfo.Code = BMS_MAGENE_FUC_CODE_CAP_INFO;
+    BMS_Magene_TPDOInfo_Back.CycInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CycInfo.Code = BMS_MAGENE_FUC_CODE_CYC_INFO;
+    BMS_Magene_TPDOInfo_Back.StaInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.StaInfo.Code = BMS_MAGENE_FUC_CODE_STA_INFO;
+    BMS_Magene_TPDOInfo_Back.RtcInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.RtcInfo.Code = BMS_MAGENE_FUC_CODE_RTC_INFO;
+    BMS_Magene_TPDOInfo_Back.CellInfo1.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CellInfo1.Code = BMS_MAGENE_FUC_CODE_CELL1_INFO;
+    BMS_Magene_TPDOInfo_Back.CellInfo2.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CellInfo2.Code = BMS_MAGENE_FUC_CODE_CELL2_INFO;
+    BMS_Magene_TPDOInfo_Back.CellInfo3.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CellInfo3.Code = BMS_MAGENE_FUC_CODE_CELL3_INFO;
+    BMS_Magene_TPDOInfo_Back.CellInfo4.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CellInfo4.Code = BMS_MAGENE_FUC_CODE_CELL4_INFO;
+    BMS_Magene_TPDOInfo_Back.CellInfo5.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.CellInfo5.Code = BMS_MAGENE_FUC_CODE_CELL5_INFO;
+    BMS_Magene_TPDOInfo_Back.TmpInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.TmpInfo.Code = BMS_MAGENE_FUC_CODE_TMP_INFO;
+    BMS_Magene_TPDOInfo_Back.BatStInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
+    BMS_Magene_TPDOInfo_Back.BatStInfo.Code = BMS_MAGENE_FUC_CODE_SW_INFO;
+
+    BMS_Magene_CanData.RefreshFlag = 0;
+}
+
+/*BMS处理主循环*/
+void BMS_Magene_Loop(void)
+{
+    BMS_CanProcess(&BMS_Magene_CanData);
+    BMS_OnLineCheck();
+    BMS_SwitchCtl();
+    BMS_InfoUpdate();
+}

+ 6 - 1
User/Src/var.c

@@ -9,8 +9,13 @@ char Firmware_Special[32] = {0,};                         //MC
 uint8_t MC_TagInfo[32] = {0xFF,};                         //MC生产标签信息
 OnLine_Status_Struct_t DeviceOnLine_Status;               //设备在线检测结果
 BMS_RunInfo_Struct_t BMS_RunInfo;                         //BMS运行信息
+BMS_CellVol_Struct_t BMS_CellVol;                         //BMS电芯电压
+BMS_ErrorCode_Struct_t BMS_ErrorCode;                     //BMS故障码
+BMS_DesignInfo_Struct_t BMS_DesignInfo;                   //BMS设计信息
+BMS_VerInfo_Struct_t BMS_VerInfo;                         //BMS版本信息
+BMS_MacInfo_Struct_t BMS_MacInfo;                         //BMS生产信息
+BMS_UsrLog_Struct_t BMS_UsrLog;                           //BMS使用记录
 Device_CheckInfo_Struct_t BMS_CheckInfo;                  //BMS授权校验
-BMS_DesignInfo_Struct_t BMS_DesignInfo;                   //BMS设计信息 
 BatterCellInfo_Struct_t BatteryCellInfo;                  //电池电芯放电信息
 Device_CheckInfo_Struct_t PBU_CheckInfo;                  //PBU授权校验
 PBU_ConfigParam_Struct_t PBU_ConfigParam;                 //PBU配置参数 

Some files were not shown because too many files changed in this diff