app_rs485_1.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. #ifndef APP_RS485_1_H
  2. #define APP_RS485_1_H
  3. enum
  4. {
  5. OP_NONE,
  6. OP_BOND,
  7. OP_WRITE_SN,
  8. OP_PAIR,
  9. OP_UPDATE_PAIR,
  10. OP_READ_INFO,
  11. OP_ALARM_TIMES,
  12. OP_CELL_VOL,//0x07
  13. OP_TEMP_OTHER,//0x08
  14. OP_OPEN_FET = 0x0B,
  15. OP_CLEAR_PAIR = OP_TEMP_OTHER + 1,
  16. OP_UPDATE_SOFTWARE_REQ = 0x0E,
  17. OP_UPDATE_SOFTWARE = 0x0F,
  18. OP_MAX
  19. };
  20. typedef struct
  21. {
  22. uint8_t operate;
  23. uint8_t op_result;
  24. uint16_t resver;
  25. uint32_t param;
  26. }SUB_BMS_CMD;
  27. #define RS485_COM_TIMEOUT (150)
  28. #define RS485_COM_ERROR (3)
  29. #define RS485_COM_UPDATE_TIMEOUT (1500)
  30. /*******************************************通用帧头-start*********************************************************/
  31. #pragma pack (push,1)
  32. typedef struct
  33. {
  34. //整个包大小
  35. uint8_t size;
  36. //命令设备
  37. uint8_t type;
  38. //协议类型
  39. uint8_t protocol;
  40. //命令类型
  41. uint8_t cmd;
  42. //命令校验
  43. uint16_t checksum;
  44. //命令处理调用
  45. uint8_t dir;
  46. //命令返回状态
  47. uint8_t bStatus;
  48. //命令数据部分
  49. }COMMAND_BODY;
  50. #pragma pack(pop)
  51. //
  52. #define BMS_STA_BOND (0x01)
  53. #define BMS_STA_D_OPEN (0x02)
  54. #define BMS_STA_C_OPEN (0x04)
  55. #define BMS_STA_S_OPEN (0x08)
  56. #define BMS_STA_C_FULL (0x10)
  57. #define BMS_STA_S_BAHU (0x20)
  58. #define BMS_STA_JIAO_YAN (0x40)
  59. #define BMS_POWER_FULL (BMS_STA_D_OPEN | BMS_STA_C_OPEN)
  60. #define BMS_POWER_SMALL (BMS_STA_S_OPEN)
  61. #define BMS_POWER_ALL (BMS_POWER_FULL | BMS_POWER_SMALL)
  62. /*******************************************通用帧头-end*********************************************************/
  63. /*******************************************BMS帧头-start*********************************************************/
  64. #define SBU_BMS_ADDRESS (0x30)
  65. #define SUB_BMS_ADDRESS_0 (SBU_BMS_ADDRESS)
  66. #define SUB_BMS_ADDRESS_1 (SBU_BMS_ADDRESS + 1)
  67. #define SUB_BMS_ADDRESS_2 (SBU_BMS_ADDRESS + 1)
  68. #define BMS_DIR (0x16)
  69. #define SET_COMMAND (0x10)
  70. #define GET_COMMAND (0x20)
  71. #define ACK_COMMAND (0x30)
  72. #define ENG_COMMAND (0x40)
  73. /*******************************************BMS帧头-end*********************************************************/
  74. typedef enum {
  75. SHARK_BMS_VGS_ACC2 = 1 << 0,
  76. SHARK_BMS_VGS_FV = 1 << 1,
  77. SHARK_BMS_VGS_ALL = 0xFF
  78. } shark_bms_vgs_t;
  79. typedef enum {
  80. SHARK_BATT_STATE_IDLE,
  81. SHARK_BATT_STATE_USED,
  82. } shark_battery_state_t;
  83. typedef enum {
  84. SHARK_BATT_POWER_OFF,
  85. SHARK_BATT_POWER_FULL,
  86. SHARK_BATT_POWER_SMALL,
  87. } shark_battery_power_t;
  88. typedef enum {
  89. SHARK_BATT_EXIT_SUCCESS,
  90. SHARK_BATT_EXIT_UPGRADE,
  91. SHARK_BATT_EXIT_POWER,
  92. SHARK_BATT_EXIT_SHAKE,
  93. SHARK_BATT_EXIT_ERROR,
  94. SHARK_BATT_EXIT_SOAK,
  95. SHARK_BATT_EXIT_485,
  96. } shark_battery_exit_t;
  97. #pragma pack (push,1)
  98. typedef struct
  99. {
  100. uint8_t yjkxslc;
  101. uint8_t m_percent;
  102. uint8_t yjcdwcsj;
  103. uint8_t charge_flag;
  104. int32_t m_current;
  105. uint32_t m_total_vol;
  106. uint8_t bms_temp;
  107. uint16_t work_status;
  108. uint32_t banlance_cell;
  109. uint8_t bms_status;
  110. uint8_t operate_result;
  111. }PACKET_COMMON;
  112. #define SERIAL_NUM_SIZE 18
  113. #define SOFTWARE_SIZE 20
  114. typedef struct
  115. {
  116. uint8_t sn[SERIAL_NUM_SIZE];
  117. uint8_t soft_ver[SOFTWARE_SIZE];
  118. }BATTERY_DEV_INFO;
  119. typedef struct
  120. {
  121. uint16_t dcsmxs;
  122. uint32_t charge_times;
  123. uint32_t charge_over_vol_times;
  124. uint32_t discharge_under_vol_times;
  125. uint32_t charge_over_cur_times;
  126. uint32_t discharge_under_cur_times;
  127. uint32_t short_times;
  128. uint32_t charge_under_temp_times;
  129. uint32_t discharge_under_temp_times;
  130. uint32_t charge_over_temp_times;
  131. uint32_t discharge_over_temp_times;
  132. }BATTERY_TIMES;
  133. #define CELL_NUM_MAX (15u)
  134. typedef struct
  135. {
  136. uint8_t cv_cell_num;
  137. uint16_t cv_cell_vol[CELL_NUM_MAX];
  138. }CELL_VOL;
  139. #define THERMISTOR_NUM_MAX (4u)
  140. typedef struct
  141. {
  142. int8_t to_temp_num[THERMISTOR_NUM_MAX];
  143. uint8_t to_fet;
  144. }TEMP_OTHER;
  145. #pragma pack(pop)
  146. typedef struct
  147. {
  148. PACKET_COMMON packet_common;
  149. BATTERY_DEV_INFO bat_dev_info;
  150. BATTERY_TIMES bat_times;
  151. CELL_VOL cell_vol;
  152. TEMP_OTHER temp_other;
  153. SUB_BMS_CMD sub_bms_cmd;
  154. uint8_t rs485_connect;
  155. uint8_t rs485_time_out;
  156. uint8_t define_error;
  157. uint8_t test_error;
  158. uint8_t conn_state;
  159. shark_battery_state_t state;
  160. shark_battery_exit_t exit_code;
  161. }SUB_BMS_INFO;
  162. extern SUB_BMS_INFO sub_bms_info_1;
  163. extern SUB_BMS_INFO sub_bms_info_2;
  164. typedef struct
  165. {
  166. uint8_t set;
  167. uint16_t count;
  168. uint8_t com_err_flag;
  169. uint32_t com_err_count;
  170. }SUB_BMS_COM;
  171. extern SUB_BMS_COM sub_rs485_time_out_1;
  172. extern SUB_BMS_COM sub_rs485_time_out_2;
  173. extern uint8_t RS485_busy_1;
  174. extern uint8_t RS485_busy_2;
  175. #if 0
  176. _inline void Sub_BMS_1_RS485_Com_Time_Out(void)
  177. {
  178. if(sub_rs485_time_out_1.set)
  179. {
  180. if(++sub_rs485_time_out_1.count >= RS485_COM_TIMEOUT)
  181. {
  182. RS485_busy_1 = 0;
  183. sub_rs485_time_out_1.set = 0;
  184. sub_rs485_time_out_1.count = 0;
  185. if(sub_rs485_time_out_1.com_err_flag == 0)
  186. {
  187. sub_rs485_time_out_1.com_err_flag = 1;
  188. sub_rs485_time_out_1.com_err_count = 1;
  189. }
  190. else
  191. {
  192. if(++sub_rs485_time_out_1.com_err_count >= 5)
  193. {
  194. sub_rs485_time_out_1.com_err_count = 0;
  195. g_event |= SUB_BMS_1_RS485_DISC_EVENT;
  196. }
  197. }
  198. }
  199. }
  200. }
  201. __inline void Sub_BMS_2_RS485_Com_Time_Out(void)
  202. {
  203. if(sub_rs485_time_out_2.set)
  204. {
  205. if(++sub_rs485_time_out_2.count >= RS485_COM_TIMEOUT)
  206. {
  207. RS485_busy_2 = 0;
  208. sub_rs485_time_out_2.set = 0;
  209. sub_rs485_time_out_2.count = 0;
  210. if(sub_rs485_time_out_2.com_err_flag == 0)
  211. {
  212. sub_rs485_time_out_2.com_err_flag = 1;
  213. sub_rs485_time_out_2.com_err_count = 1;
  214. }
  215. else
  216. {
  217. if(++sub_rs485_time_out_2.com_err_count >= 5)
  218. {
  219. sub_rs485_time_out_2.com_err_count = 0;
  220. g_event |= SUB_BMS_2_RS485_DISC_EVENT;
  221. }
  222. }
  223. }
  224. }
  225. }
  226. #endif
  227. extern DELAY_COMMON send_delay;
  228. __inline void Send_Sub_BMS_CMD_Delay(void)
  229. {
  230. if(send_delay.set)
  231. {
  232. ++send_delay.count;
  233. if(send_delay.count >= 400)
  234. {
  235. send_delay.count = 0;
  236. g_event |= SUB_BMS_2_SEND_CMD_EVENT;
  237. }
  238. else if(send_delay.count == 200)
  239. {
  240. g_event |= SUB_BMS_1_SEND_CMD_EVENT;
  241. }
  242. }
  243. }
  244. extern uint8_t sub_bms_1_connect;
  245. extern uint8_t sub_bms_2_connect;
  246. enum
  247. {
  248. SUB_BMS_INVALID_STATUS,
  249. SUB_BMS_DISC_NO485,
  250. SUB_BMS_DISC_HV485,
  251. SUB_BMS_CONT_HV485,
  252. SUB_BMS_CONT_NO485,
  253. };
  254. enum
  255. {
  256. CW_NONE,
  257. CW_CHONG_DIAN_ZUO,
  258. CW_CHE_SHANG_CHARGER,
  259. CW_CHE_SHANG_NO_CHARGER,
  260. CW_MAX
  261. };
  262. extern uint8_t cang_wei;
  263. typedef struct
  264. {
  265. uint32_t bms_err_timeout_cnt;
  266. uint16_t bms_err_cnt;
  267. uint16_t bms_err_num;
  268. }BMS_ERROR;
  269. #define TI_VALID_FLAG_KEY (0x0327)
  270. typedef struct
  271. {
  272. uint16_t ti_flag;
  273. uint16_t ti_set;
  274. BMS_ERROR ti_bms_1;
  275. BMS_ERROR ti_bms_2;
  276. }TEST_INFO;
  277. extern TEST_INFO test_info;
  278. void Check_Sub_BMS_1(void);
  279. void Check_Sub_BMS_2(void);
  280. int8_t Handle_RS485_1_Data(void);
  281. int8_t Handle_RS485_2_Data(void);
  282. void RS485_Communication_Time_Out_1(void);
  283. void RS485_Communication_Time_Out_2(void);
  284. void Send_Sub_BMS_1_CMD(void);
  285. void Send_Sub_BMS_2_CMD(void);
  286. void Sub_BMS_1_Initial(void);
  287. void Sub_BMS_2_Initial(void);
  288. void Sub_BMS_1_lt_State(void);
  289. void Sub_BMS_2_lt_State(void);
  290. shark_battery_exit_t Is_Sub_BMS_1_Normal(void);
  291. shark_battery_exit_t Is_Sub_BMS_2_Normal(void);
  292. int8_t Operate_Sub_BMS_1_CD(uint8_t on);
  293. int8_t Operate_Sub_BMS_2_CD(uint8_t on);
  294. int8_t Send_Sub_BMS_CMD_2(void);
  295. int8_t Operate_Sub_BMS_PING(uint32_t delay);
  296. uint8_t Sub_BMS_1_COM_Finish(void);
  297. uint8_t Sub_BMS_2_COM_Finish(void);
  298. uint8_t SUB_BMS_1_DEC(void);
  299. uint8_t SUB_BMS_2_DEC(void);
  300. int8_t Update_Sub_BMS_1_Software(uint8_t step);
  301. int8_t Update_Sub_BMS_2_Software(uint8_t step);
  302. extern void RS485_Print(uint8_t dest,uint8_t * dbuf,uint16_t dbuf_len);
  303. void Initial_Test_Info(void);
  304. void Save_Test_Info(void);
  305. void Ca_Chu_Test_Info(void);
  306. void Check_Enable_Test_Info(void);
  307. shark_bool shark_bms_check_xl(void);
  308. shark_battery_exit_t shark_battery_is_normal(SUB_BMS_INFO *info);
  309. void shark_bms_set_vgs(shark_bms_vgs_t vgs, shark_bool enable);
  310. void shark_bms_set_mos(shark_bool ss, shark_bool s11, shark_bool s21);
  311. u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, u8 mask);
  312. shark_bool shark_battery_is_power_on(SUB_BMS_INFO *info);
  313. shark_bool shark_battery_is_normal_power_on(SUB_BMS_INFO *info);
  314. static inline void shark_bms_set_mos_close(void)
  315. {
  316. shark_bms_set_mos(shark_false, shark_false, shark_false);
  317. }
  318. static inline void shark_bms_set_mos_bat1(void)
  319. {
  320. shark_bms_set_mos(shark_false, shark_false, shark_true);
  321. }
  322. static inline void shark_bms_set_mos_bat2(void)
  323. {
  324. shark_bms_set_mos(shark_false, shark_true, shark_false);
  325. }
  326. static inline void shark_bms_set_mos_series(void)
  327. {
  328. shark_bms_set_mos(shark_true, shark_false, shark_false);
  329. }
  330. static inline void shark_bms_set_mos_parrallel(void)
  331. {
  332. shark_bms_set_mos(shark_false, shark_true, shark_true);
  333. }
  334. #endif