#ifndef PROTOCOL_LIB_H #define PROTOCOL_LIB_H /* Platform_32Bit Platform_16Bit */ #ifdef Platform_16Bit #define Protocol_uint8_t unsigned char #define Protocol_uint16_t unsigned int #define Protocol_uint32_t unsigned long #else #define Protocol_uint8_t unsigned char #define Protocol_uint16_t unsigned short #define Protocol_uint32_t unsigned int #define Protocol_uint64_t unsigned long long #endif #ifndef Protocol_NULL #define Protocol_NULL ( void * )0u #endif /* NULL */ /**<0xEB 0x90 长度 帧序号 命令字 DATA0-DATAN CRC16_1 CRC16_2*/ #define DATA_PACKAGE_MIN_LEN 7 /**< 0xEB 0x90 + 长度 + 数据包序号 + CMDID + CRC16_1 + CRC16_2 */ #define DATA_PACKAGE_FIXED_LEN 3 /**< 未计算在长度内的数据 0xEB 0x90 + 长度位 */ #define CMD_HEAD1 0xEB #define CMD_HEAD2 0x90 /**@struct Protocol_Data_t * @brief 解析后的协议数据 */ typedef struct { Protocol_uint8_t FrameNo; /**< 帧序号 */ Protocol_uint8_t PowerSts; /**< 电源状态 */ Protocol_uint8_t CmdID; /**< 命令字 */ Protocol_uint8_t DataLen; /**< 有效数据长度 DATA0-DATAN*/ Protocol_uint8_t Data [ 256 ]; /**< 有效数据内容 DATA0-DATAN*/ } Protocol_Data_t; // #define UPGRADE_BAT32A239 // #ifdef UPGRADE_BAT32A239 #define CMD_FLASH_ERASE 0x30//擦除 FLASH #define CMD_FLASH_DWNLD 0x31//下载用户程序到 FLASH #define CMD_DATA_CRC_CHECK 0x32//CRC 校验下载用户程 typedef struct { Protocol_uint8_t CMDH; //宏定义所包含的 Protocol_uint8_t CMDL; Protocol_uint16_t LEN; //不关心发送的端格式 Protocol_uint8_t DAT[160];//补充的数据直接补充好再传到下层 }UpdateProtocolStructure;//上层协议数据结构 typedef struct { Protocol_uint8_t CMDH ; Protocol_uint8_t CMDL ; Protocol_uint8_t LEN[2]; union { Protocol_uint8_t DAT[128]; struct { Protocol_uint8_t CR1 :8; Protocol_uint8_t CR2 :8; }Erase; struct { Protocol_uint8_t CR1 :8; Protocol_uint8_t CR2 :8; }download; struct { Protocol_uint8_t CR1 :8; Protocol_uint8_t CR2 :8; }verification; struct { Protocol_uint8_t CR1 :8; Protocol_uint8_t CR2 :8; }reset; struct { Protocol_uint8_t CR1 :8; Protocol_uint8_t CR2 :8; }appgo; }dat; }BAT32A239_ACK_Structure;//下层应答协议 extern BAT32A239_ACK_Structure BAT32A239_ACK; typedef Protocol_uint8_t (*UARTOpen)(void); typedef Protocol_uint32_t (*UARTSend)(const Protocol_uint8_t *pData, Protocol_uint32_t u32Len); typedef Protocol_uint32_t (*UARTRead)(Protocol_uint8_t *pData, Protocol_uint32_t u32Len); typedef void (*ProtocolSetData)(const Protocol_Data_t *pData); typedef void (*ProcParse)(const Protocol_uint8_t *pData, Protocol_uint32_t u32Len); typedef void (*UARTClose)(void); /**@struct Protocol_Func_t * @brief 协议解析回调函数 */ typedef struct { UARTOpen UARTOpen_Cbk; /**< 串口打开回调 */ UARTSend UARTSend_Cbk; /**< 串口发送回调 */ UARTRead UARTRead_Cbk; /**< 串口读取回调 */ UARTClose UARTClose_Cbk; /**< 串口关闭回调 */ ProcParse ProcParseCbk; /**< 解析后的数据, 处理了数据包序号,命令字和电源状态,和ProcParse二选一 */ ProtocolSetData ProtocolSetData_Cbk; /**< 不包含 0xEB 0x90 + 长度 + CRC16_1 + CRC16_2,和ProtocolSetData二选一 */ } Protocol_Func_t; void Protocol_Init(Protocol_uint8_t *pMemSpace, Protocol_uint32_t MemLen, Protocol_Func_t *pFunc); void Protocol_Service(void); Protocol_uint32_t Protocol_Parse(const Protocol_uint8_t *pData, Protocol_uint32_t len); Protocol_uint32_t Protocol_Send(const Protocol_uint16_t cmdID, const Protocol_uint8_t *pData, Protocol_uint8_t len); Protocol_uint32_t UpdateBAT32A239Protocol_Send(UpdateProtocolStructure SendPd); #endif