BMS_CAN0_Mail_Box.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058
  1. ///##############################################################################
  2. //
  3. // FILE: BMS_CAN0_Mail_Box.c
  4. //
  5. // TITLE: CAN 0
  6. // - Module Configuration
  7. // - Mailbox Definition
  8. // - Mailbox Load
  9. // uint16_t CAN0_init ( void )
  10. // - Mailbox Check
  11. // uint16_t CAN0_update ( void )
  12. //
  13. //
  14. //##############################################################################
  15. //
  16. //==============================================================================
  17. // Change History:
  18. //==============================================================================
  19. // Datum: | Name | Version:| Change / Cause: | No
  20. //------------------------------------------------------------------------------
  21. // | | | | 002
  22. //------------------------------------------------------------------------------
  23. // | | | | 001
  24. //------------------------------------------------------------------------------
  25. // 05.07.13 | VR | 1.0 | New Build | 000
  26. //==============================================================================
  27. //==============================================================================
  28. // Comment Change / Cause:
  29. //==============================================================================
  30. // Change: 003 // 003
  31. //----------------------
  32. //
  33. //
  34. //==============================================================================
  35. // Change: 002 // 002
  36. //----------------------
  37. //
  38. //
  39. //==============================================================================
  40. // Change: 001 // 001
  41. //----------------------
  42. //
  43. //
  44. //==============================================================================
  45. #include "BMS_Master.h"
  46. volatile uint16_t CAN_ID_count[51] = { 0,0,0,0,0,0,0,0,0,0,
  47. 0,0,0,0,0,0,0,0,0,0,
  48. 0,0,0,0,0,0,0,0,0,0,
  49. 0,0,0,0,0,0,0,0,0,0,
  50. 0,0,0,0,0,0,0,0,0,0,
  51. 0 };
  52. static uint8_t Master_Rx0_buff[8]= {0,0,0,0,0,0,0,0};
  53. static uint8_t Master_Rx1_buff[8]= {0,0,0,0,0,0,0,0};
  54. static uint8_t Master_Rx2_buff[8]= {0,0,0,0,0,0,0,0};
  55. static uint8_t Master_Rx3_buff[8]= {0,0,0,0,0,0,0,0};
  56. static uint8_t Master_Rx4_buff[8]= {0,0,0,0,0,0,0,0};
  57. static uint8_t Master_Rx5_buff[8]= {0,0,0,0,0,0,0,0};
  58. static uint8_t Master_Rx6_buff[8]= {0,0,0,0,0,0,0,0};
  59. static uint8_t Master_Rx7_buff[8]= {0,0,0,0,0,0,0,0};
  60. // ****** Config CAN Modul ********************************************************
  61. CAN_CONFIG CAN_0_Config = {
  62. &CAN_0,
  63. CAN0_PortB0_1,
  64. TxPushPull, //enum {TxPushPull=0,Tx_OpenDrain} TxPortType;
  65. RxMask_Individual, //RxMaskType
  66. 0xFFFFFFFF, //uint32_t GlobalRxMask
  67. CANBaud_500kHz_OSC_40MHz
  68. };
  69. // ****** MailBox Master Ctrl **************************************************
  70. // Mailbox for contacting Slave 0
  71. CAN_MAILBOX CAN0_MB_MASTER0_BMS_100= {
  72. &CAN_0_Config,
  73. 0, // uint8_t MBNumber //0..64 Number of Message Buffer
  74. MB_Tx, // uint8_t Direction
  75. 0, // uint8_t RemoteEn
  76. 4, // uint8_t DataBytes
  77. 0, // uint8_t InterruptEnable
  78. 0xFFFFFFFF, // uint32_t AcceptMask
  79. SHORT_ID, // 11 Bit ID
  80. 0x100 // ID
  81. };
  82. // Mailbox for contacting Slave 1
  83. CAN_MAILBOX CAN0_MB_MASTER1_BMS_110= {
  84. &CAN_0_Config,
  85. 1, // uint8_t MBNumber //0..64 Number of Message Buffer
  86. MB_Tx, // uint8_t Direction
  87. 0, // uint8_t RemoteEn
  88. 4, // uint8_t DataBytes
  89. 0, // uint8_t InterruptEnable
  90. 0xFFFFFFFF, // uint32_t AcceptMask
  91. SHORT_ID, // 11 Bit ID
  92. 0x110 // ID
  93. };
  94. // Mailbox for contacting Slave 2
  95. CAN_MAILBOX CAN0_MB_MASTER2_BMS_120= {
  96. &CAN_0_Config,
  97. 2, // uint8_t MBNumber //0..64 Number of Message Buffer
  98. MB_Tx, // uint8_t Direction
  99. 0, // uint8_t RemoteEn
  100. 4, // uint8_t DataBytes
  101. 0, // uint8_t InterruptEnable
  102. 0xFFFFFFFF, // uint32_t AcceptMask
  103. SHORT_ID, // 11 Bit ID
  104. 0x120 // ID
  105. };
  106. // Mailbox for contacting Slave 3
  107. CAN_MAILBOX CAN0_MB_MASTER3_BMS_130= {
  108. &CAN_0_Config,
  109. 3, // uint8_t MBNumber //0..64 Number of Message Buffer
  110. MB_Tx, // uint8_t Direction
  111. 0, // uint8_t RemoteEn
  112. 4, // uint8_t DataBytes
  113. 0, // uint8_t InterruptEnable
  114. 0xFFFFFFFF, // uint32_t AcceptMask
  115. SHORT_ID, // 11 Bit ID
  116. 0x130 // ID
  117. };
  118. // Mailbox for contacting Slave 4
  119. CAN_MAILBOX CAN0_MB_MASTER4_BMS_140= {
  120. &CAN_0_Config,
  121. 4, // uint8_t MBNumber //0..64 Number of Message Buffer
  122. MB_Tx, // uint8_t Direction
  123. 0, // uint8_t RemoteEn
  124. 4, // uint8_t DataBytes
  125. 0, // uint8_t InterruptEnable
  126. 0xFFFFFFFF, // uint32_t AcceptMask
  127. SHORT_ID, // 11 Bit ID
  128. 0x140 // ID
  129. };
  130. // Mailbox for contacting Slave 5
  131. CAN_MAILBOX CAN0_MB_MASTER5_BMS_150= {
  132. &CAN_0_Config,
  133. 5, // uint8_t MBNumber //0..64 Number of Message Buffer
  134. MB_Tx, // uint8_t Direction
  135. 0, // uint8_t RemoteEn
  136. 4, // uint8_t DataBytes
  137. 0, // uint8_t InterruptEnable
  138. 0xFFFFFFFF, // uint32_t AcceptMask
  139. SHORT_ID, // 11 Bit ID
  140. 0x150 // ID
  141. };
  142. // Mailbox for contacting Slave 6
  143. CAN_MAILBOX CAN0_MB_MASTER6_BMS_160= {
  144. &CAN_0_Config,
  145. 6, // uint8_t MBNumber //0..64 Number of Message Buffer
  146. MB_Tx, // uint8_t Direction
  147. 0, // uint8_t RemoteEn
  148. 4, // uint8_t DataBytes
  149. 0, // uint8_t InterruptEnable
  150. 0xFFFFFFFF, // uint32_t AcceptMask
  151. SHORT_ID, // 11 Bit ID
  152. 0x160 // ID
  153. };
  154. // Mailbox for contacting Slave 7
  155. CAN_MAILBOX CAN0_MB_MASTER7_BMS_170= {
  156. &CAN_0_Config,
  157. 7, // uint8_t MBNumber //0..64 Number of Message Buffer
  158. MB_Tx, // uint8_t Direction
  159. 0, // uint8_t RemoteEn
  160. 4, // uint8_t DataBytes
  161. 0, // uint8_t InterruptEnable
  162. 0xFFFFFFFF, // uint32_t AcceptMask
  163. SHORT_ID, // 11 Bit ID
  164. 0x170 // ID
  165. };
  166. // Mailbox for contacting Slave 8
  167. CAN_MAILBOX CAN0_MB_MASTER8_BMS_180= {
  168. &CAN_0_Config,
  169. 8, // uint8_t MBNumber //0..64 Number of Message Buffer
  170. MB_Tx, // uint8_t Direction
  171. 0, // uint8_t RemoteEn
  172. 4, // uint8_t DataBytes
  173. 0, // uint8_t InterruptEnable
  174. 0xFFFFFFFF, // uint32_t AcceptMask
  175. SHORT_ID, // 11 Bit ID
  176. 0x180 // ID
  177. };
  178. // Mailbox for contacting Slave 9
  179. CAN_MAILBOX CAN0_MB_MASTER9_BMS_190= {
  180. &CAN_0_Config,
  181. 9, // uint8_t MBNumber //0..64 Number of Message Buffer
  182. MB_Tx, // uint8_t Direction
  183. 0, // uint8_t RemoteEn
  184. 4, // uint8_t DataBytes
  185. 0, // uint8_t InterruptEnable
  186. 0xFFFFFFFF, // uint32_t AcceptMask
  187. SHORT_ID, // 11 Bit ID
  188. 0x190 // ID
  189. };
  190. // Mailbox for contacting Slave 10
  191. CAN_MAILBOX CAN0_MB_MASTER10_BMS_1a0= {
  192. &CAN_0_Config,
  193. 10, // uint8_t MBNumber //0..64 Number of Message Buffer
  194. MB_Tx, // uint8_t Direction
  195. 0, // uint8_t RemoteEn
  196. 4, // uint8_t DataBytes
  197. 0, // uint8_t InterruptEnable
  198. 0xFFFFFFFF, // uint32_t AcceptMask
  199. SHORT_ID, // 11 Bit ID
  200. 0x1a0 // ID
  201. };
  202. // Mailbox for contacting Slave 11
  203. CAN_MAILBOX CAN0_MB_MASTER11_BMS_1b0= {
  204. &CAN_0_Config,
  205. 11, // uint8_t MBNumber //0..64 Number of Message Buffer
  206. MB_Tx, // uint8_t Direction
  207. 0, // uint8_t RemoteEn
  208. 4, // uint8_t DataBytes
  209. 0, // uint8_t InterruptEnable
  210. 0xFFFFFFFF, // uint32_t AcceptMask
  211. SHORT_ID, // 11 Bit ID
  212. 0x1b0 // ID
  213. };
  214. // Mailbox for contacting Slave 12
  215. CAN_MAILBOX CAN0_MB_MASTER12_BMS_1c0= {
  216. &CAN_0_Config,
  217. 12, // uint8_t MBNumber //0..64 Number of Message Buffer
  218. MB_Tx, // uint8_t Direction
  219. 0, // uint8_t RemoteEn
  220. 4, // uint8_t DataBytes
  221. 0, // uint8_t InterruptEnable
  222. 0xFFFFFFFF, // uint32_t AcceptMask
  223. SHORT_ID, // 11 Bit ID
  224. 0x1c0 // ID
  225. };
  226. // Mailbox for contacting Slave 13
  227. CAN_MAILBOX CAN0_MB_MASTER13_BMS_1d0= {
  228. &CAN_0_Config,
  229. 13, // uint8_t MBNumber //0..64 Number of Message Buffer
  230. MB_Tx, // uint8_t Direction
  231. 0, // uint8_t RemoteEn
  232. 4, // uint8_t DataBytes
  233. 0, // uint8_t InterruptEnable
  234. 0xFFFFFFFF, // uint32_t AcceptMask
  235. SHORT_ID, // 11 Bit ID
  236. 0x1d0 // ID
  237. };
  238. // Mailbox for contacting Slave 14
  239. CAN_MAILBOX CAN0_MB_MASTER14_BMS_1e0= {
  240. &CAN_0_Config,
  241. 14, // uint8_t MBNumber //0..64 Number of Message Buffer
  242. MB_Tx, // uint8_t Direction
  243. 0, // uint8_t RemoteEn
  244. 4, // uint8_t DataBytes
  245. 0, // uint8_t InterruptEnable
  246. 0xFFFFFFFF, // uint32_t AcceptMask
  247. SHORT_ID, // 11 Bit ID
  248. 0x1e0 // ID
  249. };
  250. // Mailbox for contacting Slave 15 = UI-Board
  251. CAN_MAILBOX CAN0_MB_MASTER15_BMS_1f0= {
  252. &CAN_0_Config,
  253. 15, // uint8_t MBNumber //0..64 Number of Message Buffer
  254. MB_Tx, // uint8_t Direction
  255. 0, // uint8_t RemoteEn
  256. 4, // uint8_t DataBytes
  257. 0, // uint8_t InterruptEnable
  258. 0xFFFFFFFF, // uint32_t AcceptMask
  259. SHORT_ID, // 11 Bit ID
  260. 0x1f0 // ID
  261. };
  262. // *** structure to access Mailboxes by number *** //
  263. CAN_MAILBOX* MB_Container[16]={
  264. &CAN0_MB_MASTER0_BMS_100,
  265. &CAN0_MB_MASTER1_BMS_110,
  266. &CAN0_MB_MASTER2_BMS_120,
  267. &CAN0_MB_MASTER3_BMS_130,
  268. &CAN0_MB_MASTER4_BMS_140,
  269. &CAN0_MB_MASTER5_BMS_150,
  270. &CAN0_MB_MASTER6_BMS_160,
  271. &CAN0_MB_MASTER7_BMS_170,
  272. &CAN0_MB_MASTER8_BMS_180,
  273. &CAN0_MB_MASTER9_BMS_190,
  274. &CAN0_MB_MASTER10_BMS_1a0,
  275. &CAN0_MB_MASTER11_BMS_1b0,
  276. &CAN0_MB_MASTER12_BMS_1c0,
  277. &CAN0_MB_MASTER13_BMS_1d0,
  278. &CAN0_MB_MASTER14_BMS_1e0,
  279. &CAN0_MB_MASTER15_BMS_1f0
  280. };
  281. // *** structure to access Request Telegrams by number
  282. MASTER_X_BMS_TELEGRAM TelegramTxContainer[16];
  283. // ****** MailBox Slave Response **************************************************
  284. // Slave X Telegram 0
  285. CAN_MAILBOX CAN_MB_SlaveX0_2X0 = {
  286. &CAN_0_Config,
  287. 16, // uint8_t MBNumber //0..64
  288. MB_Rx, // uint8_t Direction
  289. 0, // uint8_t RemoteEn
  290. 8, // uint8_t DataBytes
  291. 0, // uint8_t Interrupt
  292. 0xFC3FFFFF, // uint32_t AcceptMask
  293. SHORT_ID, // 11 Bit ID
  294. 0x200 // ID
  295. };
  296. // Slave X Telegram 1
  297. CAN_MAILBOX CAN_MB_SlaveX1_2X1 = {
  298. &CAN_0_Config,
  299. 17, // uint8_t MBNumber //0..64
  300. MB_Rx, // uint8_t Direction
  301. 0, // uint8_t RemoteEn
  302. 8, // uint8_t DataBytes
  303. 0, // uint8_t Interrupt
  304. 0xFC3FFFFF, // uint32_t AcceptMask
  305. SHORT_ID, // 11 Bit ID
  306. 0x201 // ID
  307. };
  308. // Slave X Telegram 2
  309. CAN_MAILBOX CAN_MB_SlaveX2_2X2 = {
  310. &CAN_0_Config,
  311. 18, // uint8_t MBNumber //0..64
  312. MB_Rx, // uint8_t Direction
  313. 0, // uint8_t RemoteEn
  314. 8, // uint8_t DataBytes
  315. 0, // uint8_t Interrupt
  316. 0xFC3FFFFF, // uint32_t AcceptMask
  317. SHORT_ID, // 11 Bit ID
  318. 0x202 // ID
  319. };
  320. // Slave X Telegram 3
  321. CAN_MAILBOX CAN_MB_SlaveX3_2X3 = {
  322. &CAN_0_Config,
  323. 19, // uint8_t MBNumber //0..64
  324. MB_Rx, // uint8_t Direction
  325. 0, // uint8_t RemoteEn
  326. 8, // uint8_t DataBytes
  327. 0, // uint8_t Interrupt
  328. 0xFC3FFFFF, // uint32_t AcceptMask
  329. SHORT_ID, // 11 Bit ID
  330. 0x203 // ID
  331. };
  332. // Slave X Telegram 4
  333. CAN_MAILBOX CAN_MB_SlaveX4_2X4 = {
  334. &CAN_0_Config,
  335. 20, // uint8_t MBNumber //0..64
  336. MB_Rx, // uint8_t Direction
  337. 0, // uint8_t RemoteEn
  338. 8, // uint8_t DataBytes
  339. 0, // uint8_t Interrupt
  340. 0xFC3FFFFF, // uint32_t AcceptMask
  341. SHORT_ID, // 11 Bit ID
  342. 0x204 // ID
  343. };
  344. // Slave X Telegram 5
  345. CAN_MAILBOX CAN_MB_SlaveX5_2X5 = {
  346. &CAN_0_Config,
  347. 21, // uint8_t MBNumber //0..64
  348. MB_Rx, // uint8_t Direction
  349. 0, // uint8_t RemoteEn
  350. 8, // uint8_t DataBytes
  351. 0, // uint8_t Interrupt
  352. 0xFC3FFFFF, // uint32_t AcceptMask
  353. SHORT_ID, // 11 Bit ID
  354. 0x205 // ID
  355. };
  356. // Slave X Telegram 6
  357. CAN_MAILBOX CAN_MB_SlaveX6_2X6 = {
  358. &CAN_0_Config,
  359. 22, // uint8_t MBNumber //0..64
  360. MB_Rx, // uint8_t Direction
  361. 0, // uint8_t RemoteEn
  362. 8, // uint8_t DataBytes
  363. 0, // uint8_t Interrupt
  364. 0xFC3FFFFF, // uint32_t AcceptMask
  365. SHORT_ID, // 11 Bit ID
  366. 0x206 // ID
  367. };
  368. // Slave X Telegram 7
  369. CAN_MAILBOX CAN_MB_SlaveX7_2X7 = {
  370. &CAN_0_Config,
  371. 23, // uint8_t MBNumber //0..64
  372. MB_Rx, // uint8_t Direction
  373. 0, // uint8_t RemoteEn
  374. 8, // uint8_t DataBytes
  375. 0, // uint8_t Interrupt
  376. 0xFC3FFFFF, // uint32_t AcceptMask
  377. SHORT_ID, // 11 Bit ID
  378. 0x207 // ID
  379. };
  380. // ****** MailBox UI_Master Response **************************************************
  381. CAN_MAILBOX CAN_MB_UI_MASTER_2F7 = {
  382. &CAN_0_Config,
  383. 24, // uint8_t MBNumber //0..64
  384. MB_Rx, // uint8_t Direction
  385. 0, // uint8_t RemoteEn
  386. 8, // uint8_t DataBytes
  387. 0, // uint8_t Interrupt
  388. 0xFFFFFFFF, // uint32_t AcceptMask
  389. SHORT_ID, // 11 Bit ID
  390. 0x2FF // ID
  391. };
  392. // ***** Mailboxes for automatic CAN ID initialization
  393. // Mailboxes for CAN initialisierung
  394. CAN_MAILBOX CAN_TxMB_System300 = {
  395. &CAN_0_Config,
  396. 25, // uint8_t MBNumber //0..15
  397. MB_Tx, // uint8_t Direction
  398. 0, // uint8_t RemoteEn
  399. 8, // uint8_t DataBytes
  400. 0, // uint8_t InterruptEnable
  401. 0xFFFFFFFF, // uint32_t AcceptMask
  402. SHORT_ID, // 11 Bit ID
  403. 0x300 // ID
  404. };
  405. CAN_MAILBOX CAN_TxMB_System30A = {
  406. &CAN_0_Config,
  407. 26, // uint8_t MBNumber //0..15
  408. MB_Tx, // uint8_t Direction
  409. 0, // uint8_t RemoteEn
  410. 8, // uint8_t DataBytes
  411. 0, // uint8_t InterruptEnable
  412. 0xFFFFFFFF, // uint32_t AcceptMask
  413. SHORT_ID, // 11 Bit ID
  414. 0x30A // ID
  415. };
  416. CAN_MAILBOX CAN_TxMB_Master0A = {
  417. &CAN_0_Config,
  418. 27, // uint8_t MBNumber //0..15
  419. MB_Tx, // uint8_t Direction
  420. 0, // uint8_t RemoteEn
  421. 8, // uint8_t DataBytes
  422. 0, // uint8_t InterruptEnable
  423. 0xFFFFFFFF, // uint32_t AcceptMask
  424. SHORT_ID, // 11 Bit ID
  425. 0x10A // ID
  426. };
  427. // ****** CAN_RxMB_Slave_0A_Master **************************************************
  428. CAN_MAILBOX CAN_RxMB_Slave_0A_Master = {
  429. &CAN_0_Config,
  430. 28, // uint8_t MBNumber //0..15
  431. MB_Rx, // uint8_t Direction
  432. 0, // uint8_t RemoteEn
  433. 8, // uint8_t DataBytes
  434. 0, // uint8_t Interrupt
  435. 0xFFFFFFFF, // uint32_t AcceptMask
  436. SHORT_ID, // 11 Bit ID
  437. 0x20A // ID
  438. };
  439. // Mailboxes for Programming serial Number
  440. // ****** CAN_RxMB_System308 **************************************************
  441. CAN_MAILBOX CAN_RxMB_System308 = {
  442. &CAN_0_Config,
  443. 29, // uint8_t MBNumber //0..15
  444. MB_Rx, // uint8_t Direction
  445. 0, // uint8_t RemoteEn
  446. 8, // uint8_t DataBytes
  447. 0, // uint8_t Interrupt
  448. 0xFFFFFFFF, // uint32_t AcceptMask
  449. SHORT_ID, // 11 Bit ID
  450. 0x308 // ID
  451. };
  452. // ****** CAN_RxMB_System309 **************************************************
  453. CAN_MAILBOX CAN_RxMB_System309 = {
  454. &CAN_0_Config,
  455. 30, // uint8_t MBNumber //0..15
  456. MB_Rx, // uint8_t Direction
  457. 0, // uint8_t RemoteEn
  458. 8, // uint8_t DataBytes
  459. 0, // uint8_t Interrupt
  460. 0xFFFFFFFF, // uint32_t AcceptMask
  461. SHORT_ID, // 11 Bit ID
  462. 0x309 // ID
  463. };
  464. // ***** CAN0_init *************************************************************
  465. uint16_t CAN0_init( void )
  466. {
  467. uint16_t ReturnVal = CAN_OK;
  468. if (CAN_Init(&CAN_0_Config) == CAN_OK)
  469. {
  470. // init Tx Message Boxes
  471. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER0_BMS_100);
  472. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER1_BMS_110);
  473. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER2_BMS_120);
  474. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER3_BMS_130);
  475. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER4_BMS_140);
  476. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER5_BMS_150);
  477. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER6_BMS_160);
  478. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER7_BMS_170);
  479. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER8_BMS_180);
  480. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER9_BMS_190);
  481. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER10_BMS_1a0);
  482. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER11_BMS_1b0);
  483. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER12_BMS_1c0);
  484. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER13_BMS_1d0);
  485. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER14_BMS_1e0);
  486. ReturnVal += CAN_Init_Mailbox(&CAN0_MB_MASTER15_BMS_1f0);
  487. // init Rx Message Boxes
  488. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX0_2X0 );
  489. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX1_2X1 );
  490. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX2_2X2 );
  491. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX3_2X3 );
  492. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX4_2X4 );
  493. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX5_2X5 );
  494. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX6_2X6 );
  495. ReturnVal += CAN_Init_Mailbox(&CAN_MB_SlaveX7_2X7 );
  496. // init tx mailboxes for automatic can id search
  497. CAN_Init_Mailbox(&CAN_TxMB_System300 );
  498. CAN_Init_Mailbox(&CAN_TxMB_System30A );
  499. CAN_Init_Mailbox(&CAN_TxMB_Master0A);
  500. // init rx mailboxes for automatic can id search
  501. CAN_Init_Mailbox(&CAN_RxMB_Slave_0A_Master );
  502. CAN_Init_Mailbox(&CAN_RxMB_System308 );
  503. CAN_Init_Mailbox(&CAN_RxMB_System309);
  504. }
  505. return ReturnVal;
  506. }
  507. uint16_t CAN0_init_telegrams(MASTER_X_BMS_TELEGRAM* telegram_ptr,uint8_t nrOfSlaves) {
  508. int i;
  509. if(nrOfSlaves > CAN0_MAX_NR_OF_SLAVES) {
  510. return FALSE;
  511. }
  512. for(i=0;i<nrOfSlaves;i++) {
  513. telegram_ptr->Values.MasterAlive=0;
  514. telegram_ptr->Values.SetMode=BMS_SLAVE_RUN ;
  515. telegram_ptr->Values.BalancingCell0_7=0;
  516. telegram_ptr->Values.BalancingCell8_15=0;
  517. telegram_ptr->Values.BalancingCell16_23=0;
  518. telegram_ptr++;
  519. }
  520. return TRUE;
  521. }
  522. uint16_t CAN0_rx_test() {
  523. SET_OUTPIN(PIN_REGNR_LED1); // set LED 1
  524. // check if Interrupt Flag 1 register is set, if true CAN Message has arrived
  525. if( CHECKBIT( CAN_0.IFRL.R, 16 )) {
  526. SETBIT( CAN_0.IFRL.R, 16); // Clear Interrupt Flag 1 register by writing '1'
  527. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX0_2X0,&Master_Rx0_buff[0]);
  528. CAN_ID_count[16]++;
  529. }
  530. if( CHECKBIT( CAN_0.IFRL.R, 17 )) {
  531. SETBIT( CAN_0.IFRL.R, 17); // Clear Interrupt Flag 1 register by writing '1'
  532. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX1_2X1,&Master_Rx1_buff[0]);
  533. CAN_ID_count[17]++;
  534. }
  535. if( CHECKBIT( CAN_0.IFRL.R, 18 )) {
  536. SETBIT( CAN_0.IFRL.R, 18); // Clear Interrupt Flag 1 register by writing '1'
  537. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX2_2X2,&Master_Rx2_buff[0]);
  538. CAN_ID_count[18]++;
  539. }
  540. if( CHECKBIT( CAN_0.IFRL.R, 19 )) {
  541. SETBIT( CAN_0.IFRL.R, 19); // Clear Interrupt Flag 1 register by writing '1'
  542. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX3_2X3,&Master_Rx3_buff[0]);
  543. CAN_ID_count[19]++;
  544. }
  545. if( CHECKBIT( CAN_0.IFRL.R, 20 )) {
  546. SETBIT( CAN_0.IFRL.R, 20); // Clear Interrupt Flag 1 register by writing '1'
  547. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX4_2X4,&Master_Rx4_buff[0]);
  548. CAN_ID_count[20]++;
  549. }
  550. if( CHECKBIT( CAN_0.IFRL.R, 21 )) {
  551. SETBIT( CAN_0.IFRL.R, 21); // Clear Interrupt Flag 1 register by writing '1'
  552. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX5_2X5,&Master_Rx5_buff[0]);
  553. CAN_ID_count[21]++;
  554. }
  555. if( CHECKBIT( CAN_0.IFRL.R, 22 )) {
  556. SETBIT( CAN_0.IFRL.R, 22); // Clear Interrupt Flag 1 register by writing '1'
  557. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX6_2X6,&Master_Rx6_buff[0]);
  558. CAN_ID_count[22]++;
  559. }
  560. if( CHECKBIT( CAN_0.IFRL.R, 23 )) {
  561. SETBIT( CAN_0.IFRL.R, 23); // Clear Interrupt Flag 1 register by writing '1'
  562. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX7_2X7,&Master_Rx7_buff[0]);
  563. CAN_ID_count[23]++;
  564. }
  565. CLEAR_OUTPIN(PIN_REGNR_LED1); //clear LED 1
  566. return CAN_OK;
  567. }
  568. uint16_t CAN0_tx_test(uint8_t slave_nr,uint8_t *four_byte_field) {
  569. int8_t ReturnResult;
  570. ReturnResult = CAN_Write(MB_Container[slave_nr], four_byte_field);
  571. return ReturnResult;
  572. }
  573. //// ***** CAN0_update ***********************************************************
  574. uint16_t CAN0_update( void ) {
  575. return 0;
  576. }
  577. // **** Check for recived Can Ids
  578. uint32_t CAN0_check_serial_nr_rec_Can_init(MASTER_CAN0_STRUCT_t*s ,uint8_t SlaveNr) {
  579. if( CHECKBIT( CAN_0.IFRL.R, 28 )) { // CAN_Rx_SlaveXA_Master
  580. SETBIT( CAN_0.IFRL.R, 28 ); // IFR clear
  581. CAN_Read( &CAN_RxMB_Slave_0A_Master, &(s->startupConfig.SlaveConfig[SlaveNr].SerialNr[0]) );
  582. return TRUE;
  583. }
  584. return FALSE;
  585. }
  586. // ***** CAN_Tx_System30A ********************************************************
  587. uint16_t CAN_Tx_System30A( uint8_t *pSERNr )
  588. {
  589. uint16_t ReturnResult = CAN_OK;
  590. ReturnResult = CAN_Write( &CAN_TxMB_System30A, pSERNr );
  591. return ReturnResult;
  592. }
  593. uint16_t CAN0_check_if_slave_rec(BMS_CAN0_SLAVE_t* Slave) {
  594. uint16_t recTelegrams=0; // number of received telegrams
  595. // ordenary Slave
  596. if(Slave->SlaveType==SLAVE) {
  597. // check if Interrupt Flag 1 register is set, if true CAN Message has arrived
  598. if( CHECKBIT( CAN_0.IFRL.R, 16 ) ) {
  599. SETBIT( CAN_0.IFRL.R, 16); // Clear Interrupt Flag 1 register by writing '1'
  600. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX0_2X0,&Master_Rx0_buff[0]);
  601. Slave->SlaveTelegramsRecFlag |= (1<<0) ; //set flag to indicate that telegram 0 has been received
  602. saveSlaveX0_Master_telegram(Slave);
  603. CAN_ID_count[16]++;
  604. recTelegrams++;
  605. }
  606. if( CHECKBIT( CAN_0.IFRL.R, 17 )) {
  607. SETBIT( CAN_0.IFRL.R, 17); // Clear Interrupt Flag 1 register by writing '1'
  608. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX1_2X1,&Master_Rx1_buff[0]);
  609. Slave->SlaveTelegramsRecFlag |= (1<<1) ; //set flag to indicate that telegram 1 has been received
  610. saveSlaveX1_Master_telegram(Slave);
  611. CAN_ID_count[17]++;
  612. recTelegrams++;
  613. }
  614. if( CHECKBIT( CAN_0.IFRL.R, 18 )) {
  615. SETBIT( CAN_0.IFRL.R, 18); // Clear Interrupt Flag 1 register by writing '1'
  616. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX2_2X2,&Master_Rx2_buff[0]);
  617. Slave->SlaveTelegramsRecFlag |= (1<<2) ; //set flag to indicate that telegram 2 has been received
  618. saveSlaveX2_Master_telegram(Slave);
  619. CAN_ID_count[18]++;
  620. recTelegrams++;
  621. }
  622. if( CHECKBIT( CAN_0.IFRL.R, 19 )) {
  623. SETBIT( CAN_0.IFRL.R, 19); // Clear Interrupt Flag 1 register by writing '1'
  624. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX3_2X3,&Master_Rx3_buff[0]);
  625. Slave->SlaveTelegramsRecFlag |= (1<<3) ; //set flag to indicate that telegram 3 has been received
  626. saveSlaveX3_Master_telegram(Slave);
  627. CAN_ID_count[19]++;
  628. recTelegrams++;
  629. }
  630. if( CHECKBIT( CAN_0.IFRL.R, 20 )) {
  631. SETBIT( CAN_0.IFRL.R, 20); // Clear Interrupt Flag 1 register by writing '1'
  632. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX4_2X4,&Master_Rx4_buff[0]);
  633. Slave->SlaveTelegramsRecFlag |= (1<<4) ; //set flag to indicate that telegram 4 has been received
  634. saveSlaveX4_Master_telegram(Slave);
  635. CAN_ID_count[20]++;
  636. recTelegrams++;
  637. }
  638. if( CHECKBIT( CAN_0.IFRL.R, 21 )) {
  639. SETBIT( CAN_0.IFRL.R, 21); // Clear Interrupt Flag 1 register by writing '1'
  640. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX5_2X5,&Master_Rx5_buff[0]);
  641. Slave->SlaveTelegramsRecFlag |= (1<<5) ; //set flag to indicate that telegram 5 has been received
  642. saveSlaveX5_Master_telegram(Slave);
  643. CAN_ID_count[21]++;
  644. recTelegrams++;
  645. }
  646. if( CHECKBIT( CAN_0.IFRL.R, 22 )) {
  647. SETBIT( CAN_0.IFRL.R, 22); // Clear Interrupt Flag 1 register by writing '1'
  648. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX6_2X6,&Master_Rx6_buff[0]);
  649. Slave->SlaveTelegramsRecFlag |= (1<<6) ; //set flag to indicate that telegram 6 has been received
  650. saveSlaveX6_Master_telegram(Slave);
  651. CAN_ID_count[22]++;
  652. recTelegrams++;
  653. }
  654. if( CHECKBIT( CAN_0.IFRL.R, 23 )) {
  655. SETBIT( CAN_0.IFRL.R, 23); // Clear Interrupt Flag 1 register by writing '1'
  656. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX7_2X7,&Master_Rx7_buff[0]);
  657. Slave->SlaveTelegramsRecFlag |= (1<<7) ; //set flag to indicate that telegram 7 has been received
  658. saveSlaveX7_Master_telegram(Slave);
  659. CAN_ID_count[23]++;
  660. recTelegrams++;
  661. }
  662. }
  663. return recTelegrams;
  664. }
  665. /*
  666. * use for reset of timeout error
  667. */
  668. uint16_t CAN0_clear_all_interrupt_flags() {
  669. SETBIT( CAN_0.IFRL.R, 16);
  670. SETBIT( CAN_0.IFRL.R, 17);
  671. SETBIT( CAN_0.IFRL.R, 18);
  672. SETBIT( CAN_0.IFRL.R, 19);
  673. SETBIT( CAN_0.IFRL.R, 20);
  674. SETBIT( CAN_0.IFRL.R, 21);
  675. SETBIT( CAN_0.IFRL.R, 22);
  676. SETBIT( CAN_0.IFRL.R, 23);
  677. return TRUE;
  678. }
  679. uint16_t CAN0_DEBUG_data_check_if_slave_rec(BMS_CAN0_SLAVE_t* Slave,BMS_CAN0_SLAVE_t* DummySlave) {
  680. uint16_t recTelegrams=0; // number of received telegrams
  681. // ordenary Slave
  682. if(Slave->SlaveType==SLAVE) {
  683. // check if Interrupt Flag 1 register is set, if true CAN Message has arrived
  684. if( CHECKBIT( CAN_0.IFRL.R, 16 ) ) {
  685. SETBIT( CAN_0.IFRL.R, 16); // Clear Interrupt Flag 1 register by writing '1'
  686. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX0_2X0,&Master_Rx0_buff[0]);
  687. gen_data_generate_CAN0_RX0_Telegram(DummySlave,(SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx0_buff[0]);
  688. DummySlave->SlaveAliveCnt[0]++;
  689. if(DummySlave->SlaveAliveCnt[0]>7){
  690. DummySlave->SlaveAliveCnt[0]=0;
  691. }
  692. Slave->SlaveTelegramsRecFlag |= (1<<0) ; //set flag to indicate that telegram 0 has been received
  693. saveSlaveX0_Master_telegram(Slave);
  694. CAN_ID_count[16]++;
  695. recTelegrams++;
  696. }
  697. if( CHECKBIT( CAN_0.IFRL.R, 17 )) {
  698. SETBIT( CAN_0.IFRL.R, 17); // Clear Interrupt Flag 1 register by writing '1'
  699. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX1_2X1,&Master_Rx1_buff[0]);
  700. gen_data_generate_CAN0_RX1_Telegram(DummySlave,(SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx1_buff[0]);
  701. DummySlave->SlaveAliveCnt[1]++;
  702. if(DummySlave->SlaveAliveCnt[1]>7){
  703. DummySlave->SlaveAliveCnt[1]=0;
  704. }
  705. Slave->SlaveTelegramsRecFlag |= (1<<1) ; //set flag to indicate that telegram 1 has been received
  706. saveSlaveX1_Master_telegram(Slave);
  707. CAN_ID_count[17]++;
  708. recTelegrams++;
  709. }
  710. if( CHECKBIT( CAN_0.IFRL.R, 18 )) {
  711. SETBIT( CAN_0.IFRL.R, 18); // Clear Interrupt Flag 1 register by writing '1'
  712. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX2_2X2,&Master_Rx2_buff[0]);
  713. gen_data_generate_CAN0_RX2_Telegram(DummySlave,(SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx2_buff[0]);
  714. DummySlave->SlaveAliveCnt[2]++;
  715. if(DummySlave->SlaveAliveCnt[2]>7){
  716. DummySlave->SlaveAliveCnt[2]=0;
  717. }
  718. Slave->SlaveTelegramsRecFlag |= (1<<2) ; //set flag to indicate that telegram 2 has been received
  719. saveSlaveX2_Master_telegram(Slave);
  720. CAN_ID_count[18]++;
  721. recTelegrams++;
  722. }
  723. if( CHECKBIT( CAN_0.IFRL.R, 19 )) {
  724. SETBIT( CAN_0.IFRL.R, 19); // Clear Interrupt Flag 1 register by writing '1'
  725. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX3_2X3,&Master_Rx3_buff[0]);
  726. gen_data_generate_CAN0_RX3_Telegram(DummySlave,(SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx3_buff[0]);
  727. DummySlave->SlaveAliveCnt[3]++;
  728. if(DummySlave->SlaveAliveCnt[3]>7){
  729. DummySlave->SlaveAliveCnt[3]=0;
  730. }
  731. Slave->SlaveTelegramsRecFlag |= (1<<3) ; //set flag to indicate that telegram 3 has been received
  732. saveSlaveX3_Master_telegram(Slave);
  733. CAN_ID_count[19]++;
  734. recTelegrams++;
  735. }
  736. if( CHECKBIT( CAN_0.IFRL.R, 20 )) {
  737. SETBIT( CAN_0.IFRL.R, 20); // Clear Interrupt Flag 1 register by writing '1'
  738. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX4_2X4,&Master_Rx4_buff[0]);
  739. gen_data_generate_CAN0_RX4_Telegram(DummySlave,(SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx4_buff[0]);
  740. DummySlave->SlaveAliveCnt[4]++;
  741. if(DummySlave->SlaveAliveCnt[4]>7){
  742. DummySlave->SlaveAliveCnt[4]=0;
  743. }
  744. Slave->SlaveTelegramsRecFlag |= (1<<4) ; //set flag to indicate that telegram 4 has been received
  745. saveSlaveX4_Master_telegram(Slave);
  746. CAN_ID_count[20]++;
  747. recTelegrams++;
  748. }
  749. if( CHECKBIT( CAN_0.IFRL.R, 21 )) {
  750. SETBIT( CAN_0.IFRL.R, 21); // Clear Interrupt Flag 1 register by writing '1'
  751. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX5_2X5,&Master_Rx5_buff[0]);
  752. gen_data_generate_CAN0_RX5_Telegram(DummySlave,(SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx5_buff[0]);
  753. DummySlave->SlaveAliveCnt[5]++;
  754. if(DummySlave->SlaveAliveCnt[5]>7){
  755. DummySlave->SlaveAliveCnt[5]=0;
  756. }
  757. Slave->SlaveTelegramsRecFlag |= (1<<5) ; //set flag to indicate that telegram 5 has been received
  758. saveSlaveX5_Master_telegram(Slave);
  759. CAN_ID_count[21]++;
  760. recTelegrams++;
  761. }
  762. if( CHECKBIT( CAN_0.IFRL.R, 22 )) {
  763. SETBIT( CAN_0.IFRL.R, 22); // Clear Interrupt Flag 1 register by writing '1'
  764. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX6_2X6,&Master_Rx6_buff[0]);
  765. gen_data_generate_CAN0_RX6_Telegram(DummySlave,(SLAVE_X6_BMS_TELEGRAM*)&Master_Rx6_buff[0]);
  766. DummySlave->SlaveAliveCnt[6]++;
  767. if(DummySlave->SlaveAliveCnt[6]>7){
  768. DummySlave->SlaveAliveCnt[6]=0;
  769. }
  770. Slave->SlaveTelegramsRecFlag |= (1<<6) ; //set flag to indicate that telegram 6 has been received
  771. saveSlaveX6_Master_telegram(Slave);
  772. CAN_ID_count[22]++;
  773. recTelegrams++;
  774. }
  775. if( CHECKBIT( CAN_0.IFRL.R, 23 )) {
  776. SETBIT( CAN_0.IFRL.R, 23); // Clear Interrupt Flag 1 register by writing '1'
  777. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX7_2X7,&Master_Rx7_buff[0]);
  778. gen_data_generate_CAN0_RX7_Telegram(DummySlave,(SLAVE_X7_BMS_TELEGRAM*)&Master_Rx7_buff[0]);
  779. DummySlave->SlaveAliveCnt[7]++;
  780. if(DummySlave->SlaveAliveCnt[7]>7){
  781. DummySlave->SlaveAliveCnt[7]=0;
  782. }
  783. Slave->SlaveTelegramsRecFlag |= (1<<7) ; //set flag to indicate that telegram 7 has been received
  784. saveSlaveX7_Master_telegram(Slave);
  785. CAN_ID_count[23]++;
  786. recTelegrams++;
  787. }
  788. }
  789. return recTelegrams;
  790. }
  791. uint16_t CAN0_DEBUG_slave_check_if_slave_rec(BMS_CAN0_SLAVE_t* Slave,BMS_CAN0_SLAVE_t* DummySlave) {
  792. // just copy data from dummy slave
  793. uint8_t i;
  794. for(i=0;i<CAN0_MAX_NR_OF_SLAVES-1;i++) {
  795. Slave->CellTemp[i]=DummySlave->CellTemp[i];
  796. Slave->CellVoltage[i]=DummySlave->CellVoltage[i];
  797. }
  798. Slave->HeatSinkTemp=DummySlave->HeatSinkTemp;
  799. Slave->SlaveError=DummySlave->SlaveError;
  800. Slave->SlaveMode=DummySlave->SlaveMode;
  801. Slave->SlaveTelegramsRecFlag=CAN0_ALL_TELEGRAMS_REC;
  802. }
  803. uint8_t CAN0_check_if_UI_Board_rec(BMS_CAN0_SLAVE_t* Slave,BMS_CAN0_UI_t* UI_Board) {
  804. uint8_t recTelegrams=0;
  805. if( CHECKBIT( CAN_0.IFRL.R, 23 )) {
  806. SETBIT( CAN_0.IFRL.R, 23); // Clear Interrupt Flag 1 register by writing '1'
  807. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX7_2X7,&Master_Rx7_buff[0]);
  808. Slave->SlaveTelegramsRecFlag |= (1<<7) ; //set flag to indicate that telegram 7 has been received
  809. saveSlaveUI_Master_telegram(Slave,UI_Board);
  810. CAN_ID_count[23]++;
  811. recTelegrams++;
  812. return TRUE;
  813. }
  814. return FALSE;
  815. }
  816. uint8_t CAN0_DEBUG_data_check_if_UI_Board_rec(BMS_CAN0_SLAVE_t* Slave,BMS_CAN0_SLAVE_t* DummySlave,BMS_CAN0_UI_t* UI_Board,BMS_CAN0_UI_t* Dummy_UI_Board) {
  817. uint8_t recTelegrams=0;
  818. if( CHECKBIT( CAN_0.IFRL.R, 23 )) {
  819. SETBIT( CAN_0.IFRL.R, 23); // Clear Interrupt Flag 1 register by writing '1'
  820. CAN_Rx_readout_Mailbox(&CAN_MB_SlaveX7_2X7,&Master_Rx7_buff[0]);
  821. gen_data_generate_CAN0_UI_Telegram(DummySlave,Dummy_UI_Board,(SLAVE_UI_BMS_TELEGRAM*)&Master_Rx7_buff[0]);
  822. Slave->SlaveTelegramsRecFlag |= (1<<7) ; //set flag to indicate that telegram 7 has been received
  823. saveSlaveUI_Master_telegram(Slave,UI_Board);
  824. CAN_ID_count[23]++;
  825. recTelegrams++;
  826. return TRUE;
  827. }
  828. }
  829. uint8_t CAN0_DEBUG_slave_check_if_UI_Board_rec(BMS_CAN0_SLAVE_t* Slave,BMS_CAN0_SLAVE_t* DummySlave,BMS_CAN0_UI_t* UI_Board,BMS_CAN0_UI_t* Dummy_UI_Board) {
  830. uint8_t recTelegrams=0;
  831. UI_Board->Ibatt=Dummy_UI_Board->Ibatt;
  832. UI_Board->Ubatt=Dummy_UI_Board->Ubatt;
  833. UI_Board->Checksum=Dummy_UI_Board->Checksum;
  834. return TRUE;
  835. }
  836. uint16_t saveSlaveX0_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  837. SLAVE_X0_5_BMS_TELEGRAM* tel_ptr= (SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx0_buff[0];
  838. Slave->SlaveAliveCnt[0]=(uint8_t)(tel_ptr->SlaveAlive);
  839. Slave->CellVoltage[0]=(tel_ptr->Vcell0);
  840. Slave->CellVoltage[1]=tel_ptr->Vcell1;
  841. Slave->CellVoltage[2]=tel_ptr->Vcell2;
  842. Slave->CellVoltage[3]=tel_ptr->Vcell3;
  843. return TRUE;
  844. }
  845. uint16_t saveSlaveX1_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  846. SLAVE_X0_5_BMS_TELEGRAM* tel_ptr= (SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx1_buff[0];
  847. Slave->SlaveAliveCnt[1]=(uint8_t)(tel_ptr->SlaveAlive);
  848. Slave->CellVoltage[4]=(tel_ptr->Vcell0);
  849. Slave->CellVoltage[5]=tel_ptr->Vcell1;
  850. Slave->CellVoltage[6]=tel_ptr->Vcell2;
  851. Slave->CellVoltage[7]=tel_ptr->Vcell3;
  852. return TRUE;
  853. }
  854. uint16_t saveSlaveX2_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  855. SLAVE_X0_5_BMS_TELEGRAM* tel_ptr= (SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx2_buff[0];
  856. Slave->SlaveAliveCnt[2]=(uint8_t)(tel_ptr->SlaveAlive);
  857. Slave->CellVoltage[8]=(tel_ptr->Vcell0);
  858. Slave->CellVoltage[9]=tel_ptr->Vcell1;
  859. Slave->CellVoltage[10]=tel_ptr->Vcell2;
  860. Slave->CellVoltage[11]=tel_ptr->Vcell3;
  861. return TRUE;
  862. }
  863. uint16_t saveSlaveX3_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  864. SLAVE_X0_5_BMS_TELEGRAM* tel_ptr= (SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx3_buff[0];
  865. Slave->SlaveAliveCnt[3]=(uint8_t)(tel_ptr->SlaveAlive);
  866. Slave->CellVoltage[12]=(tel_ptr->Vcell0);
  867. Slave->CellVoltage[13]=tel_ptr->Vcell1;
  868. Slave->CellVoltage[14]=tel_ptr->Vcell2;
  869. Slave->CellVoltage[15]=tel_ptr->Vcell3;
  870. return TRUE;
  871. }
  872. uint16_t saveSlaveX4_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  873. SLAVE_X0_5_BMS_TELEGRAM* tel_ptr= (SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx4_buff[0];
  874. Slave->SlaveAliveCnt[4]=(uint8_t)(tel_ptr->SlaveAlive);
  875. Slave->CellVoltage[16]=(tel_ptr->Vcell0);
  876. Slave->CellVoltage[17]=tel_ptr->Vcell1;
  877. Slave->CellVoltage[18]=tel_ptr->Vcell2;
  878. Slave->CellVoltage[19]=tel_ptr->Vcell3;
  879. return TRUE;
  880. }
  881. uint16_t saveSlaveX5_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  882. SLAVE_X0_5_BMS_TELEGRAM* tel_ptr= (SLAVE_X0_5_BMS_TELEGRAM*)&Master_Rx5_buff[0];
  883. Slave->SlaveAliveCnt[5]=(uint8_t)(tel_ptr->SlaveAlive);
  884. Slave->CellVoltage[20]=(tel_ptr->Vcell0);
  885. Slave->CellVoltage[21]=tel_ptr->Vcell1;
  886. Slave->CellVoltage[22]=tel_ptr->Vcell2;
  887. Slave->CellVoltage[23]=tel_ptr->Vcell3;
  888. return TRUE;
  889. }
  890. uint16_t saveSlaveX6_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  891. SLAVE_X6_BMS_TELEGRAM* tel_ptr= (SLAVE_X6_BMS_TELEGRAM*)&Master_Rx6_buff[0];
  892. Slave->SlaveAliveCnt[6]=(uint8_t)(tel_ptr->SlaveAlive);
  893. Slave->SlaveMode=tel_ptr->SlaveMode;
  894. Slave->SlaveError=tel_ptr->SlaveError;
  895. return TRUE;
  896. }
  897. uint16_t saveSlaveX7_Master_telegram(BMS_CAN0_SLAVE_t* Slave){
  898. SLAVE_X7_BMS_TELEGRAM* tel_ptr= (SLAVE_X7_BMS_TELEGRAM*)&Master_Rx7_buff[0];
  899. uint8_t MuxCounter = tel_ptr->MuxCounter;
  900. Slave->SlaveAliveCnt[7]=(uint8_t)(tel_ptr->SlaveAlive);
  901. Slave->HeatSinkTemp=tel_ptr->TempHeatSink;
  902. Slave->CellTemp[MuxCounter*4+0]=tel_ptr->TempSens0;
  903. Slave->CellTemp[MuxCounter*4+1]=tel_ptr->TempSens1;
  904. Slave->CellTemp[MuxCounter*4+2]=tel_ptr->TempSens2;
  905. Slave->CellTemp[MuxCounter*4+3]=tel_ptr->TempSens3;
  906. return TRUE;
  907. }
  908. uint16_t saveSlaveUI_Master_telegram(BMS_CAN0_SLAVE_t* Slave,BMS_CAN0_UI_t* UI_Board){
  909. uint8_t test = Master_Rx7_buff[5] & 0x04 ;
  910. Slave->SlaveAliveCnt[0]=Master_Rx7_buff[0] >> 5;
  911. Slave->SlaveMode=Master_Rx7_buff[0] & 0x1F;
  912. UI_Board->Ubatt=(Master_Rx7_buff[1] << 8 )+ Master_Rx7_buff[2];
  913. UI_Board->Ibatt=(Master_Rx7_buff[3] << 8 )+ Master_Rx7_buff[4];
  914. UI_Board->Errors.OffsetError=(Master_Rx7_buff[5] & 0x01 );
  915. UI_Board->Errors.SupplyError=((Master_Rx7_buff[5] & 0x02 ) >> 1);
  916. UI_Board->Errors.RelayOpen=((Master_Rx7_buff[5] & 0x04 ) >> 2);
  917. UI_Board->Checksum=Master_Rx7_buff[7];
  918. return TRUE;
  919. }
  920. // ***** End BMS_CAN0_Mail_Box.c ***********************************************