BMS_CAN1_Tools.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. ///##############################################################################
  2. //
  3. // FILE: BMS_CAN1_Tools.c
  4. //
  5. // TITLE: CAN 1
  6. // CAN_Tx_NLG5_CTL_618
  7. // check_and_save_NLG5_ST
  8. //
  9. //
  10. //##############################################################################
  11. //
  12. //==============================================================================
  13. // Change History:
  14. //==============================================================================
  15. // Datum: | Name | Version:| Change / Cause: | No
  16. //------------------------------------------------------------------------------
  17. // | | | | 002
  18. //------------------------------------------------------------------------------
  19. // | | | | 001
  20. //------------------------------------------------------------------------------
  21. // 31.07.13 | VR | 1.0 | New Build | 000
  22. //==============================================================================
  23. //==============================================================================
  24. // Comment Change / Cause:
  25. //==============================================================================
  26. // Change: 003 // 003
  27. //----------------------
  28. //
  29. //
  30. //==============================================================================
  31. // Change: 002 // 002
  32. //----------------------
  33. //
  34. //
  35. //==============================================================================
  36. // Change: 001 // 001
  37. //----------------------
  38. //
  39. //
  40. //==============================================================================
  41. #include "BMS_Master.h"
  42. //quick and dirty loesung
  43. //extern CAN_MAILBOX CAN_Tx0_RCT_INVERTER;
  44. //extern CAN_MAILBOX CAN_Tx1_RCT_INVERTER;
  45. //extern CAN_MAILBOX CAN_Rx_RCT_INVERTER;
  46. // ***** CAN_Tx_NLG5_CTL ********************************************************
  47. uint16_t CAN_Tx_NLG5_CTL_618( void )
  48. {
  49. uint8_t Data[7];
  50. uint16_t ReturnResult = CAN_OK;
  51. Data[0] = (uint8_t)(0x80); // CAN enable
  52. Data[1] = (uint8_t)((NLG5_MAINS_CURRENT >> 8) & 0xFF); // Mains Current Maximum
  53. Data[2] = (uint8_t)(NLG5_MAINS_CURRENT & 0xFF);
  54. Data[3] = (uint8_t)((NLG5_OUTPUT_VOLTAGE >> 8) & 0xFF); // Output Voltage Command
  55. Data[4] = (uint8_t)(NLG5_OUTPUT_VOLTAGE & 0xFF);
  56. Data[5] = (uint8_t)((NLG5_OUTPUT_CURRENT >> 8) & 0xFF); // Output Current Command
  57. Data[6] = (uint8_t)(NLG5_OUTPUT_CURRENT & 0xFF);
  58. //ReturnResult = CAN_Write( &CAN_TxMB_NLG5_CTL_618, &Data[0] );
  59. return ReturnResult;
  60. }
  61. int16_t CAN1_tx_Data_to_Inverter(uint32_t timestamp,BMS_CAN1_INVERTER_TX* data) {
  62. int16_t ReturnResult = CAN_OK;
  63. //uint8_t test[8]= {0,0,0,0,0,0,0,0};
  64. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.maxBatteryChargeCurrent),Global_1msCounter);
  65. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.maxBatteryChargeVoltage),Global_1msCounter);
  66. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.maxBatteryDischargeCurrent),Global_1msCounter);
  67. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.minBatteryDischargeVoltage),Global_1msCounter);
  68. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batteryCurrent),Global_1msCounter);
  69. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batteryVoltage),Global_1msCounter);
  70. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batterySOCtarget),Global_1msCounter);
  71. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batterySOC),Global_1msCounter);
  72. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batteryCapacity),Global_1msCounter);
  73. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batteryTemperature),Global_1msCounter);
  74. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batterySOH),Global_1msCounter);
  75. ReturnResult +=CAN_Write_dataset(&CAN_Tx0_RCT_INVERTER, (uint8_t*)&(data->Values.batteryStatus),Global_1msCounter);
  76. //ReturnResult =CAN_Write(&CAN_Tx0_RCT_INVERTER,test);
  77. return ReturnResult;
  78. }
  79. uint32_t delay_CAN1_ms(uint32_t timestamp,uint32_t delay_ms) {
  80. while(timestamp + delay_ms >Global_1msCounter) {
  81. // do nothing
  82. }
  83. return Global_1msCounter;
  84. }
  85. int16_t CAN1_request_float_value(uint32_t timestamp,float* value,uint32_t requestId) {
  86. static BMS_CAN1_INVERTER_REQUEST request_telegram;
  87. static BMS_CAN1_INVERTER_FLOAT_t received_telegram;
  88. int16_t ReturnResult = CAN_OK;
  89. request_telegram.valueId=CAN1_TX_REQUESTED_VALUE_ID_ID ;
  90. request_telegram.requestId=requestId;
  91. ReturnResult =CAN_Write(&CAN_Tx1_RCT_INVERTER, (uint8_t*)&request_telegram);
  92. if(ReturnResult != CAN_OK) {
  93. return CAN_ERROR;
  94. }
  95. // wait 2ms for response
  96. while(timestamp + CAN1_TX_TIMEOUT >= Global_1msCounter) {
  97. if(CHECKBIT( CAN_1.IFRL.R, 2 )) {
  98. // answer received
  99. ReturnResult = CAN_Read(&CAN_Rx_RCT_INVERTER, (uint8_t*)&received_telegram);
  100. *value=received_telegram.value;
  101. return CAN_OK;
  102. }
  103. return CAN_ERROR;
  104. }
  105. }
  106. int16_t CAN1_send_request_telegram(uint32_t requestId) {
  107. static BMS_CAN1_INVERTER_REQUEST request_telegram;
  108. int16_t ReturnResult = CAN_OK;
  109. request_telegram.valueId=CAN1_TX_REQUESTED_VALUE_ID_ID ;
  110. request_telegram.requestId=requestId;
  111. shuffle_lsb_msb_can1((uint8_t*)&(request_telegram.valueId));
  112. shuffle_lsb_msb_can1((uint8_t*)&(request_telegram.requestId));
  113. ReturnResult =CAN_Write(&CAN_Tx1_RCT_INVERTER, (uint8_t*)&request_telegram);
  114. return ReturnResult;
  115. }
  116. uint16_t CAN1_wait_for_response(float* value) {
  117. static BMS_CAN1_INVERTER_FLOAT_t received_telegram;
  118. int16_t ReturnResult = CAN_OK;
  119. if(CHECKBIT( CAN_1.IFRL.R, 2 )) {
  120. // answer received
  121. ReturnResult = CAN_Read(&CAN_Rx_RCT_INVERTER, (uint8_t*)&received_telegram);
  122. shuffle_lsb_msb_can1((uint8_t*)&(received_telegram.value));
  123. *value=received_telegram.value;
  124. return TRUE;
  125. }
  126. return FALSE;
  127. }
  128. // ***** check_and_save_NLG5_ST ************************************************
  129. void check_and_save_NLG5_ST( CAN_MAILBOX *p_MBox )
  130. {
  131. uint8_t Data[8]; // Receive Dummy
  132. NLG5_ST_t gNLG5_ST;
  133. if( CAN_Read(p_MBox, &Data[0] ) != CAN_ERROR )
  134. {
  135. gNLG5_ST.NLG5_STB1.R = ( uint8_t )Data[0];
  136. gNLG5_ST.NLG5_STB2.R = ( uint8_t )Data[1];
  137. gNLG5_ST.NLG5_STB3.R = ( uint8_t )Data[2];
  138. gNLG5_ST.NLG5_STB4 = Data[3];
  139. }
  140. }
  141. // ***** End BMS_CAN1_Tools.c **************************************************