BleCanProtocolFunc.c 25 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  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. bled_flg_bleDisconn = 0;
  607. bled_st_dataTrans = 1;
  608. break;
  609. }
  610. case 0x1CEF0001:
  611. {
  612. bled_Nr_softVer = (Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8) | (Data[3]);
  613. break;
  614. }
  615. case 0x1CEF0002:
  616. {
  617. if (Data[0] == 0x01 && Data[1]==0x01)
  618. {
  619. bled_flg_bleConn = 1;
  620. bled_flg_bleDisconn = 0;
  621. }
  622. else if(Data[0] == 0x01 && Data[1]==0x02)
  623. {
  624. bled_flg_bleConn = 0;
  625. bled_flg_bleDisconn = 1;
  626. }
  627. break;
  628. }
  629. case 0x1C00ECEA://UDS检测ID
  630. {
  631. Uds_Service(Data);
  632. break;
  633. }
  634. default:
  635. break;
  636. }
  637. }
  638. /**
  639. * @brief : Ebc通过can2接收到的数据解码,Ble->Ebc
  640. * @param {*}
  641. * @return {*}
  642. */
  643. void Can2DataDecode(uint8 Data[])
  644. {
  645. uint8 CmdIndex = Data[0];
  646. ebcd_st_toBleAns = CmdIndex;
  647. ebcd_flg_Can2SendEnbale = TRUE;//所有的信息均立即回复
  648. switch (CmdIndex)
  649. {
  650. case 0x01: //心跳数据,为了维持通讯
  651. {
  652. bled_flg_Heart = 1;
  653. ebcd_flg_Can2SendEnbale = TRUE;
  654. break;
  655. }
  656. case 0x02: //获取换电控制器信息
  657. {
  658. bled_flg_getEbcData = 1;
  659. ebcd_flg_Can2SendEnbale = TRUE;
  660. break;
  661. }
  662. case 0x03: //获得车辆信息
  663. {
  664. bled_flg_getVcuData = 1;
  665. ebcd_flg_Can2SendEnbale = TRUE;
  666. break;
  667. }
  668. case 0x04: //获取电池信息
  669. {
  670. bled_flg_getBmsData = 1;
  671. ebcd_flg_Can2SendEnbale = TRUE;
  672. break;
  673. }
  674. case 0x05: //握手
  675. {
  676. bled_flg_handShake = 1;
  677. ebcd_flg_Can2SendEnbale = TRUE;
  678. break;
  679. }
  680. case 0x06: //解锁
  681. {
  682. bled_flg_unlockCmd = Data[1];
  683. bled_flg_lockCmd = 0;
  684. break;
  685. }
  686. case 0x07: //锁紧
  687. {
  688. bled_flg_lockCmd = Data[1];
  689. bled_flg_unlockCmd = 0;
  690. break;
  691. }
  692. case 0x08: //完成换电
  693. {
  694. bled_flg_swapBattDone = 1;
  695. break;
  696. }
  697. case 0x09: //强制解锁,强制上升
  698. {
  699. bled_flg_unlockCmdForce = Data[1];
  700. bled_flg_topAscendCmdForce = Data[2];
  701. break;
  702. }
  703. case 0x0A: //强制锁紧,强制下降
  704. {
  705. bled_flg_lockCmdForce = Data[1];
  706. bled_flg_topDescendCmdForce = Data[2];
  707. break;
  708. }
  709. case 0x0B: //回到行车状态
  710. {
  711. bled_flg_backToDrv = 1;
  712. break;
  713. }
  714. case 0x0C: //顶板举升
  715. {
  716. bled_flg_topAscendCmd = Data[1];
  717. break;
  718. }
  719. case 0x0D: //顶板下降
  720. {
  721. bled_flg_topDescendCmd = Data[1];
  722. break;
  723. }
  724. case 0x0E: //换电开始自动解锁
  725. {
  726. bled_flg_autoUnlock = 1;
  727. break;
  728. }
  729. case 0x0F: //换电完成自动锁紧
  730. {
  731. bled_flg_autoLock = 1;
  732. break;
  733. }
  734. case 0x10: //除尘开始
  735. {
  736. bled_flg_openDustReCmd = 1;
  737. break;
  738. }
  739. case 0x11: //除尘关闭
  740. {
  741. bled_flg_closeDustReCmd = 1;
  742. break;
  743. }
  744. case 0x12: //切换到无线通信状态
  745. {
  746. break;
  747. }
  748. case 0x13: //进入换电状态
  749. {
  750. bled_flg_toSwapMod = 1;
  751. break;
  752. }
  753. case 0x14: //急停指令
  754. {
  755. bled_flg_safeStopCmd = 1;
  756. break;
  757. }//新增需要改数组
  758. default:
  759. break;
  760. }
  761. }
  762. static uint8 udsMode = 0;//uds 模式
  763. uint32 EbcAppSw = 0x00000101;
  764. void Uds_Service(uint8 *Data)
  765. {
  766. UdsAnsType UdsAns;
  767. memset((uint8 *)&UdsAns,0x00,sizeof(UdsAns));
  768. UdsAns.UdsSer = *(Data+0);
  769. UdsAns.UdsSubSer = *(Data+1);
  770. switch(UdsAns.UdsSer)
  771. {
  772. case 0x10://模式选择
  773. {
  774. if(*(Data+1)==0x01)
  775. {
  776. udsMode = 1;
  777. UdsPosAns(UdsAns);
  778. }
  779. else if(*(Data+1)==0x02)
  780. {
  781. if(udsMode==1||udsMode==2)
  782. {
  783. udsMode = 2;
  784. UdsPosAns(UdsAns);
  785. }
  786. else
  787. {
  788. udsMode = 0;
  789. UdsNegAns(UdsAns);
  790. }
  791. }
  792. else
  793. {
  794. udsMode = 0;
  795. UdsNegAns(UdsAns);
  796. }
  797. break;
  798. }
  799. case 0x22://查询
  800. {
  801. if(udsMode==2)
  802. {
  803. switch(UdsAns.UdsSubSer)
  804. {
  805. case 0x01://版本号查询
  806. {
  807. UdsAns.Seq = 0;
  808. UdsAns.Data1 = EbcAppSw>>24;
  809. UdsAns.Data2 = EbcAppSw>>16;
  810. UdsAns.Data3 = EbcAppSw>>8;
  811. UdsAns.Data4 = EbcAppSw;
  812. UdsPosAns(UdsAns);
  813. break;
  814. }
  815. case 0x02://解锁状态查询
  816. {
  817. UdsAns.Seq = 0;
  818. UdsAns.Data1 = ebcd_st_unlockSensor;
  819. UdsAns.Data2 = 0x00;
  820. UdsAns.Data3 = 0x00;
  821. UdsAns.Data4 = 0x00;
  822. UdsPosAns(UdsAns);
  823. break;
  824. }
  825. case 0x03://锁紧状态查询
  826. {
  827. UdsAns.Seq = 0;
  828. UdsAns.Data1 = ebcd_st_lockSensor;
  829. UdsAns.Data2 = 0x00;
  830. UdsAns.Data3 = 0x00;
  831. UdsAns.Data4 = 0x00;
  832. UdsPosAns(UdsAns);
  833. break;
  834. }
  835. case 0x04://落座状态查询
  836. {
  837. UdsAns.Seq = 0;
  838. UdsAns.Data1 = ebcd_st_pedstSensor;
  839. UdsAns.Data2 = 0x00;
  840. UdsAns.Data3 = 0x00;
  841. UdsAns.Data4 = 0x00;
  842. UdsPosAns(UdsAns);
  843. break;
  844. }
  845. case 0x05://互锁状态查询
  846. {
  847. UdsAns.Seq = 0;
  848. UdsAns.Data1 = ((m_flg_HVlock1&0x01)<<1)|(m_flg_HVlock2&0x01);
  849. UdsAns.Data2 = 0x00;
  850. UdsAns.Data3 = 0x00;
  851. UdsAns.Data4 = 0x00;
  852. UdsPosAns(UdsAns);
  853. break;
  854. }
  855. case 0x06://气压值查询
  856. {
  857. UdsAns.Seq = 0;
  858. UdsAns.Data1 = ebcd_P_airSensor;
  859. UdsAns.Data2 = 0x00;
  860. UdsAns.Data3 = 0x00;
  861. UdsAns.Data4 = 0x00;
  862. UdsPosAns(UdsAns);
  863. break;
  864. }
  865. case 0x07://锁紧压力查询
  866. {
  867. UdsAns.Seq = 0;
  868. UdsAns.Data1 = Test_LockPressure>>8;
  869. UdsAns.Data2 = Test_LockPressure;
  870. UdsAns.Data3 = 0x00;
  871. UdsAns.Data4 = 0x00;
  872. UdsPosAns(UdsAns);
  873. break;
  874. }
  875. case 0x08://锁紧次数查询
  876. {
  877. UdsAns.Seq = 0;
  878. UdsAns.Data1 = ManuControlTimes>>8;
  879. UdsAns.Data2 = ManuControlTimes;
  880. UdsAns.Data3 = 0x00;
  881. UdsAns.Data4 = 0x00;
  882. UdsPosAns(UdsAns);
  883. break;
  884. }
  885. case 0x09://温度数据查询
  886. {
  887. UdsAns.Seq = 0;
  888. UdsAns.Data1 = ebcd_T_plugin[0];
  889. UdsAns.Data2 = ebcd_T_plugin[1];
  890. UdsAns.Data3 = ebcd_T_plugin[2];
  891. UdsAns.Data4 = ebcd_T_plugin[3];
  892. UdsPosAns(UdsAns);
  893. break;
  894. }
  895. default:
  896. UdsNegAns(UdsAns);
  897. break;
  898. }
  899. }
  900. else
  901. {
  902. UdsNegAns(UdsAns);
  903. }
  904. break;
  905. }
  906. case 0x27://控制
  907. {
  908. if(udsMode==2)
  909. {
  910. switch(UdsAns.UdsSubSer)
  911. {
  912. case 0x01://循环测试开启
  913. {
  914. ebcd_flg_ebcManCtrlEn = 1;
  915. ebcd_flg_ebcManCtrlMode = 1;
  916. UdsPosAns(UdsAns);
  917. break;
  918. }
  919. case 0x02:
  920. {
  921. ebcd_flg_ebcManCtrlEn = 1;
  922. ebcd_flg_ebcManCtrlMode = 2;
  923. UdsPosAns(UdsAns);
  924. break;
  925. }
  926. case 0x03:
  927. {
  928. ebcd_flg_ebcManCtrlEn = 1;
  929. ebcd_flg_ebcManCtrlMode = 3;
  930. UdsPosAns(UdsAns);
  931. break;
  932. }
  933. default:
  934. UdsNegAns(UdsAns);
  935. break;
  936. }
  937. }
  938. else
  939. {
  940. UdsNegAns(UdsAns);
  941. }
  942. break;
  943. }
  944. case 0x2E://写入
  945. {
  946. if(udsMode==2)
  947. {
  948. switch(UdsAns.UdsSubSer)
  949. {
  950. case 0x01:
  951. {
  952. LockDelayTime = (*(Data+4)<<8)|*(Data+5);
  953. UdsPosAns(UdsAns);
  954. EEPROMDrv_bSaveInstantUB = 1;
  955. break;
  956. }
  957. case 0x02:
  958. {
  959. UnlockDelayTime = (*(Data+4)<<8)|*(Data+5);
  960. UdsPosAns(UdsAns);
  961. EEPROMDrv_bSaveInstantUB = 1;
  962. break;
  963. }
  964. default:
  965. UdsNegAns(UdsAns);
  966. break;
  967. }
  968. }
  969. else
  970. {
  971. UdsNegAns(UdsAns);
  972. }
  973. break;
  974. }
  975. default:
  976. break;
  977. }
  978. }
  979. void UdsPosAns(UdsAnsType UdsAnsData)
  980. {
  981. MCANDrv_infoMsgS_TYPE infoMsgS;
  982. infoMsgS.infoConfS.infoMsgParU.B.CAN=2;
  983. infoMsgS.infoConfS.infoMsgParU.B.DIR = _MCAN_DIR_TX;
  984. infoMsgS.infoConfS.infoMsgParU.B.DLC = 8;
  985. infoMsgS.infoConfS.infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  986. infoMsgS.infoConfS.infoMsgIDUI = 0x1C00EAECUL;
  987. infoMsgS.datMsgUBA[0] = 0x78;
  988. infoMsgS.datMsgUBA[1] = UdsAnsData.UdsSer;
  989. infoMsgS.datMsgUBA[2] = UdsAnsData.UdsSubSer;
  990. infoMsgS.datMsgUBA[3] = UdsAnsData.Seq;
  991. infoMsgS.datMsgUBA[4] = UdsAnsData.Data1;
  992. infoMsgS.datMsgUBA[5] = UdsAnsData.Data2;
  993. infoMsgS.datMsgUBA[6] = UdsAnsData.Data3;
  994. infoMsgS.datMsgUBA[7] = UdsAnsData.Data4;
  995. MCANDrv_SendMsg(infoMsgS);
  996. }
  997. void UdsNegAns(UdsAnsType UdsAnsData)
  998. {
  999. MCANDrv_infoMsgS_TYPE infoMsgS;
  1000. infoMsgS.infoConfS.infoMsgParU.B.CAN=2;
  1001. infoMsgS.infoConfS.infoMsgParU.B.DIR = _MCAN_DIR_TX;
  1002. infoMsgS.infoConfS.infoMsgParU.B.DLC = 8;
  1003. infoMsgS.infoConfS.infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  1004. infoMsgS.infoConfS.infoMsgIDUI = 0x1C00EAECUL;
  1005. infoMsgS.datMsgUBA[0] = 0x7F;
  1006. infoMsgS.datMsgUBA[1] = UdsAnsData.UdsSer;
  1007. infoMsgS.datMsgUBA[2] = UdsAnsData.UdsSubSer;
  1008. infoMsgS.datMsgUBA[3] = 0x00;
  1009. infoMsgS.datMsgUBA[4] = 0x00;
  1010. infoMsgS.datMsgUBA[5] = 0x00;
  1011. infoMsgS.datMsgUBA[6] = 0x00;
  1012. infoMsgS.datMsgUBA[7] = 0x00;
  1013. MCANDrv_SendMsg(infoMsgS);
  1014. }