BleCanProtocolFunc.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012
  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,uint8 DataIdx,uint8 Byte0Num,uint32 *InnerCanID,uint8 *Data)
  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. //上述变量下线检测时调用修改
  31. // CmdIdx EBC对BLE命令列表
  32. switch (CmdIdx)
  33. {
  34. case 0x00: // ebc->ble数据传输通道
  35. {
  36. Can2DataCode(DataIdx, Byte0Num,Data);
  37. *InnerCanID = 0x1CEE0000;
  38. break;
  39. }
  40. case 0x01: //查询BLE软件版本
  41. {
  42. Data[0] = 0x01;
  43. Data[1] = 0x00;
  44. Data[2] = 0x00;
  45. Data[3] = 0x00;
  46. Data[4] = 0x00;
  47. Data[5] = 0x00;
  48. Data[6] = 0x00;
  49. Data[7] = 0x00;
  50. *InnerCanID = 0x1CEE0001;
  51. break;
  52. }
  53. case 0x02: //查询BLE连接状态
  54. {
  55. Data[0] = 0x01;
  56. Data[1] = 0x00;
  57. Data[2] = 0x00;
  58. Data[3] = 0x00;
  59. Data[4] = 0x00;
  60. Data[5] = 0x00;
  61. Data[6] = 0x00;
  62. Data[7] = 0x00;
  63. *InnerCanID = 0x1CEE0002;
  64. break;
  65. }
  66. case 0x03: //让BLE断开连接
  67. {
  68. Data[0] = 0x02;
  69. Data[1] = 0x00;
  70. Data[2] = 0x00;
  71. Data[3] = 0x00;
  72. Data[4] = 0x00;
  73. Data[5] = 0x00;
  74. Data[6] = 0x00;
  75. Data[7] = 0x00;
  76. *InnerCanID = 0x1CEE0003;
  77. break;
  78. }
  79. case 0x04: //改无线设备名称 名称为ASCII码值
  80. {
  81. Data[0] = BleName[0];
  82. Data[1] = BleName[1];
  83. Data[2] = BleName[2];
  84. Data[3] = BleName[3];
  85. Data[4] = BleName[4];
  86. Data[5] = BleName[5];
  87. Data[6] = BleName[6];
  88. Data[7] = BleName[7];
  89. *InnerCanID = 0x1CEE0004;
  90. break;
  91. }
  92. case 0x05: // BLE设备蓝牙开关查询及控制,默认为查询
  93. {
  94. if (BlePwrControl_Flag)
  95. {
  96. Data[0] = 0x02;
  97. Data[1] = BlePwrControl;
  98. }
  99. else
  100. {
  101. Data[0] = 0x01;
  102. Data[1] = 0x00;
  103. }
  104. Data[2] = 0x00;
  105. Data[3] = 0x00;
  106. Data[4] = 0x00;
  107. Data[5] = 0x00;
  108. Data[6] = 0x00;
  109. Data[7] = 0x00;
  110. *InnerCanID = 0x1CEE0005;
  111. break;
  112. }
  113. case 0x06: // BLE 主从机切换及查询,默认为查询
  114. {
  115. if (BleRoleControl_Flag)
  116. {
  117. Data[0] = 0x02;
  118. Data[1] = BleRoleControl;
  119. }
  120. else
  121. {
  122. Data[0] = 0x01;
  123. Data[1] = 0x00;
  124. }
  125. Data[2] = 0x00;
  126. Data[3] = 0x00;
  127. Data[4] = 0x00;
  128. Data[5] = 0x00;
  129. Data[6] = 0x00;
  130. Data[7] = 0x00;
  131. *InnerCanID = 0x1CEE0006;
  132. break;
  133. }
  134. default:
  135. break;
  136. }
  137. }
  138. /**
  139. * @brief : ebc对ble的数据应答,Ebc data ->Ble data
  140. * @param {*}
  141. * @return {*}
  142. */
  143. void Can2DataCode(uint8 DataIdx, uint8 Byte0Num,uint8 Data[])
  144. {
  145. switch (DataIdx)
  146. {
  147. case 0x01: //主机数据类型1的应答
  148. {
  149. Data[0] = 0x11;
  150. Data[1] = ebcd_st_ebcWork;
  151. Data[2] = ebcd_st_ebcConnect;
  152. Data[3] = ebcd_st_ebcLockWork;
  153. Data[4] = 0x00;
  154. Data[5] = 0x00;
  155. Data[6] = 0x00;
  156. Data[7] = 0x00;
  157. break;
  158. }
  159. case 0x02: //主机数据类型2的应答 共7条
  160. {
  161. switch (Byte0Num)
  162. {
  163. case 0x21:
  164. {
  165. vcud_st_keyOn = 0; // TBD
  166. bcud_st_bcuTmsLiquid = 0; // TBD
  167. Data[0] = Byte0Num;
  168. Data[1] = ebcd_st_unlockSensor;
  169. Data[2] = ebcd_st_lockSensor;
  170. Data[3] = vcud_st_keyOn;
  171. Data[4] = ebcd_P_airSensor;
  172. Data[5] = bcud_st_bcuTmsLiquid;
  173. Data[6] = ebcd_flg_pluginLockSig;
  174. Data[7] = 0x00;
  175. break;
  176. }
  177. case 0x22:
  178. {
  179. Data[0] = Byte0Num;
  180. Data[1] = 0x00;
  181. Data[2] = 0x00;
  182. Data[3] = 0x00;
  183. Data[4] = 0x00;
  184. Data[5] = ebcd_st_pedstSensor;
  185. Data[6] = ebcd_st_pluginLockSig;
  186. Data[7] = 0x00;
  187. break;
  188. }
  189. case 0x23:
  190. {
  191. Data[0] = Byte0Num;
  192. Data[1] = ebcd_st_unlockSucJug;
  193. Data[2] = ebcd_st_lockSucJug;
  194. Data[3] = 0x00;
  195. Data[4] = 0x00;
  196. Data[5] = 0x00;
  197. Data[6] = 0x00;
  198. Data[7] = 0x00;
  199. break;
  200. }
  201. case 0x24:
  202. {
  203. Data[0] = Byte0Num;
  204. Data[1] = 0x00;
  205. Data[2] = 0x00;
  206. Data[3] = 0x00;
  207. Data[4] = 0x00;
  208. Data[5] = ebcd_st_pedstSucJug;
  209. Data[6] = ebcd_flg_swapAdmit;
  210. Data[7] = 0x00;
  211. break;
  212. }
  213. case 0x25:
  214. {
  215. Data[0] = Byte0Num;
  216. Data[1] = ebcd_st_ebcWork;
  217. Data[2] = ebcd_st_ebcConnect;
  218. Data[3] = ebcd_st_ebcLockWork;
  219. Data[4] = ebcd_Nr_errMax;
  220. Data[5] = ebcd_Num_err1;
  221. Data[6] = ebcd_Num_err2;
  222. Data[7] = 0x00;
  223. break;
  224. }
  225. case 0x26:
  226. {
  227. Data[0] = Byte0Num;
  228. Data[1] = (ebcd_Nr_swapBatt >> 8) & 0xFF;
  229. Data[2] = ebcd_Nr_swapBatt & 0xFF;
  230. Data[3] = (ebcd_Nr_swapSucBatt >> 8) & 0xFF;
  231. Data[4] = ebcd_Nr_swapSucBatt;
  232. Data[5] = 0x00;
  233. Data[6] = 0x00;
  234. Data[7] = 0x00;
  235. break;
  236. }
  237. case 0x27:
  238. {
  239. Data[0] = Byte0Num;
  240. Data[1] = ebcd_st_errTable1;
  241. Data[2] = ebcd_st_errTable2;
  242. Data[3] = ebcd_st_errTable3;
  243. Data[4] = 0x00;
  244. Data[5] = 0x00;
  245. Data[6] = 0x00;
  246. Data[7] = 0x00;
  247. break;
  248. }
  249. default:
  250. break;
  251. }
  252. break;
  253. }
  254. case 0x03: //主机数据类型3的应答 共5条
  255. {
  256. vcud_st_handbrake = HandbrakeSts;
  257. vcud_st_footbrake = (BrakePedal > 0);
  258. vcud_st_gear = GearPos;
  259. vcud_st_vcuComun = (VCU_Life != 0xFF);
  260. vcud_st_carStart = VehSts;
  261. vcud_st_Steer = 0x00; // TBD
  262. vcud_M_accDrv = VCU_TotalDistance * 10;
  263. if (EBC_VinMsgFlag == 0x07)
  264. {
  265. memcpy(vcuv_Num_vin, VCU_VIN, 17);
  266. }
  267. switch (Byte0Num)
  268. {
  269. case 0x31:
  270. {
  271. Data[0] = Byte0Num;
  272. Data[1] = vcud_st_handbrake;
  273. Data[2] = vcud_st_footbrake;
  274. Data[3] = vcud_st_gear;
  275. Data[4] = vcud_st_vcuComun;
  276. Data[5] = vcud_st_carStart;
  277. Data[6] = vcud_st_Steer;
  278. Data[7] = 0x00;
  279. break;
  280. }
  281. case 0x32:
  282. {
  283. Data[0] = Byte0Num;
  284. Data[1] = vcuv_Num_vin[0];
  285. Data[2] = vcuv_Num_vin[1];
  286. Data[3] = vcuv_Num_vin[2];
  287. Data[4] = vcuv_Num_vin[3];
  288. Data[5] = vcuv_Num_vin[4];
  289. Data[6] = vcuv_Num_vin[5];
  290. Data[7] = 0x00;
  291. break;
  292. }
  293. case 0x33:
  294. {
  295. Data[0] = Byte0Num;
  296. Data[1] = vcuv_Num_vin[6];
  297. Data[2] = vcuv_Num_vin[7];
  298. Data[3] = vcuv_Num_vin[8];
  299. Data[4] = vcuv_Num_vin[9];
  300. Data[5] = vcuv_Num_vin[10];
  301. Data[6] = vcuv_Num_vin[11];
  302. Data[7] = 0x00;
  303. break;
  304. }
  305. case 0x34:
  306. {
  307. Data[0] = Byte0Num;
  308. Data[1] = vcuv_Num_vin[12];
  309. Data[2] = vcuv_Num_vin[13];
  310. Data[3] = vcuv_Num_vin[14];
  311. Data[4] = vcuv_Num_vin[15];
  312. Data[5] = vcuv_Num_vin[16];
  313. Data[6] = 0x00;
  314. Data[7] = 0x00;
  315. break;
  316. }
  317. case 0x35:
  318. {
  319. Data[0] = Byte0Num;
  320. Data[1] = (vcud_M_accDrv >> 24) & 0xFF;
  321. Data[2] = (vcud_M_accDrv >> 16) & 0xFF;
  322. Data[3] = (vcud_M_accDrv >> 8) & 0xFF;
  323. Data[4] = (vcud_M_accDrv)&0xFF;
  324. Data[5] = vcud_P_airSensorForward;
  325. Data[6] = vcud_P_airSensorBack;
  326. Data[7] = 0x00;
  327. break;
  328. }
  329. default:
  330. break;
  331. }
  332. break;
  333. }
  334. case 0x04: //主机数据类型4的应答 共16条
  335. {
  336. bcud_st_bcuComun = (BMS1_Life != 0xFF);
  337. bcud_pct_bcuSoh = BMS2_SOH;
  338. bcud_V_battU = BMS2_PackInsideVolt;
  339. if (BMS1_SysSts == 2)
  340. {
  341. bcud_st_hvWork = 0;
  342. }
  343. else if (BMS1_SysSts == 0 || BMS1_SysSts == 1)
  344. {
  345. bcud_st_hvWork = 1;
  346. }
  347. else if (BMS1_SysSts == 3)
  348. {
  349. bcud_st_hvWork = 2;
  350. }
  351. else
  352. {
  353. bcud_st_hvWork = 3;
  354. }
  355. bcud_st_bcuMainRelay = BMS1_MainPosRelaySt;
  356. bcud_pct_soc = (UINT16)(BMS2_SOC * 4);
  357. memcpy(bcuv_Num_battSn, BMS_SN_SysCode, sizeof(BMS_SN_SysCode));
  358. bcud_Q_snglChrg = BMS19_SingleChargeAh;
  359. bcud_E_snglChrg = BMS19_SingleChargeKwh;
  360. bcud_Q_accRecovry = BMS16_TotalEneryECOChargeAh;
  361. bcud_E_accRecovry = BMS16_TotalEneryECOChargeKwh;
  362. bcud_Q_accSwapBatt = BMS17_TotalStationChargeAh;
  363. bcud_E_accSwapBatt = BMS17_TotalStationChargeKwh;
  364. bcud_Q_accPlugInChrg = BMS18_TotalPoleChargeAh;
  365. bcud_E_accPlugInChrg = BMS18_TotalPoleChargeKwh;
  366. bcud_Q_accDischrg = BMS14_TotalDischargeAh;
  367. bcud_E_accDischrg = BMS14_TotalDischargeAh;
  368. bcud_Q_accChrg = BMS18_TotalPoleChargeAh;
  369. bcud_E_accChrg = BMS15_TotalChargeKwh;
  370. switch (Byte0Num)
  371. {
  372. case 0x40:
  373. {
  374. Data[0] = Byte0Num;
  375. Data[1] = (bcud_E_accPlugInChrg >> 24) & 0xFF;
  376. Data[2] = (bcud_E_accPlugInChrg >> 16) & 0xFF;
  377. Data[3] = (bcud_E_accPlugInChrg >> 8) & 0xFF;
  378. Data[4] = (bcud_E_accPlugInChrg)&0xFF;
  379. Data[5] = 0x00;
  380. Data[6] = 0x00;
  381. Data[7] = 0x00;
  382. break;
  383. }
  384. case 0x41:
  385. {
  386. Data[0] = Byte0Num;
  387. Data[1] = (bcud_Q_accChrg >> 24) & 0xFF;
  388. Data[2] = (bcud_Q_accChrg >> 16) & 0xFF;
  389. Data[3] = (bcud_Q_accChrg >> 8) & 0xFF;
  390. Data[4] = (bcud_Q_accChrg)&0xFF;
  391. Data[5] = bcud_st_bcuComun;
  392. Data[6] = bcud_st_hvWork;
  393. Data[7] = 0x00;
  394. break;
  395. }
  396. case 0x42:
  397. {
  398. Data[0] = Byte0Num;
  399. Data[1] = (bcud_Q_accDischrg >> 24) & 0xFF;
  400. Data[2] = (bcud_Q_accDischrg >> 16) & 0xFF;
  401. Data[3] = (bcud_Q_accDischrg >> 8) & 0xFF;
  402. Data[4] = (bcud_Q_accDischrg)&0xFF;
  403. Data[5] = bcud_st_bcuMainRelay;
  404. Data[6] = bcud_pct_bcuSoh;
  405. Data[7] = 0x00;
  406. break;
  407. }
  408. case 0x43:
  409. {
  410. Data[0] = Byte0Num;
  411. Data[1] = (bcud_E_accChrg >> 24) & 0xFF;
  412. Data[2] = (bcud_E_accChrg >> 16) & 0xFF;
  413. Data[3] = (bcud_E_accChrg >> 8) & 0xFF;
  414. Data[4] = (bcud_E_accChrg)&0xFF;
  415. Data[5] = (bcud_V_battU >> 8) & 0xFF;
  416. Data[6] = (bcud_V_battU)&0xFF;
  417. Data[7] = 0x00;
  418. break;
  419. }
  420. case 0x44:
  421. {
  422. Data[0] = Byte0Num;
  423. Data[1] = (bcud_E_accDischrg >> 24) & 0xFF;
  424. Data[2] = (bcud_E_accDischrg >> 16) & 0xFF;
  425. Data[3] = (bcud_E_accDischrg >> 8) & 0xFF;
  426. Data[4] = (bcud_E_accDischrg)&0xFF;
  427. Data[5] = (bcud_pct_soc >> 8) & 0xFF;
  428. Data[6] = (bcud_pct_soc)&0xFF;
  429. Data[7] = 0x00;
  430. break;
  431. }
  432. case 0x45:
  433. {
  434. Data[0] = Byte0Num;
  435. Data[1] = bcuv_Num_battSn[0];
  436. Data[2] = bcuv_Num_battSn[1];
  437. Data[3] = bcuv_Num_battSn[2];
  438. Data[4] = bcuv_Num_battSn[3];
  439. Data[5] = bcuv_Num_battSn[4];
  440. Data[6] = bcuv_Num_battSn[5];
  441. Data[7] = 0x00;
  442. break;
  443. }
  444. case 0x46:
  445. {
  446. Data[0] = Byte0Num;
  447. Data[1] = bcuv_Num_battSn[6];
  448. Data[2] = bcuv_Num_battSn[7];
  449. Data[3] = bcuv_Num_battSn[8];
  450. Data[4] = bcuv_Num_battSn[9];
  451. Data[5] = bcuv_Num_battSn[10];
  452. Data[6] = bcuv_Num_battSn[11];
  453. Data[7] = 0x00;
  454. break;
  455. }
  456. case 0x47:
  457. {
  458. Data[0] = Byte0Num;
  459. Data[1] = bcuv_Num_battSn[12];
  460. Data[2] = bcuv_Num_battSn[13];
  461. Data[3] = bcuv_Num_battSn[14];
  462. Data[4] = bcuv_Num_battSn[15];
  463. Data[5] = bcuv_Num_battSn[16];
  464. Data[6] = bcuv_Num_battSn[17];
  465. Data[7] = 0x00;
  466. break;
  467. }
  468. case 0x48:
  469. {
  470. Data[0] = Byte0Num;
  471. Data[1] = bcuv_Num_battSn[18];
  472. Data[2] = bcuv_Num_battSn[19];
  473. Data[3] = bcuv_Num_battSn[20];
  474. Data[4] = bcuv_Num_battSn[21];
  475. Data[5] = bcuv_Num_battSn[22];
  476. Data[6] = bcuv_Num_battSn[23];
  477. Data[7] = 0x00;
  478. break;
  479. }
  480. case 0x49:
  481. {
  482. Data[0] = Byte0Num;
  483. Data[1] = bcuv_Num_battSn[24];
  484. Data[2] = bcuv_Num_battSn[25];
  485. Data[3] = bcuv_Num_battSn[26];
  486. Data[4] = bcuv_Num_battSn[27];
  487. Data[5] = bcuv_Num_battSn[28];
  488. Data[6] = bcuv_Num_battSn[29];
  489. Data[7] = 0x00;
  490. break;
  491. }
  492. case 0x4A:
  493. {
  494. Data[0] = Byte0Num;
  495. Data[1] = bcuv_Num_battSn[30];
  496. Data[2] = bcuv_Num_battSn[31];
  497. Data[3] = 0x00;
  498. Data[4] = 0x00;
  499. Data[5] = 0x00;
  500. Data[6] = 0x00;
  501. Data[7] = 0x00;
  502. break;
  503. }
  504. case 0x4B:
  505. {
  506. Data[0] = Byte0Num;
  507. Data[1] = (bcud_Q_snglChrg >> 8) & 0xFF;
  508. Data[2] = (bcud_Q_snglChrg)&0xFF;
  509. Data[3] = (bcud_Q_accRecovry >> 24) & 0xFF;
  510. Data[4] = (bcud_Q_accRecovry >> 16) & 0xFF;
  511. Data[5] = (bcud_Q_accRecovry >> 8) & 0xFF;
  512. Data[6] = (bcud_Q_accRecovry)&0xFF;
  513. Data[7] = 0x00;
  514. break;
  515. }
  516. case 0x4C:
  517. {
  518. Data[0] = Byte0Num;
  519. Data[1] = (bcud_Q_accSwapBatt >> 24) & 0xFF;
  520. Data[2] = (bcud_Q_accSwapBatt >> 16) & 0xFF;
  521. Data[3] = (bcud_Q_accSwapBatt >> 8) & 0xFF;
  522. Data[4] = (bcud_Q_accSwapBatt)&0xFF;
  523. Data[5] = 0x00;
  524. Data[6] = 0x00;
  525. Data[7] = 0x00;
  526. break;
  527. }
  528. case 0x4D:
  529. {
  530. Data[0] = Byte0Num;
  531. Data[1] = (bcud_E_snglChrg >> 8) & 0xFF;
  532. Data[2] = (bcud_E_snglChrg)&0xFF;
  533. Data[3] = (bcud_E_accRecovry >> 24) & 0xFF;
  534. Data[4] = (bcud_E_accRecovry >> 16) & 0xFF;
  535. Data[5] = (bcud_E_accRecovry >> 8) & 0xFF;
  536. Data[6] = (bcud_E_accRecovry)&0xFF;
  537. Data[7] = 0x00;
  538. break;
  539. }
  540. case 0x4E:
  541. {
  542. Data[0] = Byte0Num;
  543. Data[1] = (bcud_E_accSwapBatt >> 24) & 0xFF;
  544. Data[2] = (bcud_E_accSwapBatt >> 16) & 0xFF;
  545. Data[3] = (bcud_E_accSwapBatt >> 8) & 0xFF;
  546. Data[4] = (bcud_E_accSwapBatt)&0xFF;
  547. Data[5] = 0x00;
  548. Data[6] = 0x00;
  549. Data[7] = 0x00;
  550. break;
  551. }
  552. case 0x4F:
  553. {
  554. Data[0] = Byte0Num;
  555. Data[1] = (bcud_Q_accPlugInChrg >> 24) & 0xFF;
  556. Data[2] = (bcud_Q_accPlugInChrg >> 16) & 0xFF;
  557. Data[3] = (bcud_Q_accPlugInChrg >> 8) & 0xFF;
  558. Data[4] = (bcud_Q_accPlugInChrg)&0xFF;
  559. Data[5] = 0x00;
  560. Data[6] = 0x00;
  561. Data[7] = 0x00;
  562. break;
  563. }
  564. default:
  565. break;
  566. }
  567. break;
  568. }
  569. case 0x05:
  570. {
  571. Data[0] = 0x51;
  572. Data[1] = 0x00;
  573. Data[2] = 0x00;
  574. Data[3] = 0x00;
  575. Data[4] = 0x00;
  576. Data[5] = 0x00;
  577. Data[6] = 0x00;
  578. Data[7] = 0x00;
  579. break;
  580. }
  581. default:
  582. Data[0] = 0x00;
  583. Data[1] = 0x00;
  584. Data[2] = 0x00;
  585. Data[3] = 0x00;
  586. Data[4] = 0x00;
  587. Data[5] = 0x00;
  588. Data[6] = 0x00;
  589. Data[7] = 0x00;
  590. break;
  591. }
  592. }
  593. /**
  594. * @brief : Ebc通过Can2接受到的协议解码
  595. * @param {uint8} CmdIdx
  596. * @return {*}
  597. */
  598. void Can2ProtocolDecode(uint32 Can2ID,uint8 Data[])
  599. {
  600. switch (Can2ID)
  601. {
  602. case 0x1CEF0000:
  603. {
  604. Can2DataDecode(Data);
  605. bled_flg_bleConn = 1;
  606. break;
  607. }
  608. case 0x1CEF0001:
  609. {
  610. bled_Nr_softVer = (Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8) | (Data[3]);
  611. break;
  612. }
  613. case 0x1CEF0002:
  614. {
  615. if (Data[0] != 0xFF)
  616. {
  617. bled_flg_bleConn = 1;
  618. }
  619. else
  620. {
  621. bled_flg_bleConn = 0;
  622. }
  623. break;
  624. }
  625. case 0x1C00ECEA://UDS检测ID
  626. {
  627. Uds_Service(Data);
  628. break;
  629. }
  630. default:
  631. break;
  632. }
  633. }
  634. /**
  635. * @brief : Ebc通过can2接收到的数据解码,Ble->Ebc
  636. * @param {*}
  637. * @return {*}
  638. */
  639. void Can2DataDecode(uint8 Data[])
  640. {
  641. uint8 CmdIndex = Data[0];
  642. ebcd_st_toBleAns = CmdIndex;
  643. ebcd_flg_Can2SendEnbale = TRUE;//所有的信息均立即回复
  644. switch (CmdIndex)
  645. {
  646. case 0x01: //心跳数据,为了维持通讯
  647. {
  648. bled_flg_Heart = 1;
  649. ebcd_flg_Can2SendEnbale = TRUE;
  650. break;
  651. }
  652. case 0x02: //获取换电控制器信息
  653. {
  654. bled_flg_getEbcData = 1;
  655. ebcd_flg_Can2SendEnbale = TRUE;
  656. break;
  657. }
  658. case 0x03: //获得车辆信息
  659. {
  660. bled_flg_getVcuData = 1;
  661. ebcd_flg_Can2SendEnbale = TRUE;
  662. break;
  663. }
  664. case 0x04: //获取电池信息
  665. {
  666. bled_flg_getBmsData = 1;
  667. ebcd_flg_Can2SendEnbale = TRUE;
  668. break;
  669. }
  670. case 0x05: //握手
  671. {
  672. bled_flg_handShake = 1;
  673. ebcd_flg_Can2SendEnbale = TRUE;
  674. break;
  675. }
  676. case 0x06: //解锁
  677. {
  678. bled_flg_unlockCmd = Data[1];
  679. bled_flg_lockCmd = 0;
  680. break;
  681. }
  682. case 0x07: //锁紧
  683. {
  684. bled_flg_lockCmd = Data[1];
  685. bled_flg_unlockCmd = 0;
  686. break;
  687. }
  688. case 0x08: //完成换电
  689. {
  690. bled_flg_swapBattDone = 1;
  691. break;
  692. }
  693. case 0x09: //强制解锁,强制上升
  694. {
  695. bled_flg_unlockCmdForce = Data[1];
  696. bled_flg_topAscendCmdForce = Data[2];
  697. break;
  698. }
  699. case 0x0A: //强制锁紧,强制下降
  700. {
  701. bled_flg_lockCmdForce = Data[1];
  702. bled_flg_topDescendCmdForce = Data[2];
  703. break;
  704. }
  705. case 0x0B: //回到行车状态
  706. {
  707. bled_flg_backToDrv = 1;
  708. break;
  709. }
  710. case 0x0C: //顶板举升
  711. {
  712. bled_flg_topAscendCmd = Data[1];
  713. break;
  714. }
  715. case 0x0D: //顶板下降
  716. {
  717. bled_flg_topDescendCmd = Data[1];
  718. break;
  719. }
  720. case 0x0E: //换电开始自动解锁
  721. {
  722. bled_flg_autoUnlock = 1;
  723. break;
  724. }
  725. case 0x0F: //换电完成自动锁紧
  726. {
  727. bled_flg_autoLock = 1;
  728. break;
  729. }
  730. case 0x10: //除尘开始
  731. {
  732. bled_flg_openDustReCmd = 1;
  733. break;
  734. }
  735. case 0x11: //除尘关闭
  736. {
  737. bled_flg_closeDustReCmd = 1;
  738. break;
  739. }
  740. case 0x12: //切换到无线通信状态
  741. {
  742. break;
  743. }
  744. case 0x13: //进入换电状态
  745. {
  746. bled_flg_toSwapMod = 1;
  747. break;
  748. }
  749. case 0x14: //急停指令
  750. {
  751. bled_flg_safeStopCmd = 1;
  752. break;
  753. }//新增需要改数组
  754. default:
  755. break;
  756. }
  757. }
  758. uint8 udsMode = 0;//uds 模式
  759. uint32 EbcAppSw = 0x00000101;
  760. void Uds_Service(uint8 *Data)
  761. {
  762. UdsAnsType UdsAns;
  763. memset((uint8 *)&UdsAns,0x00,sizeof(UdsAns));
  764. UdsAns.UdsSer = *(Data+0);
  765. UdsAns.UdsSubSer = *(Data+1);
  766. switch(UdsAns.UdsSer)
  767. {
  768. case 0x10://模式选择
  769. {
  770. if(*(Data+1)==0x01)
  771. {
  772. udsMode = 1;
  773. UdsPosAns(UdsAns);
  774. }
  775. else if(*(Data+1)==0x02)
  776. {
  777. if(udsMode==1||udsMode==2)
  778. {
  779. udsMode = 2;
  780. UdsPosAns(UdsAns);
  781. }
  782. else
  783. {
  784. udsMode = 0;
  785. UdsNegAns(UdsAns);
  786. }
  787. }
  788. else
  789. {
  790. udsMode = 0;
  791. UdsNegAns(UdsAns);
  792. }
  793. break;
  794. }
  795. case 0x22://查询
  796. {
  797. if(udsMode==2)
  798. {
  799. switch(UdsAns.UdsSubSer)
  800. {
  801. case 0x01://版本号查询
  802. {
  803. UdsAns.Seq = 0;
  804. UdsAns.Data1 = EbcAppSw>>24;
  805. UdsAns.Data2 = EbcAppSw>>16;
  806. UdsAns.Data3 = EbcAppSw>>8;
  807. UdsAns.Data4 = EbcAppSw;
  808. UdsPosAns(UdsAns);
  809. break;
  810. }
  811. case 0x02://解锁状态查询
  812. {
  813. UdsAns.Seq = 0;
  814. UdsAns.Data1 = ebcd_st_unlockSensor;
  815. UdsAns.Data2 = 0x00;
  816. UdsAns.Data3 = 0x00;
  817. UdsAns.Data4 = 0x00;
  818. UdsPosAns(UdsAns);
  819. break;
  820. }
  821. case 0x03://锁紧状态查询
  822. {
  823. UdsAns.Seq = 0;
  824. UdsAns.Data1 = ebcd_st_lockSensor;
  825. UdsAns.Data2 = 0x00;
  826. UdsAns.Data3 = 0x00;
  827. UdsAns.Data4 = 0x00;
  828. UdsPosAns(UdsAns);
  829. break;
  830. }
  831. case 0x04://落座状态查询
  832. {
  833. UdsAns.Seq = 0;
  834. UdsAns.Data1 = ebcd_st_pedstSensor;
  835. UdsAns.Data2 = 0x00;
  836. UdsAns.Data3 = 0x00;
  837. UdsAns.Data4 = 0x00;
  838. UdsPosAns(UdsAns);
  839. break;
  840. }
  841. case 0x05://互锁状态查询
  842. {
  843. UdsAns.Seq = 0;
  844. UdsAns.Data1 = ((m_flg_HVlock1&0x01)<<1)|(m_flg_HVlock2&0x01);
  845. UdsAns.Data2 = 0x00;
  846. UdsAns.Data3 = 0x00;
  847. UdsAns.Data4 = 0x00;
  848. UdsPosAns(UdsAns);
  849. break;
  850. }
  851. case 0x06://气压值查询
  852. {
  853. UdsAns.Seq = 0;
  854. UdsAns.Data1 = ebcd_P_airSensor;
  855. UdsAns.Data2 = 0x00;
  856. UdsAns.Data3 = 0x00;
  857. UdsAns.Data4 = 0x00;
  858. UdsPosAns(UdsAns);
  859. break;
  860. }
  861. case 0x07://锁紧压力查询
  862. {
  863. UdsAns.Seq = 0;
  864. UdsAns.Data1 = Test_LockPressure>>8;
  865. UdsAns.Data2 = Test_LockPressure;
  866. UdsAns.Data3 = 0x00;
  867. UdsAns.Data4 = 0x00;
  868. UdsPosAns(UdsAns);
  869. break;
  870. }
  871. case 0x08://锁紧次数查询
  872. {
  873. UdsAns.Seq = 0;
  874. UdsAns.Data1 = Test_LockPressure>>8;
  875. UdsAns.Data2 = Test_LockPressure;
  876. UdsAns.Data3 = 0x00;
  877. UdsAns.Data4 = 0x00;
  878. UdsPosAns(UdsAns);
  879. break;
  880. }
  881. case 0x09://温度数据查询
  882. {
  883. UdsAns.Seq = 0;
  884. UdsAns.Data1 = ebcd_T_plugin[0];
  885. UdsAns.Data2 = ebcd_T_plugin[1];
  886. UdsAns.Data3 = ebcd_T_plugin[2];
  887. UdsAns.Data4 = ebcd_T_plugin[3];
  888. UdsPosAns(UdsAns);
  889. break;
  890. }
  891. default:
  892. UdsNegAns(UdsAns);
  893. break;
  894. }
  895. }
  896. else
  897. {
  898. UdsNegAns(UdsAns);
  899. }
  900. break;
  901. }
  902. case 0x27://控制
  903. {
  904. if(udsMode==2)
  905. {
  906. switch(UdsAns.UdsSubSer)
  907. {
  908. case 0x01://循环测试开启
  909. {
  910. ebcd_flg_ebcManCtrlEn = 1;
  911. ebcd_flg_ebcManCtrlMode = 1;
  912. UdsPosAns(UdsAns);
  913. break;
  914. }
  915. case 0x02:
  916. {
  917. ebcd_flg_ebcManCtrlEn = 1;
  918. ebcd_flg_ebcManCtrlMode = 2;
  919. UdsPosAns(UdsAns);
  920. break;
  921. }
  922. case 0x03:
  923. {
  924. ebcd_flg_ebcManCtrlEn = 1;
  925. ebcd_flg_ebcManCtrlMode = 3;
  926. UdsPosAns(UdsAns);
  927. break;
  928. }
  929. default:
  930. UdsNegAns(UdsAns);
  931. break;
  932. }
  933. }
  934. else
  935. {
  936. UdsNegAns(UdsAns);
  937. }
  938. break;
  939. }
  940. case 0x2E://写入
  941. {
  942. if(udsMode==2)
  943. {
  944. switch(UdsAns.UdsSubSer)
  945. {
  946. case 0x01:
  947. {
  948. LockDelayTime = (*(Data+4)<<8)|*(Data+5);
  949. UdsPosAns(UdsAns);
  950. EEPROMDrv_bSaveInstantUB = 1;
  951. break;
  952. }
  953. case 0x02:
  954. {
  955. UnlockDelayTime = (*(Data+4)<<8)|*(Data+5);
  956. UdsPosAns(UdsAns);
  957. EEPROMDrv_bSaveInstantUB = 1;
  958. break;
  959. }
  960. default:
  961. UdsNegAns(UdsAns);
  962. break;
  963. }
  964. }
  965. else
  966. {
  967. UdsNegAns(UdsAns);
  968. }
  969. break;
  970. }
  971. default:
  972. break;
  973. }
  974. }
  975. void UdsPosAns(UdsAnsType UdsAnsData)
  976. {
  977. MCANDrv_infoMsgS_TYPE infoMsgS;
  978. infoMsgS.infoConfS.infoMsgParU.B.CAN=2;
  979. infoMsgS.infoConfS.infoMsgParU.B.DIR = _MCAN_DIR_TX;
  980. infoMsgS.infoConfS.infoMsgParU.B.DLC = 8;
  981. infoMsgS.infoConfS.infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  982. infoMsgS.infoConfS.infoMsgIDUI = 0x1C00EAECUL;
  983. infoMsgS.datMsgUBA[0] = 0x78;
  984. infoMsgS.datMsgUBA[1] = UdsAnsData.UdsSer;
  985. infoMsgS.datMsgUBA[2] = UdsAnsData.UdsSubSer;
  986. infoMsgS.datMsgUBA[3] = UdsAnsData.Seq;
  987. infoMsgS.datMsgUBA[4] = UdsAnsData.Data1;
  988. infoMsgS.datMsgUBA[5] = UdsAnsData.Data2;
  989. infoMsgS.datMsgUBA[6] = UdsAnsData.Data3;
  990. infoMsgS.datMsgUBA[7] = UdsAnsData.Data4;
  991. MCANDrv_SendMsg(infoMsgS);
  992. }
  993. void UdsNegAns(UdsAnsType UdsAnsData)
  994. {
  995. MCANDrv_infoMsgS_TYPE infoMsgS;
  996. infoMsgS.infoConfS.infoMsgParU.B.CAN=2;
  997. infoMsgS.infoConfS.infoMsgParU.B.DIR = _MCAN_DIR_TX;
  998. infoMsgS.infoConfS.infoMsgParU.B.DLC = 8;
  999. infoMsgS.infoConfS.infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  1000. infoMsgS.infoConfS.infoMsgIDUI = 0x1C00EAECUL;
  1001. infoMsgS.datMsgUBA[0] = 0x7F;
  1002. infoMsgS.datMsgUBA[1] = UdsAnsData.UdsSer;
  1003. infoMsgS.datMsgUBA[2] = UdsAnsData.UdsSubSer;
  1004. infoMsgS.datMsgUBA[3] = 0x00;
  1005. infoMsgS.datMsgUBA[4] = 0x00;
  1006. infoMsgS.datMsgUBA[5] = 0x00;
  1007. infoMsgS.datMsgUBA[6] = 0x00;
  1008. infoMsgS.datMsgUBA[7] = 0x00;
  1009. MCANDrv_SendMsg(infoMsgS);
  1010. }