Ver código fonte

V1.5.0_20200702
1、增加对CAN接收的所有ID的指令进行转发;
2、修改CAN数据接收处理,改用数组的方式,简化代码。

dail.zhou 5 anos atrás
pai
commit
5283cc7029

+ 7 - 31
MOTINOVA_CDL_App/Inc/can.h

@@ -91,11 +91,8 @@ extern CAN_HandleTypeDef hcan;
 #define ID_CDL_TO_MC_TE       0x651
 #define ID_CDL_TO_PBU_TE      0x653
 
-#define ID_TO_CDL_FILTER      (uint16_t)(0x705 & 0x605)
-#define ID_TO_CDL_MASK        (uint16_t)(0x70F & 0x60F)
-
-#define ID_BC_FILTER          (uint16_t)(0x700 & 0x700)
-#define ID_BC_MASK            (uint16_t)(0x70F & 0x60F)
+#define ID_FILTER             (uint16_t)(0x700)   //过滤,相同通过
+#define ID_MASK               (uint16_t)(0x788)   //屏蔽,0-过滤位不起作用,1-过滤位生效
 
 typedef struct
 {
@@ -117,34 +114,13 @@ extern void _Error_Handler(char *, int);
 void MX_CAN_Init(void);
 
 /* USER CODE BEGIN Prototypes */
-#define CAN_BUFF_SIZE 1024
-
-extern uint8_t CAN_RxBuf_MC_BC[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_MC_BC;
-extern uint8_t CAN_RxBuf_MC_TO_CDL[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_MC_TO_CDL;
-
-extern uint8_t CAN_RxBuf_MC_TE_TO_CDL[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_MC_TE_TO_CDL;
-
-extern uint8_t CAN_RxBuf_PBU_BC[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_PBU_BC;
-extern uint8_t CAN_RxBuf_PBU_TO_CDL[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_PBU_TO_CDL;
-
-extern uint8_t CAN_RxBuf_PBU_TE_TO_CDL[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_PBU_TE_TO_CDL;
-
-extern uint8_t CAN_RxBuf_BMS_BC[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_BMS_BC;
-extern uint8_t CAN_RxBuf_BMS_TO_CDL[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_BMS_TO_CDL;
+#define CAN_BUFF_SIZE 512
+#define CAN_ID_NUM 22
 
-extern uint8_t CAN_RxBuf_HMI_BC[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_HMI_BC;
-extern uint8_t CAN_RxBuf_HMI_TO_CDL[CAN_BUFF_SIZE];
-extern CAN_Buf_TypeDef CAN_RxBuf_Struct_HMI_TO_CDL;
+extern uint8_t CAN_RxBuf[CAN_ID_NUM][CAN_BUFF_SIZE];
+extern CAN_Buf_TypeDef CAN_RxBuf_Struct[CAN_ID_NUM];
 
+extern void CAN_RxBuf_Init(void);
 extern void CAN_SendData(uint16_t ID, uint8_t *Data, uint16_t Length);
 extern void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void);
 /* USER CODE END Prototypes */

BIN
MOTINOVA_CDL_App/MDK-ARM/bin/MOTINOVA_CDL_APP_1r5r0_20200702.bin


+ 72 - 27
MOTINOVA_CDL_App/Src/can.c

@@ -46,31 +46,40 @@
 CanTxMsgTypeDef CAN_TxMessaage;
 CanRxMsgTypeDef CAN_RxMessaage;
 
-uint8_t CAN_RxBuf_MC_BC[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_MC_BC = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_MC_BC,0,FALSE};
-uint8_t CAN_RxBuf_MC_TO_CDL[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_MC_TO_CDL = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_MC_TO_CDL,0,FALSE};
-
-uint8_t CAN_RxBuf_MC_TE_TO_CDL[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_MC_TE_TO_CDL = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_MC_TO_CDL,0,FALSE};
+const uint16_t ID_Index[CAN_BUFF_SIZE] = 
+{
+   ID_MC_BC              ,//0x710
+   ID_MC_TO_BMS          ,//0x712	
+   ID_MC_TO_PBU          ,//0x713	
+   ID_MC_TO_HMI          ,//0x714	
+   ID_MC_TO_CDL          ,//0x715	
 
-uint8_t CAN_RxBuf_PBU_BC[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_PBU_BC = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_PBU_BC,0,FALSE};
-uint8_t CAN_RxBuf_PBU_TO_CDL[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_PBU_TO_CDL = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_PBU_TO_CDL,0,FALSE};
+   ID_MC_TE_TO_CDL       ,//0x615
+	 
+   ID_BMS_BC             ,//0x720
+   ID_BMS_TO_MC          ,//0x721	
+   ID_BMS_TO_PBU         ,//0x723	
+   ID_BMS_TO_HMI         ,//0x724	
+   ID_BMS_TO_CDL         ,//0x725
+	 
+   ID_PBU_BC             ,//0x730
+   ID_PBU_TO_MC          ,//0x731	
+   ID_PBU_TO_BMS         ,//0x732	
+   ID_PBU_TO_HMI         ,//0x734	
+   ID_PBU_TO_CDL         ,//0x735
 
-uint8_t CAN_RxBuf_PBU_TE_TO_CDL[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_PBU_TE_TO_CDL = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_PBU_TO_CDL,0,FALSE};
+   ID_PBU_TE_TO_CDL      ,//0x635
+	 
+   ID_HMI_BC             ,//0x740
+   ID_HMI_TO_MC          ,//0x741	
+   ID_HMI_TO_BMS         ,//0x742	
+   ID_HMI_TO_PBU         ,//0x743	
+   ID_HMI_TO_CDL          //0x745	
+};
 
-uint8_t CAN_RxBuf_BMS_BC[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_BMS_BC = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_BMS_BC,0,FALSE};
-uint8_t CAN_RxBuf_BMS_TO_CDL[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_BMS_TO_CDL = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_BMS_TO_CDL,0,FALSE};
+uint8_t CAN_RxBuf[CAN_ID_NUM][CAN_BUFF_SIZE];
+CAN_Buf_TypeDef CAN_RxBuf_Struct[CAN_ID_NUM];
 
-uint8_t CAN_RxBuf_HMI_BC[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_HMI_BC = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_HMI_BC,0,FALSE};
-uint8_t CAN_RxBuf_HMI_TO_CDL[CAN_BUFF_SIZE];
-CAN_Buf_TypeDef CAN_RxBuf_Struct_HMI_TO_CDL = {0,CAN_BUFF_SIZE,0,0,0,0,CAN_RxBuf_HMI_TO_CDL,0,FALSE};
 /* USER CODE END 0 */
 
 CAN_HandleTypeDef hcan;
@@ -162,6 +171,24 @@ void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle)
 } 
 
 /* USER CODE BEGIN 1 */
+void CAN_RxBuf_Init(void)
+{
+  uint8_t i;
+	
+	for(i=0; i<CAN_ID_NUM; i++)
+	{
+	  CAN_RxBuf_Struct[i].ucBufID = 0;
+		CAN_RxBuf_Struct[i].ucBufSize = CAN_BUFF_SIZE;
+		CAN_RxBuf_Struct[i].ucBufWrInde = 0;
+		CAN_RxBuf_Struct[i].ucBufRdInde = 0;
+		CAN_RxBuf_Struct[i].ucBufCnt = 0;
+		CAN_RxBuf_Struct[i].ucBufOvf = 0;
+		CAN_RxBuf_Struct[i].pcBufAddr = CAN_RxBuf[i];
+		CAN_RxBuf_Struct[i].DelayTimeCnt = 0;
+		CAN_RxBuf_Struct[i].IsWaitRX_Flag = FALSE;
+	}
+}
+
 void CAN_Rx_ISR(CAN_Buf_TypeDef*ptCANRx,uint8_t ucLength)
 {
 	for(uint8_t i=0;i<ucLength;i++)
@@ -186,6 +213,22 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
 		return;
 	}  
+
+	//根据ID索引数组下标
+	uint16_t Index;
+	for(Index=0 ;Index<CAN_ID_NUM; Index++)
+	{
+	  if(CanHandle->pRxMsg->StdId == ID_Index[Index])
+		{
+		  break;
+		}
+	}
+	
+	//数据转移到队列
+	CAN_RxBuf_Struct[Index].ucBufID = CanHandle->pRxMsg->StdId;
+	CAN_Rx_ISR(&CAN_RxBuf_Struct[Index], CanHandle->pRxMsg->DLC);
+	
+	#if 0
 	switch(CanHandle->pRxMsg->StdId)
 	{
 	  //MC广播的数据
@@ -262,6 +305,8 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 		}
 		default:break;
 	}
+	#endif
+	
 	__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
 }
 
@@ -325,11 +370,11 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; 
 	
 	//设置过滤寄存器
-  sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_TO_CDL_FILTER << 21) & 0xFFFF0000) >> 16);   
-  sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_TO_CDL_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;  
+  sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_FILTER << 21) & 0xFFFF0000) >> 16);   
+  sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;  
     
 	//设置屏蔽寄存器
-  sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_TO_CDL_MASK << 21) & 0xFFFF0000) >> 16);;  
+  sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_MASK << 21) & 0xFFFF0000) >> 16);;  
   sFilterConfig.FilterMaskIdLow = 0xFFFF;       
     
   sFilterConfig.FilterFIFOAssignment = 0;    
@@ -346,11 +391,11 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; 
 	
 	//设置过滤寄存器
-  sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_BC_FILTER << 21) & 0xFFFF0000) >> 16);   
-  sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_BC_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;  
+  sFilterConfig.FilterIdHigh = (uint16_t)((((uint32_t)ID_FILTER << 21) & 0xFFFF0000) >> 16);   
+  sFilterConfig.FilterIdLow = (uint16_t)(((uint32_t)ID_FILTER << 21) | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF;  
     
 	//设置屏蔽寄存器
-  sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF0000) >> 16);;  
+  sFilterConfig.FilterMaskIdHigh = (uint16_t)((((uint32_t)ID_MASK << 21) & 0xFFFF0000) >> 16);;  
   sFilterConfig.FilterMaskIdLow = 0xFFFF;       
     
   sFilterConfig.FilterFIFOAssignment = 0;    

+ 6 - 13
MOTINOVA_CDL_App/Src/main.c

@@ -112,6 +112,7 @@ int main(void)
   MX_IWDG_Init();
   MX_USART3_UART_Init();
   /* USER CODE BEGIN 2 */
+	CAN_RxBuf_Init();
   //采集适配器输入电压和P+输入电压
   ADC_Start();
   HAL_Delay(200);
@@ -142,19 +143,11 @@ int main(void)
 		if(IsCtfFlag == TRUE)
 		{
 			//CAN数据解析
-			CAN_RxData_Process(&CAN_RxBuf_Struct_MC_BC, 200);
-			CAN_RxData_Process(&CAN_RxBuf_Struct_MC_TO_CDL, 200);
-			CAN_RxData_Process(&CAN_RxBuf_Struct_MC_TE_TO_CDL, 200);
-			
-			CAN_RxData_Process(&CAN_RxBuf_Struct_PBU_BC, 200);
-			CAN_RxData_Process(&CAN_RxBuf_Struct_PBU_TO_CDL, 200);
-			CAN_RxData_Process(&CAN_RxBuf_Struct_PBU_TE_TO_CDL, 200);
-			
-			CAN_RxData_Process(&CAN_RxBuf_Struct_BMS_BC, 200);
-			CAN_RxData_Process(&CAN_RxBuf_Struct_BMS_TO_CDL, 200);
-			
-			CAN_RxData_Process(&CAN_RxBuf_Struct_HMI_BC, 200);
-			CAN_RxData_Process(&CAN_RxBuf_Struct_HMI_TO_CDL, 200);
+			uint16_t i = 0;
+			for(i=0; i<CAN_ID_NUM; i++)
+			{
+		  	CAN_RxData_Process(&CAN_RxBuf_Struct[i], 200);
+			}
 			
 			//运行LED指示
 			LED_Run(&Led_MCU, 250);

+ 1 - 1
MOTINOVA_CDL_App/Src/uart_process.c

@@ -52,7 +52,7 @@ static void UART_DataProcess(uint8_t Mode, uint16_t Command, uint8_t* Data)
 			memcpy(InputKey, Data + 12, 8);
 			CheckCodeCal(InputCode, InputKey, OutputCode);
 			memcpy(SendData, OutputCode, 12);
-			memcpy(SendData + 12, (uint8_t*)"V1.4.0_20200518", 15);
+			memcpy(SendData + 12, (uint8_t*)"V1.5.0_20200702", 15);
 			
 			SendCmdData(&UART_TxBuff_Struct3, MODE_REPORT, 0x551B, SendData);
 			break;