app_rs485_1.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. #ifndef APP_RS485_1_H
  2. #define APP_RS485_1_H
  3. #define CONFIG_TX_BUFF_SIZE 256
  4. #define CONFIG_RX_BUFF_SIZE 256
  5. #define CONFIG_UART_GOOD 12
  6. #define CONFIG_UART_PING (CONFIG_UART_GOOD - 1)
  7. #define CONFIG_UART_TIMEOUT 100
  8. #define CONFIG_UART_POLL_DELAY 500
  9. enum
  10. {
  11. OP_NONE,
  12. OP_BOND,
  13. OP_WRITE_SN,
  14. OP_PAIR,
  15. OP_UPDATE_PAIR,
  16. OP_READ_INFO,
  17. OP_ALARM_TIMES,
  18. OP_CELL_VOL,//0x07
  19. OP_TEMP_OTHER,//0x08
  20. OP_OPEN_FET = 0x0B,
  21. OP_CLEAR_PAIR = OP_TEMP_OTHER + 1,
  22. OP_UPDATE_SOFTWARE_REQ = 0x0E,
  23. OP_UPDATE_SOFTWARE = 0x0F,
  24. OP_MAX
  25. };
  26. typedef struct
  27. {
  28. uint8_t operate;
  29. uint8_t op_result;
  30. uint16_t resver;
  31. uint32_t param;
  32. }SUB_BMS_CMD;
  33. #define RS485_COM_TIMEOUT (150)
  34. #define RS485_COM_ERROR (3)
  35. #define RS485_COM_UPDATE_TIMEOUT (1500)
  36. /*******************************************通用帧头-start*********************************************************/
  37. #pragma pack (push,1)
  38. typedef struct
  39. {
  40. //整个包大小
  41. uint8_t size;
  42. //命令设备
  43. uint8_t type;
  44. //协议类型
  45. uint8_t protocol;
  46. //命令类型
  47. uint8_t cmd;
  48. //命令校验
  49. uint16_t checksum;
  50. //命令处理调用
  51. uint8_t dir;
  52. //命令返回状态
  53. uint8_t bStatus;
  54. //命令数据部分
  55. }COMMAND_BODY;
  56. #pragma pack(pop)
  57. //
  58. #define BMS_STA_BOND (0x01)
  59. #define BMS_STA_D_OPEN (0x02)
  60. #define BMS_STA_C_OPEN (0x04)
  61. #define BMS_STA_S_OPEN (0x08)
  62. #define BMS_STA_C_FULL (0x10)
  63. #define BMS_STA_S_BAHU (0x20)
  64. #define BMS_STA_JIAO_YAN (0x40)
  65. #define BMS_POWER_FULL (BMS_STA_D_OPEN | BMS_STA_C_OPEN)
  66. #define BMS_POWER_SMALL (BMS_STA_S_OPEN)
  67. #define BMS_POWER_ALL (BMS_POWER_FULL | BMS_POWER_SMALL)
  68. /*******************************************通用帧头-end*********************************************************/
  69. /*******************************************BMS帧头-start*********************************************************/
  70. #define SBU_BMS_ADDRESS (0x30)
  71. #define SUB_BMS_ADDRESS_0 (SBU_BMS_ADDRESS)
  72. #define SUB_BMS_ADDRESS_1 (SBU_BMS_ADDRESS + 1)
  73. #define SUB_BMS_ADDRESS_2 (SBU_BMS_ADDRESS + 1)
  74. #define BMS_DIR (0x16)
  75. #define SET_COMMAND (0x10)
  76. #define GET_COMMAND (0x20)
  77. #define ACK_COMMAND (0x30)
  78. #define ENG_COMMAND (0x40)
  79. /*******************************************BMS帧头-end*********************************************************/
  80. typedef enum {
  81. SHARK_BMS_VGS_ACC2 = 1 << 0,
  82. SHARK_BMS_VGS_FV = 1 << 1,
  83. SHARK_BMS_VGS_ALL = 0xFF
  84. } shark_bms_vgs_t;
  85. typedef enum {
  86. SHARK_BATT_POWER_FAULT,
  87. SHARK_BATT_POWER_ANY,
  88. SHARK_BATT_POWER_OFF,
  89. SHARK_BATT_POWER_SMALL,
  90. SHARK_BATT_POWER_FULL,
  91. SHARK_BATT_POWER_ALL,
  92. } shark_battery_power_t;
  93. typedef enum {
  94. SHARK_BATT_EXIT_SUCCESS,
  95. SHARK_BATT_EXIT_UPGRADE,
  96. SHARK_BATT_EXIT_POWER,
  97. SHARK_BATT_EXIT_SHAKE,
  98. SHARK_BATT_EXIT_ERROR,
  99. SHARK_BATT_EXIT_SOAK,
  100. SHARK_BATT_EXIT_485,
  101. } shark_battery_exit_t;
  102. typedef enum {
  103. SHARK_BATT_MASK_NONE = 0,
  104. SHARK_BATT_MASK_BAT1 = 1 << 0,
  105. SHARK_BATT_MASK_BAT2 = 1 << 1,
  106. SHARK_BATT_MASK_BOTH = SHARK_BATT_MASK_BAT1 | SHARK_BATT_MASK_BAT2
  107. } shark_battery_mask_t;
  108. typedef enum {
  109. SHARK_BATT_INFO_VERTION = 1 << 0,
  110. SHARK_BATT_INFO_TIMES = 1 << 1,
  111. SHARK_BATT_INFO_CELL_VOL = 1 << 2,
  112. SHARK_BATT_INFO_TEMP = 1 << 3,
  113. } shark_battery_info_t;
  114. #pragma pack (push,1)
  115. typedef struct
  116. {
  117. uint8_t yjkxslc;
  118. uint8_t m_percent;
  119. uint8_t yjcdwcsj;
  120. uint8_t charge_flag;
  121. int32_t m_current;
  122. uint32_t m_total_vol;
  123. uint8_t bms_temp;
  124. uint16_t work_status;
  125. uint32_t banlance_cell;
  126. uint8_t bms_status;
  127. uint8_t operate_result;
  128. }PACKET_COMMON;
  129. #define SERIAL_NUM_SIZE 18
  130. #define SOFTWARE_SIZE 20
  131. typedef struct
  132. {
  133. uint8_t sn[SERIAL_NUM_SIZE];
  134. uint8_t soft_ver[SOFTWARE_SIZE];
  135. }BATTERY_DEV_INFO;
  136. typedef struct
  137. {
  138. uint16_t dcsmxs;
  139. uint32_t charge_times;
  140. uint32_t charge_over_vol_times;
  141. uint32_t discharge_under_vol_times;
  142. uint32_t charge_over_cur_times;
  143. uint32_t discharge_under_cur_times;
  144. uint32_t short_times;
  145. uint32_t charge_under_temp_times;
  146. uint32_t discharge_under_temp_times;
  147. uint32_t charge_over_temp_times;
  148. uint32_t discharge_over_temp_times;
  149. }BATTERY_TIMES;
  150. #define CELL_NUM_MAX (15u)
  151. typedef struct
  152. {
  153. uint8_t cv_cell_num;
  154. uint16_t cv_cell_vol[CELL_NUM_MAX];
  155. }CELL_VOL;
  156. #define THERMISTOR_NUM_MAX (4u)
  157. typedef struct
  158. {
  159. int8_t to_temp_num[THERMISTOR_NUM_MAX];
  160. uint8_t to_fet;
  161. }TEMP_OTHER;
  162. #pragma pack(pop)
  163. typedef enum {
  164. SHARK_SEND_IDLE,
  165. SHARK_SEND_PENDING,
  166. SHARK_SEND_SUCCESS,
  167. SHARK_SEND_TIMEOUT,
  168. } shark_send_state_t;
  169. typedef struct
  170. {
  171. PACKET_COMMON packet_common;
  172. BATTERY_DEV_INFO bat_dev_info;
  173. BATTERY_TIMES bat_times;
  174. CELL_VOL cell_vol;
  175. TEMP_OTHER temp_other;
  176. SUB_BMS_CMD sub_bms_cmd;
  177. u32 uart;
  178. u8 address;
  179. u8 connected;
  180. u8 exit_times;
  181. shark_bool used;
  182. shark_send_state_t send_state;
  183. shark_battery_exit_t exit_code;
  184. u8 update_mask;
  185. u16 update_ticks;
  186. u8 rx_buff[CONFIG_RX_BUFF_SIZE];
  187. u8 tx_buff[CONFIG_TX_BUFF_SIZE];
  188. u16 rx_length;
  189. u16 tx_length;
  190. u16 tx_index;
  191. shark_bool rx_pending;
  192. shark_bool tx_pending;
  193. u8 rx_busy;
  194. u8 tx_busy;
  195. u8 define_error;
  196. u8 test_error;
  197. }SUB_BMS_INFO;
  198. extern SUB_BMS_INFO sub_bms_info_1;
  199. extern SUB_BMS_INFO sub_bms_info_2;
  200. typedef struct
  201. {
  202. uint8_t set;
  203. uint16_t count;
  204. uint8_t com_err_flag;
  205. uint32_t com_err_count;
  206. }SUB_BMS_COM;
  207. #if 0
  208. _inline void Sub_BMS_1_RS485_Com_Time_Out(void)
  209. {
  210. if(sub_rs485_time_out_1.set)
  211. {
  212. if(++sub_rs485_time_out_1.count >= RS485_COM_TIMEOUT)
  213. {
  214. RS485_busy_1 = 0;
  215. sub_rs485_time_out_1.set = 0;
  216. sub_rs485_time_out_1.count = 0;
  217. if(sub_rs485_time_out_1.com_err_flag == 0)
  218. {
  219. sub_rs485_time_out_1.com_err_flag = 1;
  220. sub_rs485_time_out_1.com_err_count = 1;
  221. }
  222. else
  223. {
  224. if(++sub_rs485_time_out_1.com_err_count >= 5)
  225. {
  226. sub_rs485_time_out_1.com_err_count = 0;
  227. g_event |= SUB_BMS_1_RS485_DISC_EVENT;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. __inline void Sub_BMS_2_RS485_Com_Time_Out(void)
  234. {
  235. if(sub_rs485_time_out_2.set)
  236. {
  237. if(++sub_rs485_time_out_2.count >= RS485_COM_TIMEOUT)
  238. {
  239. RS485_busy_2 = 0;
  240. sub_rs485_time_out_2.set = 0;
  241. sub_rs485_time_out_2.count = 0;
  242. if(sub_rs485_time_out_2.com_err_flag == 0)
  243. {
  244. sub_rs485_time_out_2.com_err_flag = 1;
  245. sub_rs485_time_out_2.com_err_count = 1;
  246. }
  247. else
  248. {
  249. if(++sub_rs485_time_out_2.com_err_count >= 5)
  250. {
  251. sub_rs485_time_out_2.com_err_count = 0;
  252. g_event |= SUB_BMS_2_RS485_DISC_EVENT;
  253. }
  254. }
  255. }
  256. }
  257. }
  258. #endif
  259. enum
  260. {
  261. CW_NONE,
  262. CW_CHONG_DIAN_ZUO,
  263. CW_CHE_SHANG_CHARGER,
  264. CW_CHE_SHANG_NO_CHARGER,
  265. CW_MAX
  266. };
  267. extern uint8_t cang_wei;
  268. typedef struct
  269. {
  270. uint32_t bms_err_timeout_cnt;
  271. uint16_t bms_err_cnt;
  272. uint16_t bms_err_num;
  273. }BMS_ERROR;
  274. #define TI_VALID_FLAG_KEY (0x0327)
  275. typedef struct
  276. {
  277. uint16_t ti_flag;
  278. uint16_t ti_set;
  279. BMS_ERROR ti_bms_1;
  280. BMS_ERROR ti_bms_2;
  281. }TEST_INFO;
  282. extern TEST_INFO test_info;
  283. int8_t Handle_RS485_1_Data(void);
  284. int8_t Handle_RS485_2_Data(void);
  285. void Sub_BMS_1_Initial(void);
  286. shark_battery_exit_t Is_Sub_BMS_1_Normal(void);
  287. shark_battery_exit_t Is_Sub_BMS_2_Normal(void);
  288. void Initial_Test_Info(void);
  289. void Save_Test_Info(void);
  290. void Ca_Chu_Test_Info(void);
  291. void Check_Enable_Test_Info(void);
  292. shark_battery_exit_t shark_battery_is_normal(SUB_BMS_INFO *info, shark_battery_power_t power);
  293. void shark_bms_set_vgs(shark_bms_vgs_t vgs, shark_bool enable);
  294. void shark_bms_set_mos(shark_bool ss, shark_bool s11, shark_bool s21);
  295. shark_battery_mask_t shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, shark_battery_mask_t mask);
  296. shark_battery_power_t shark_battery_get_power(SUB_BMS_INFO *info);
  297. shark_bool shark_battery_check_power(SUB_BMS_INFO *info, shark_battery_power_t power);
  298. shark_battery_mask_t shark_battery_detect(u8 times);
  299. shark_bool shark_battery_ping(u8 times);
  300. u32 shark_battery_get_voltage(SUB_BMS_INFO *info);
  301. u32 shark_battery_get_voltage_delta(void);
  302. u32 shark_battery_get_voltage_min(void);
  303. u32 shark_battery_get_voltage_max(void);
  304. void shark_battery_clear(SUB_BMS_INFO *info);
  305. shark_bool shark_battery_process(SUB_BMS_INFO *info, const u8 *buff, u8 length);
  306. shark_bool shark_battery_send_command(SUB_BMS_INFO *info);
  307. shark_bool shark_battery_over_discharge(void);
  308. static inline void shark_bms_set_mos_close(void)
  309. {
  310. shark_bms_set_mos(shark_false, shark_false, shark_false);
  311. }
  312. static inline void shark_bms_set_mos_bat1(void)
  313. {
  314. shark_bms_set_mos(shark_false, shark_false, shark_true);
  315. }
  316. static inline void shark_bms_set_mos_bat2(void)
  317. {
  318. shark_bms_set_mos(shark_false, shark_true, shark_false);
  319. }
  320. static inline void shark_bms_set_mos_series(void)
  321. {
  322. shark_bms_set_mos(shark_true, shark_false, shark_false);
  323. }
  324. static inline void shark_bms_set_mos_parrallel(void)
  325. {
  326. shark_bms_set_mos(shark_false, shark_true, shark_true);
  327. }
  328. static inline shark_battery_exit_t shark_battery_is_normal_power_on(SUB_BMS_INFO *info)
  329. {
  330. return shark_battery_is_normal(info, SHARK_BATT_POWER_FULL);
  331. }
  332. static inline u32 shark_battery_get_voltage1(void)
  333. {
  334. return shark_battery_get_voltage(&sub_bms_info_1);
  335. }
  336. static inline u32 shark_battery_get_voltage2(void)
  337. {
  338. return shark_battery_get_voltage(&sub_bms_info_2);
  339. }
  340. static inline u8 shark_battery_get_capacity(SUB_BMS_INFO *info)
  341. {
  342. return info->packet_common.m_percent;
  343. }
  344. static inline u8 shark_battery_get_capacity1(void)
  345. {
  346. return shark_battery_get_capacity(&sub_bms_info_1);
  347. }
  348. static inline u8 shark_battery_get_capacity2(void)
  349. {
  350. return shark_battery_get_capacity(&sub_bms_info_2);
  351. }
  352. static inline s32 shark_battery_get_current(SUB_BMS_INFO *info)
  353. {
  354. return info->packet_common.m_current;
  355. }
  356. static inline s32 shark_battery_get_current1(void)
  357. {
  358. return shark_battery_get_current(&sub_bms_info_1);
  359. }
  360. static inline s32 shark_battery_get_current2(void)
  361. {
  362. return shark_battery_get_current(&sub_bms_info_2);
  363. }
  364. static inline s32 shark_battery_get_current12(void)
  365. {
  366. return shark_battery_get_current1() + shark_battery_get_current2();
  367. }
  368. static inline shark_bool shark_battery_charge_complete(SUB_BMS_INFO *info)
  369. {
  370. return (info->packet_common.bms_status & BMS_STA_C_FULL) != 0;
  371. }
  372. static inline shark_bool shark_battery_charge_complete1(void)
  373. {
  374. return shark_battery_charge_complete(&sub_bms_info_1);
  375. }
  376. static inline shark_bool shark_battery_charge_complete2(void)
  377. {
  378. return shark_battery_charge_complete(&sub_bms_info_2);
  379. }
  380. static inline shark_bool shark_battery_charge_in(SUB_BMS_INFO *info)
  381. {
  382. return info->packet_common.charge_flag != 0;
  383. }
  384. static inline shark_bool shark_battery_charge_in1(void)
  385. {
  386. return shark_battery_charge_in(&sub_bms_info_1);
  387. }
  388. static inline shark_bool shark_battery_charge_in2(void)
  389. {
  390. return shark_battery_charge_in(&sub_bms_info_2);
  391. }
  392. static inline shark_bool shark_battery_send_pending(SUB_BMS_INFO *info)
  393. {
  394. return info->send_state == SHARK_SEND_PENDING;
  395. }
  396. static inline shark_bool shark_battery_send_success(SUB_BMS_INFO *info)
  397. {
  398. return info->send_state == SHARK_SEND_SUCCESS;
  399. }
  400. static inline u8 shark_battery_get_rs485_state(SUB_BMS_INFO *info)
  401. {
  402. return info->connected ? 3 : 2;
  403. }
  404. static inline shark_bool shark_battery_is_discharge(SUB_BMS_INFO *info)
  405. {
  406. return (info->packet_common.work_status & ST_DISCHRG_CUR) != 0;
  407. }
  408. static inline shark_bool shark_battery_is_discharge1(void)
  409. {
  410. return shark_battery_is_discharge(&sub_bms_info_1);
  411. }
  412. static inline shark_bool shark_battery_is_discharge2(void)
  413. {
  414. return shark_battery_is_discharge(&sub_bms_info_2);
  415. }
  416. #endif