BleCanProtocolFunc.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. /*
  2. * @Author : ChenJie
  3. * @Date : 2021-12-20 14:47:39
  4. * @Version : V3.0
  5. * @LastEditors : ChenJie
  6. * @LastEditTime : 2021-12-29 16:33:32
  7. * @Description : file content
  8. * @FilePath : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\BleCanProtocolFunc.c
  9. */
  10. /*
  11. * CanProtocol.c
  12. * can协议转换
  13. * Created on: 2021年12月20日
  14. * Author: QiXiang_CHENJIE
  15. */
  16. #include "BleCanProtocolFunc.h"
  17. #include "HardwareLib.h"
  18. /**
  19. * @brief : EBC对ble的命令应答,AT指令,EBC(0x1CEE000X)->BLE(0x1CEF0000X)
  20. * @param {uint8} CmdIdx
  21. * @return {*}
  22. */
  23. void Can2ProtocolCode(uint8 CmdIdx)
  24. {
  25. uint8 BlePwrControl; //蓝牙电源开关控制 FF-关闭,0A-打开
  26. uint8 BlePwrControl_Flag; //蓝牙电源开关控制使能 00-不控制,01-控制
  27. uint8 BleRoleControl; //蓝牙主从控制 01-主机,02-从机
  28. uint8 BleRoleControl_Flag; //蓝牙主从控制使能 00-不控制,01-控制
  29. uint8 BleName[8];
  30. uint32 InnerCanID;
  31. uint8 Data[8];
  32. uint8 DataIdx;
  33. uint8 Byte0Num;
  34. // CmdIdx EBC对BLE命令列表
  35. switch (CmdIdx)
  36. {
  37. case 0x00: // ebc->ble数据传输通道
  38. {
  39. Can2DataCode(DataIdx, Byte0Num);
  40. InnerCanID = 0x1CEE0000;
  41. break;
  42. }
  43. case 0x01: //查询BLE软件版本
  44. {
  45. Data[0] = 0x01;
  46. Data[1] = 0x00;
  47. Data[2] = 0x00;
  48. Data[3] = 0x00;
  49. Data[4] = 0x00;
  50. Data[5] = 0x00;
  51. Data[6] = 0x00;
  52. Data[7] = 0x00;
  53. InnerCanID = 0x1CEE0001;
  54. break;
  55. }
  56. case 0x02: //查询BLE连接状态
  57. {
  58. Data[0] = 0x01;
  59. Data[1] = 0x00;
  60. Data[2] = 0x00;
  61. Data[3] = 0x00;
  62. Data[4] = 0x00;
  63. Data[5] = 0x00;
  64. Data[6] = 0x00;
  65. Data[7] = 0x00;
  66. InnerCanID = 0x1CEE0002;
  67. break;
  68. }
  69. case 0x03: //让BLE断开连接
  70. {
  71. Data[0] = 0x02;
  72. Data[1] = 0x00;
  73. Data[2] = 0x00;
  74. Data[3] = 0x00;
  75. Data[4] = 0x00;
  76. Data[5] = 0x00;
  77. Data[6] = 0x00;
  78. Data[7] = 0x00;
  79. InnerCanID = 0x1CEE0003;
  80. break;
  81. }
  82. case 0x04: //改无线设备名称 名称为ASCII码值
  83. {
  84. Data[0] = BleName[0];
  85. Data[1] = BleName[1];
  86. Data[2] = BleName[2];
  87. Data[3] = BleName[3];
  88. Data[4] = BleName[4];
  89. Data[5] = BleName[5];
  90. Data[6] = BleName[6];
  91. Data[7] = BleName[7];
  92. InnerCanID = 0x1CEE0004;
  93. break;
  94. }
  95. case 0x05: // BLE设备蓝牙开关查询及控制,默认为查询
  96. {
  97. if (BlePwrControl_Flag)
  98. {
  99. Data[0] = 0x02;
  100. Data[1] = BlePwrControl;
  101. }
  102. else
  103. {
  104. Data[0] = 0x01;
  105. Data[1] = 0x00;
  106. }
  107. Data[2] = 0x00;
  108. Data[3] = 0x00;
  109. Data[4] = 0x00;
  110. Data[5] = 0x00;
  111. Data[6] = 0x00;
  112. Data[7] = 0x00;
  113. InnerCanID = 0x1CEE0005;
  114. break;
  115. }
  116. case 0x06: // BLE 主从机切换及查询,默认为查询
  117. {
  118. if (BleRoleControl_Flag)
  119. {
  120. Data[0] = 0x02;
  121. Data[1] = BleRoleControl;
  122. }
  123. else
  124. {
  125. Data[0] = 0x01;
  126. Data[1] = 0x00;
  127. }
  128. Data[2] = 0x00;
  129. Data[3] = 0x00;
  130. Data[4] = 0x00;
  131. Data[5] = 0x00;
  132. Data[6] = 0x00;
  133. Data[7] = 0x00;
  134. InnerCanID = 0x1CEE0006;
  135. break;
  136. }
  137. default:
  138. break;
  139. }
  140. }
  141. /**
  142. * @brief : ebc对ble的数据应答,Ebc data ->Ble data
  143. * @param {*}
  144. * @return {*}
  145. */
  146. void Can2DataCode(uint8 DataIdx, uint8 Byte0Num)
  147. {
  148. uint8 Data[8];
  149. switch (DataIdx)
  150. {
  151. case 0x01: //主机数据类型1的应答
  152. {
  153. Data[0] = 0x11;
  154. Data[1] = ebcd_st_ebcWork;
  155. Data[2] = ebcd_st_ebcConnect;
  156. Data[3] = ebcd_st_ebcLockWork;
  157. Data[4] = 0x00;
  158. Data[5] = 0x00;
  159. Data[6] = 0x00;
  160. Data[7] = 0x00;
  161. break;
  162. }
  163. case 0x02: //主机数据类型2的应答 共7条
  164. {
  165. switch (Byte0Num)
  166. {
  167. case 0x21:
  168. {
  169. vcud_st_keyOn = 0; // TBD
  170. bcud_st_bcuTmsLiquid = 0; // TBD
  171. Data[0] = Byte0Num;
  172. Data[1] = ebcd_st_unlockSensor;
  173. Data[2] = ebcd_st_lockSensor;
  174. Data[3] = vcud_st_keyOn;
  175. Data[4] = ebcd_P_airSensor;
  176. Data[5] = bcud_st_bcuTmsLiquid;
  177. Data[6] = ebcd_flg_pluginLockSig;
  178. Data[7] = 0x00;
  179. break;
  180. }
  181. case 0x22:
  182. {
  183. Data[0] = Byte0Num;
  184. Data[1] = 0x00;
  185. Data[2] = 0x00;
  186. Data[3] = 0x00;
  187. Data[4] = 0x00;
  188. Data[5] = ebcd_st_pedstSensor;
  189. Data[6] = ebcd_st_pluginLockSig;
  190. Data[7] = 0x00;
  191. break;
  192. }
  193. case 0x23:
  194. {
  195. Data[0] = Byte0Num;
  196. Data[1] = ebcd_st_unlockSucJug;
  197. Data[2] = ebcd_st_lockSucJug;
  198. Data[3] = 0x00;
  199. Data[4] = 0x00;
  200. Data[5] = 0x00;
  201. Data[6] = 0x00;
  202. Data[7] = 0x00;
  203. break;
  204. }
  205. case 0x24:
  206. {
  207. Data[0] = Byte0Num;
  208. Data[1] = 0x00;
  209. Data[2] = 0x00;
  210. Data[3] = 0x00;
  211. Data[4] = 0x00;
  212. Data[5] = ebcd_st_pedstSucJug;
  213. Data[6] = ebcd_flg_swapAdmit;
  214. Data[7] = 0x00;
  215. break;
  216. }
  217. case 0x25:
  218. {
  219. Data[0] = Byte0Num;
  220. Data[1] = ebcd_st_ebcWork;
  221. Data[2] = ebcd_st_ebcConnect;
  222. Data[3] = ebcd_st_ebcLockWork;
  223. Data[4] = ebcd_Nr_errMax;
  224. Data[5] = ebcd_Num_err1;
  225. Data[6] = ebcd_Num_err2;
  226. Data[7] = 0x00;
  227. break;
  228. }
  229. case 0x26:
  230. {
  231. Data[0] = Byte0Num;
  232. Data[1] = (ebcd_Nr_swapBatt >> 8) & 0xFF;
  233. Data[2] = ebcd_Nr_swapBatt & 0xFF;
  234. Data[3] = (ebcd_Nr_swapSucBatt >> 8) & 0xFF;
  235. Data[4] = ebcd_Nr_swapSucBatt;
  236. Data[5] = 0x00;
  237. Data[6] = 0x00;
  238. Data[7] = 0x00;
  239. break;
  240. }
  241. case 0x27:
  242. {
  243. Data[0] = Byte0Num;
  244. Data[1] = ebcd_st_errTable1;
  245. Data[2] = ebcd_st_errTable2;
  246. Data[3] = ebcd_st_errTable3;
  247. Data[4] = 0x00;
  248. Data[5] = 0x00;
  249. Data[6] = 0x00;
  250. Data[7] = 0x00;
  251. break;
  252. }
  253. default:
  254. break;
  255. }
  256. break;
  257. }
  258. case 0x03: //主机数据类型3的应答 共5条
  259. {
  260. vcud_st_handbrake = HandbrakeSts;
  261. vcud_st_footbrake = (BrakePedal > 0);
  262. vcud_st_gear = GearPos;
  263. vcud_st_vcuComun = (VCU_Life != 0xFF);
  264. vcud_st_carStart = VehSts;
  265. vcud_st_Steer = 0x00; // TBD
  266. vcud_M_accDrv = VCU_TotalDistance * 10;
  267. if (EBC_VinMsgFlag == 0x07)
  268. {
  269. memcpy(vcuv_Num_vin, VCU_VIN, 17);
  270. }
  271. switch (Byte0Num)
  272. {
  273. case 0x31:
  274. {
  275. Data[0] = Byte0Num;
  276. Data[1] = vcud_st_handbrake;
  277. Data[2] = vcud_st_footbrake;
  278. Data[3] = vcud_st_gear;
  279. Data[4] = vcud_st_vcuComun;
  280. Data[5] = vcud_st_carStart;
  281. Data[6] = vcud_st_Steer;
  282. Data[7] = 0x00;
  283. break;
  284. }
  285. case 0x32:
  286. {
  287. Data[0] = Byte0Num;
  288. Data[1] = vcuv_Num_vin[0];
  289. Data[2] = vcuv_Num_vin[1];
  290. Data[3] = vcuv_Num_vin[2];
  291. Data[4] = vcuv_Num_vin[3];
  292. Data[5] = vcuv_Num_vin[4];
  293. Data[6] = vcuv_Num_vin[5];
  294. Data[7] = 0x00;
  295. break;
  296. }
  297. case 0x33:
  298. {
  299. Data[0] = Byte0Num;
  300. Data[1] = vcuv_Num_vin[6];
  301. Data[2] = vcuv_Num_vin[7];
  302. Data[3] = vcuv_Num_vin[8];
  303. Data[4] = vcuv_Num_vin[9];
  304. Data[5] = vcuv_Num_vin[10];
  305. Data[6] = vcuv_Num_vin[11];
  306. Data[7] = 0x00;
  307. break;
  308. }
  309. case 0x34:
  310. {
  311. Data[0] = Byte0Num;
  312. Data[1] = vcuv_Num_vin[12];
  313. Data[2] = vcuv_Num_vin[13];
  314. Data[3] = vcuv_Num_vin[14];
  315. Data[4] = vcuv_Num_vin[15];
  316. Data[5] = vcuv_Num_vin[16];
  317. Data[6] = 0x00;
  318. Data[7] = 0x00;
  319. break;
  320. }
  321. case 0x35:
  322. {
  323. Data[0] = Byte0Num;
  324. Data[1] = (vcud_M_accDrv >> 24) & 0xFF;
  325. Data[2] = (vcud_M_accDrv >> 16) & 0xFF;
  326. Data[3] = (vcud_M_accDrv >> 8) & 0xFF;
  327. Data[4] = (vcud_M_accDrv)&0xFF;
  328. Data[5] = vcud_P_airSensorForward;
  329. Data[6] = vcud_P_airSensorBack;
  330. Data[7] = 0x00;
  331. break;
  332. }
  333. default:
  334. break;
  335. }
  336. break;
  337. }
  338. case 0x04: //主机数据类型4的应答 共16条
  339. {
  340. bcud_st_bcuComun = (BMS1_Life != 0xFF);
  341. bcud_pct_bcuSoh = BMS2_SOH;
  342. bcud_V_battU = BMS2_PackInsideVolt;
  343. if (BMS1_SysSts == 2)
  344. {
  345. bcud_st_hvWork = 0;
  346. }
  347. else if (BMS1_SysSts == 0 || BMS1_SysSts == 1)
  348. {
  349. bcud_st_hvWork = 1;
  350. }
  351. else if (BMS1_SysSts == 3)
  352. {
  353. bcud_st_hvWork = 2;
  354. }
  355. else
  356. {
  357. bcud_st_hvWork = 3;
  358. }
  359. bcud_st_bcuMainRelay = BMS1_MainPosRelaySt;
  360. bcud_pct_soc = (UINT16)(BMS2_SOC * 4);
  361. memcpy(bcuv_Num_battSn, BMS_SN_SysCode, sizeof(BMS_SN_SysCode));
  362. bcud_Q_snglChrg = BMS19_SingleChargeAh;
  363. bcud_E_snglChrg = BMS19_SingleChargeKwh;
  364. bcud_Q_accRecovry = BMS16_TotalEneryECOChargeAh;
  365. bcud_E_accRecovry = BMS16_TotalEneryECOChargeKwh;
  366. bcud_Q_accSwapBatt = BMS17_TotalStationChargeAh;
  367. bcud_E_accSwapBatt = BMS17_TotalStationChargeKwh;
  368. bcud_Q_accPlugInChrg = BMS18_TotalPoleChargeAh;
  369. bcud_E_accPlugInChrg = BMS18_TotalPoleChargeKwh;
  370. bcud_Q_accDischrg = BMS14_TotalDischargeAh;
  371. bcud_E_accDischrg = BMS14_TotalDischargeAh;
  372. bcud_Q_accChrg = BMS18_TotalPoleChargeAh;
  373. bcud_E_accChrg = BMS15_TotalChargeKwh;
  374. switch (Byte0Num)
  375. {
  376. case 0x40:
  377. {
  378. Data[0] = Byte0Num;
  379. Data[1] = (bcud_E_accPlugInChrg >> 24) & 0xFF;
  380. Data[2] = (bcud_E_accPlugInChrg >> 16) & 0xFF;
  381. Data[3] = (bcud_E_accPlugInChrg >> 8) & 0xFF;
  382. Data[4] = (bcud_E_accPlugInChrg)&0xFF;
  383. Data[5] = 0x00;
  384. Data[6] = 0x00;
  385. Data[7] = 0x00;
  386. break;
  387. }
  388. case 0x41:
  389. {
  390. Data[0] = Byte0Num;
  391. Data[1] = (bcud_Q_accChrg >> 24) & 0xFF;
  392. Data[2] = (bcud_Q_accChrg >> 16) & 0xFF;
  393. Data[3] = (bcud_Q_accChrg >> 8) & 0xFF;
  394. Data[4] = (bcud_Q_accChrg)&0xFF;
  395. Data[5] = bcud_st_bcuComun;
  396. Data[6] = bcud_st_hvWork;
  397. Data[7] = 0x00;
  398. break;
  399. }
  400. case 0x42:
  401. {
  402. Data[0] = Byte0Num;
  403. Data[1] = (bcud_Q_accDischrg >> 24) & 0xFF;
  404. Data[2] = (bcud_Q_accDischrg >> 16) & 0xFF;
  405. Data[3] = (bcud_Q_accDischrg >> 8) & 0xFF;
  406. Data[4] = (bcud_Q_accDischrg)&0xFF;
  407. Data[5] = bcud_st_bcuMainRelay;
  408. Data[6] = bcud_pct_bcuSoh;
  409. Data[7] = 0x00;
  410. break;
  411. }
  412. case 0x43:
  413. {
  414. Data[0] = Byte0Num;
  415. Data[1] = (bcud_E_accChrg >> 24) & 0xFF;
  416. Data[2] = (bcud_E_accChrg >> 16) & 0xFF;
  417. Data[3] = (bcud_E_accChrg >> 8) & 0xFF;
  418. Data[4] = (bcud_E_accChrg)&0xFF;
  419. Data[5] = (bcud_V_battU >> 8) & 0xFF;
  420. Data[6] = (bcud_V_battU)&0xFF;
  421. Data[7] = 0x00;
  422. break;
  423. }
  424. case 0x44:
  425. {
  426. Data[0] = Byte0Num;
  427. Data[1] = (bcud_E_accDischrg >> 24) & 0xFF;
  428. Data[2] = (bcud_E_accDischrg >> 16) & 0xFF;
  429. Data[3] = (bcud_E_accDischrg >> 8) & 0xFF;
  430. Data[4] = (bcud_E_accDischrg)&0xFF;
  431. Data[5] = (bcud_pct_soc >> 8) & 0xFF;
  432. Data[6] = (bcud_pct_soc)&0xFF;
  433. Data[7] = 0x00;
  434. break;
  435. }
  436. case 0x45:
  437. {
  438. Data[0] = Byte0Num;
  439. Data[1] = bcuv_Num_battSn[0];
  440. Data[2] = bcuv_Num_battSn[1];
  441. Data[3] = bcuv_Num_battSn[2];
  442. Data[4] = bcuv_Num_battSn[3];
  443. Data[5] = bcuv_Num_battSn[4];
  444. Data[6] = bcuv_Num_battSn[5];
  445. Data[7] = 0x00;
  446. break;
  447. }
  448. case 0x46:
  449. {
  450. Data[0] = Byte0Num;
  451. Data[1] = bcuv_Num_battSn[6];
  452. Data[2] = bcuv_Num_battSn[7];
  453. Data[3] = bcuv_Num_battSn[8];
  454. Data[4] = bcuv_Num_battSn[9];
  455. Data[5] = bcuv_Num_battSn[10];
  456. Data[6] = bcuv_Num_battSn[11];
  457. Data[7] = 0x00;
  458. break;
  459. }
  460. case 0x47:
  461. {
  462. Data[0] = Byte0Num;
  463. Data[1] = bcuv_Num_battSn[12];
  464. Data[2] = bcuv_Num_battSn[13];
  465. Data[3] = bcuv_Num_battSn[14];
  466. Data[4] = bcuv_Num_battSn[15];
  467. Data[5] = bcuv_Num_battSn[16];
  468. Data[6] = bcuv_Num_battSn[17];
  469. Data[7] = 0x00;
  470. break;
  471. }
  472. case 0x48:
  473. {
  474. Data[0] = Byte0Num;
  475. Data[1] = bcuv_Num_battSn[18];
  476. Data[2] = bcuv_Num_battSn[19];
  477. Data[3] = bcuv_Num_battSn[20];
  478. Data[4] = bcuv_Num_battSn[21];
  479. Data[5] = bcuv_Num_battSn[22];
  480. Data[6] = bcuv_Num_battSn[23];
  481. Data[7] = 0x00;
  482. break;
  483. }
  484. case 0x49:
  485. {
  486. Data[0] = Byte0Num;
  487. Data[1] = bcuv_Num_battSn[24];
  488. Data[2] = bcuv_Num_battSn[25];
  489. Data[3] = bcuv_Num_battSn[26];
  490. Data[4] = bcuv_Num_battSn[27];
  491. Data[5] = bcuv_Num_battSn[28];
  492. Data[6] = bcuv_Num_battSn[29];
  493. Data[7] = 0x00;
  494. break;
  495. }
  496. case 0x4A:
  497. {
  498. Data[0] = Byte0Num;
  499. Data[1] = bcuv_Num_battSn[30];
  500. Data[2] = bcuv_Num_battSn[31];
  501. Data[3] = 0x00;
  502. Data[4] = 0x00;
  503. Data[5] = 0x00;
  504. Data[6] = 0x00;
  505. Data[7] = 0x00;
  506. break;
  507. }
  508. case 0x4B:
  509. {
  510. Data[0] = Byte0Num;
  511. Data[1] = (bcud_Q_snglChrg >> 8) & 0xFF;
  512. Data[2] = (bcud_Q_snglChrg)&0xFF;
  513. Data[3] = (bcud_Q_accRecovry >> 24) & 0xFF;
  514. Data[4] = (bcud_Q_accRecovry >> 16) & 0xFF;
  515. Data[5] = (bcud_Q_accRecovry >> 8) & 0xFF;
  516. Data[6] = (bcud_Q_accRecovry)&0xFF;
  517. Data[7] = 0x00;
  518. break;
  519. }
  520. case 0x4C:
  521. {
  522. Data[0] = Byte0Num;
  523. Data[1] = (bcud_Q_accSwapBatt >> 24) & 0xFF;
  524. Data[2] = (bcud_Q_accSwapBatt >> 16) & 0xFF;
  525. Data[3] = (bcud_Q_accSwapBatt >> 8) & 0xFF;
  526. Data[4] = (bcud_Q_accSwapBatt)&0xFF;
  527. Data[5] = 0x00;
  528. Data[6] = 0x00;
  529. Data[7] = 0x00;
  530. break;
  531. }
  532. case 0x4D:
  533. {
  534. Data[0] = Byte0Num;
  535. Data[1] = (bcud_E_snglChrg >> 8) & 0xFF;
  536. Data[2] = (bcud_E_snglChrg)&0xFF;
  537. Data[3] = (bcud_E_accRecovry >> 24) & 0xFF;
  538. Data[4] = (bcud_E_accRecovry >> 16) & 0xFF;
  539. Data[5] = (bcud_E_accRecovry >> 8) & 0xFF;
  540. Data[6] = (bcud_E_accRecovry)&0xFF;
  541. Data[7] = 0x00;
  542. break;
  543. }
  544. case 0x4E:
  545. {
  546. Data[0] = Byte0Num;
  547. Data[1] = (bcud_E_accSwapBatt >> 24) & 0xFF;
  548. Data[2] = (bcud_E_accSwapBatt >> 16) & 0xFF;
  549. Data[3] = (bcud_E_accSwapBatt >> 8) & 0xFF;
  550. Data[4] = (bcud_E_accSwapBatt)&0xFF;
  551. Data[5] = 0x00;
  552. Data[6] = 0x00;
  553. Data[7] = 0x00;
  554. break;
  555. }
  556. case 0x4F:
  557. {
  558. Data[0] = Byte0Num;
  559. Data[1] = (bcud_Q_accPlugInChrg >> 24) & 0xFF;
  560. Data[2] = (bcud_Q_accPlugInChrg >> 16) & 0xFF;
  561. Data[3] = (bcud_Q_accPlugInChrg >> 8) & 0xFF;
  562. Data[4] = (bcud_Q_accPlugInChrg)&0xFF;
  563. Data[5] = 0x00;
  564. Data[6] = 0x00;
  565. Data[7] = 0x00;
  566. break;
  567. }
  568. default:
  569. break;
  570. }
  571. }
  572. case 0x05:
  573. {
  574. Data[0] = 0x51;
  575. Data[1] = 0x00;
  576. Data[2] = 0x00;
  577. Data[3] = 0x00;
  578. Data[4] = 0x00;
  579. Data[5] = 0x00;
  580. Data[6] = 0x00;
  581. Data[7] = 0x00;
  582. }
  583. default:
  584. break;
  585. }
  586. }
  587. /**
  588. * @brief : Ebc通过Can2接受到的协议解码
  589. * @param {uint8} CmdIdx
  590. * @return {*}
  591. */
  592. void Can2ProtocolDecode(uint8 CmdIdx)
  593. {
  594. uint32 Can2ID;
  595. uint8 Data[8];
  596. switch (Can2ID)
  597. {
  598. case 0x0000:
  599. {
  600. Can2DataDecode();
  601. bled_flg_bleConn = 1;
  602. break;
  603. }
  604. case 0x0001:
  605. {
  606. bled_Nr_softVer = (Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8) | (Data[3]);
  607. break;
  608. }
  609. case 0x0002:
  610. {
  611. if (Data[0] != 0xFF)
  612. {
  613. bled_flg_bleConn = 1;
  614. }
  615. else
  616. {
  617. bled_flg_bleConn = 0;
  618. }
  619. break;
  620. }
  621. default:
  622. break;
  623. }
  624. }
  625. /**
  626. * @brief : Ebc通过can2接收到的数据解码,Ble->Ebc
  627. * @param {*}
  628. * @return {*}
  629. */
  630. void Can2DataDecode(void)
  631. {
  632. uint8 Data[8];
  633. uint8 CmdIndex = Data[0];
  634. switch (CmdIndex)
  635. {
  636. case 0x01: //心跳数据,为了维持通讯
  637. {
  638. bled_flg_Heart = 1;
  639. break;
  640. }
  641. case 0x02: //获取换电控制器信息
  642. {
  643. bled_flg_getEbcData = 1;
  644. break;
  645. }
  646. case 0x03: //获得车辆信息
  647. {
  648. bled_flg_getVcuData = 1;
  649. break;
  650. }
  651. case 0x04: //获取电池信息
  652. {
  653. bled_flg_getBmsData = 1;
  654. break;
  655. }
  656. case 0x05: //握手
  657. {
  658. bled_flg_handShake = 1;
  659. break;
  660. }
  661. case 0x06: //解锁
  662. {
  663. bled_flg_unlockCmd = Data[1];
  664. break;
  665. }
  666. case 0x07: //锁紧
  667. {
  668. bled_flg_lockCmd = Data[1];
  669. break;
  670. }
  671. case 0x08: //完成换电
  672. {
  673. bled_flg_swapBattDone = 1;
  674. break;
  675. }
  676. case 0x09: //强制解锁,强制上升
  677. {
  678. bled_flg_unlockCmdForce = Data[1];
  679. bled_flg_topAscendCmdForce = Data[2];
  680. break;
  681. }
  682. case 0x0A: //强制锁紧,强制下降
  683. {
  684. bled_flg_lockCmdForce = Data[1];
  685. bled_flg_topDescendCmdForce = Data[2];
  686. break;
  687. }
  688. case 0x0B: //回到行车状态
  689. {
  690. bled_flg_backToDrv = 1;
  691. break;
  692. }
  693. case 0x0C: //顶板举升
  694. {
  695. bled_flg_topAscendCmd = Data[1];
  696. break;
  697. }
  698. case 0x0D: //顶板下降
  699. {
  700. bled_flg_topDescendCmd = Data[1];
  701. break;
  702. }
  703. case 0x0E: //换电开始自动解锁
  704. {
  705. bled_flg_autoUnlock = 1;
  706. break;
  707. }
  708. case 0x0F: //换电完成自动锁紧
  709. {
  710. bled_flg_autoLock = 1;
  711. break;
  712. }
  713. case 0x10: //除尘开始
  714. {
  715. bled_flg_openDustReCmd = 1;
  716. break;
  717. }
  718. case 0x11: //除尘关闭
  719. {
  720. bled_flg_closeDustReCmd = 1;
  721. break;
  722. }
  723. case 0x12: //切换到无线通信状态
  724. {
  725. break;
  726. }
  727. case 0x13: //进入换电状态
  728. {
  729. bled_flg_toSwapMod = 1;
  730. break;
  731. }
  732. case 0x14: //急停指令
  733. {
  734. bled_flg_safeStopCmd = 1;
  735. break;
  736. }
  737. default:
  738. break;
  739. }
  740. }