Procházet zdrojové kódy

修改读写SN号

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui před 5 roky
rodič
revize
40a2de9391

+ 4 - 4
Application/app/bms_message.c

@@ -7,6 +7,7 @@
 #include "bsp/gpio.h"
 #include "bsp/ml5238.h"
 #include "bsp/fmc_flash.h"
+#include "app/nv_storage.h"
 #include "libs/logger.h"
 #include "protocol.h"
 #include "bms_message.h"
@@ -165,14 +166,13 @@ void process_bms_message(can_frame_t *frame, int len){
 			protocol_send_ack(frame->head.can_addr, frame->key, result);
 			break;
 		case CAN_KEY_SET_SN:
-			fmc_write_sn((uint8_t *)frame->data, len);
+			nv_save_sn((uint8_t *)frame->data, len);
 			protocol_send_ack(frame->head.can_addr, frame->key, result);
 			break;
 		case CAN_KEY_GET_SN: {
 			uint8_t sn[32];
-			int sn_len = sizeof(sn);
-			fmc_read_sn(sn, &sn_len);
-			if (sn_len == 0){
+			int sn_len = nv_read_sn(sn, sizeof(sn));
+			if (sn_len <= 0){
 				sn[0] = 'B';
 				memset(sn + 1, '0', sizeof(sn) - 1);
 				sn_len = 21;

+ 37 - 0
Application/app/nv_storage.c

@@ -1,3 +1,4 @@
+#include <string.h>
 #include "nv_storage.h"
 #include "bsp/AT24CXX.h"
 #include "app/sox/soc.h"
@@ -11,6 +12,42 @@ static void nv_save_soc_by_backup(int index);
 #define SOC_ADDR 0
 static shark_timer_t _save_backup_timer = {.handler = backup_timer_hander};
 #define SOC_SIZE (((sizeof(soc_t) + sizeof(uint16_t)) + 0xF)&(0xFFF0)) //ÐèÒª16×Ö½Ú¶ÔÆë
+
+#define SN_ADDR (SOC_ADDR + (SOC_SIZE * 2))
+
+
+int nv_save_sn(uint8_t *sn, int len){
+	sn_t sn_info;
+	if (len > sizeof(sn_info.sn)){
+		return -1;
+	}
+	memcpy(sn_info.sn, sn, len);
+	sn_info.len = len;
+	sn_info.crc = shark_crc16_update(0, (const u8 *)sn_info.sn, len);
+	 
+	return AT24CXX_Write(SN_ADDR, (uint8_t *)&sn_info, sizeof(sn_info));
+}
+
+int nv_read_sn(uint8_t *sn, int len){
+	sn_t sn_info;
+	if (len < sizeof(sn_info.sn)){
+		return -1;
+	}
+
+	if (AT24CXX_Read(SN_ADDR, (uint8_t *)&sn_info, sizeof(sn_info)) < 0) {
+		return -1;
+	}
+	if (len > sizeof(sn_info.sn)){
+		return -1;
+	}
+	uint16_t crc = shark_crc16_update(0, (const u8 *)sn_info.sn, sn_info.len);
+	if (crc != sn_info.crc){
+		return -1;
+	}
+	memcpy(sn, sn_info.sn, sn_info.len);
+	return sn_info.len;
+}
+
 void nv_save_soc(void){
 	nv_save_soc_by_backup(0);
 	shark_timer_post(&_save_backup_timer, 10);

+ 16 - 3
Application/app/nv_storage.h

@@ -1,5 +1,18 @@
 #pragma once
 
-extern void nv_save_soc(void);
-extern int nv_restore_soc(void);
-extern void nv_erase(void);
+#include <stdint.h>
+
+#pragma  pack (push,1) 
+typedef struct {
+	uint8_t len;
+	uint8_t sn[24];
+	uint16_t crc;
+}sn_t;
+#pragma pack(pop)
+
+void nv_save_soc(void);
+int nv_restore_soc(void);
+void nv_erase(void);
+int nv_save_sn(uint8_t *sn, int len);
+int nv_read_sn(uint8_t *sn, int len);
+

+ 4 - 5
Application/app/protocol_old.c

@@ -7,7 +7,7 @@
 #include "app/sox/iostate.h"
 #include "bsp/gpio.h"
 #include "bsp/ml5238.h"
-#include "bsp/fmc_flash.h"
+#include "app/nv_storage.h"
 #include "libs/logger.h"
 #include "bsp/uart.h"
 #include "protocol_old.h"
@@ -75,13 +75,12 @@ static int get_response_data(uint8_t *data, uint8_t operate, uint8_t result){
 
 	if (operate == OP_READ_INFO){
 		uint8_t sn[32];
-		int sn_len = sizeof(sn);
-		fmc_read_sn(sn, &sn_len);
-		if (sn_len == 0){
+		int sn_len = nv_read_sn(sn, sizeof(sn));
+		if (sn_len <= 0){
 			sn[0] = 'B';
 			memset(sn + 1, '0', sizeof(sn) - 1);
 			sn_len = 18;
-		}			
+		}		
 		memcpy(&data[head->size], sn, sn_len);
 		head->size += sn_len;
 		strcpy((char *)&data[head->size], bsp_get_fversion());

+ 6 - 5
Application/bsp/AT24CXX.c

@@ -37,16 +37,16 @@ void AT24CXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
 	
 }
 
-void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
+int AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
 {
 	uint8_t device_addr = 0xA0 | ((ReadAddr >>8) << 1);
 	int try_count = 100;
 	while(0 >= gd32_i2c_read_nbytes(0, device_addr, (uint8_t)(ReadAddr&0xFF), pBuffer, NumToRead)){
 		if (try_count-- <= 0){
-			break;
+			return -1;
 		}
 	};
-
+	return NumToRead;
 }  
 
 /* use page write to improve write time */
@@ -61,17 +61,18 @@ static int AT24CXX_Write_Pages(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumT
 	};
 	return 0;
 }
-void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite){
+int AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite){
 	uint16_t remain_len = NumToWrite;
 	while(remain_len > 0){
 		uint16_t w_len = (remain_len > PAGE_SIZE)?PAGE_SIZE:remain_len;
 		if (AT24CXX_Write_Pages(WriteAddr, pBuffer, w_len) < 0){
-			return;
+			return -1;
 		}
 		WriteAddr += w_len;
 		pBuffer += w_len;
 		remain_len -= w_len;
 	}
+	return NumToWrite;
 }
 
 #if 0

+ 2 - 2
Application/bsp/AT24CXX.h

@@ -17,8 +17,8 @@
 #define PAGE_SIZE 16
 uint8_t AT24CXX_ReadOneByte(uint16_t ReadAddr);							//指定地址读取一个字节
 void AT24CXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite);		//指定地址写入一个字节
-void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite);	//从指定地址开始写入指定长度的数据
-void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead);   	//从指定地址开始读出指定长度的数据
+int AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite);	//从指定地址开始写入指定长度的数据
+int AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead);   	//从指定地址开始读出指定长度的数据
 uint8_t AT24CXX_Check(void);  //检查器件
 void AT24CXX_Init(void); //初始化IIC
 void AT24CXX_DeInit(void);

+ 3 - 10
Application/bsp/fmc_flash.c

@@ -23,18 +23,11 @@ static uint32_t _image_write_addr = 0;
 static uint32_t _image_read_addr = 0;
 void fmc_write_sn(uint8_t *sn, int len){
 	_fmc_erase_addr(_sn_addr(), len);
-	_fmc_write_data(_sn_addr(), (uint8_t *)&len, sizeof(len));
-	_fmc_write_data(_sn_addr() + sizeof(len), sn, len);
+	_fmc_write_data(_sn_addr(), sn, len);
 }
 
-void fmc_read_sn(uint8_t *sn, int *len){
-	int sn_len = 0;
-	_fmc_read_data(_sn_addr(), (uint8_t *)&sn_len, sizeof(sn_len));
-	if (sn_len > 0 && sn_len < *len) {
-		_fmc_read_data(_sn_addr() + sizeof(sn_len), sn, sn_len);
-		*len = sn_len;
-	}
-	*len = 0;
+void fmc_read_sn(uint8_t *sn, int len){
+	_fmc_read_data(_sn_addr(), (uint8_t *)sn, len);
 }
 
 void fmc_write_data(uint8_t *data, int len){