main_target.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "src/battery_data/battery.h"
  2. #include "ti_msp_dl_config.h"
  3. //#include "ti/driverlib/dl_i2c.h"
  4. #include <stdio.h>
  5. #include "src/interfaces/i2c_target.h"
  6. #include "src/interfaces/i2c_controller.h"
  7. #include "src/config.h"
  8. volatile bool mcu_CommandPending= false;
  9. void I2C_controller_INST_IRQHandler(void) {
  10. switch (DL_I2C_getPendingInterrupt(I2C_controller_INST)) {
  11. case DL_I2C_IIDX_CONTROLLER_START:
  12. controllerRxPackage.count = 0;
  13. DL_I2C_flushControllerTXFIFO(I2C_controller_INST);
  14. break;
  15. case DL_I2C_IIDX_CONTROLLER_RXFIFO_TRIGGER:
  16. /* Store bytes received from target in Rx Msg Buffer */
  17. while (DL_I2C_isControllerRXFIFOEmpty(I2C_controller_INST) != true) {
  18. if (controllerRxPackage.count < controllerRxPackage.len) {
  19. controllerRxPackage.packet[controllerRxPackage.count] =
  20. DL_I2C_receiveControllerData(I2C_controller_INST);
  21. ;
  22. controllerRxPackage.count++;
  23. } else {
  24. /* Ignore and remove from FIFO if the buffer is full */
  25. DL_I2C_receiveControllerData(I2C_controller_INST);
  26. }
  27. }
  28. if (controllerRxPackage.count >= controllerRxPackage.len) {
  29. controllerRxPackage.complete = true;
  30. DL_I2C_enableInterrupt(I2C_controller_INST,
  31. DL_I2C_INTERRUPT_CONTROLLER_STOP);
  32. }
  33. break;
  34. /*TRANSMIT data to ADC*/
  35. case DL_I2C_IIDX_CONTROLLER_TXFIFO_TRIGGER:
  36. if (controllerTxPackage.count < controllerTxPackage.len) {
  37. DL_I2C_fillControllerTXFIFO(I2C_controller_INST,
  38. &controllerTxPackage.packet[controllerTxPackage.count],
  39. (controllerTxPackage.len - controllerTxPackage.count));
  40. controllerTxPackage.count++;
  41. } else {
  42. /*Prevent overflow and just ignore data*/
  43. DL_I2C_fillTargetTXFIFO(I2C_controller_INST, (uint8_t[]){0x00}, 1);
  44. controllerTxPackage.complete = true;
  45. }
  46. if(controllerTxPackage.count >= controllerTxPackage.len){
  47. controllerTxPackage.complete= true;
  48. }
  49. break;
  50. /*STOP condition*/
  51. case DL_I2C_IIDX_CONTROLLER_STOP:
  52. controllerTxPackage.complete = true;
  53. controllerRxPackage.complete = true;
  54. break;
  55. case DL_I2C_IIDX_CONTROLLER_ARBITRATION_LOST:
  56. break;
  57. case DL_I2C_IIDX_CONTROLLER_NACK:
  58. break;
  59. default:
  60. break;
  61. }
  62. }
  63. /**** Interrupt for Pi to MCU ****/
  64. void I2C_target_INST_IRQHandler(void) {
  65. uint32_t status = DL_I2C_getPendingInterrupt(I2C_target_INST);
  66. //printf("interrupt %d", status);
  67. //uint8_t slot= ((DL_I2C_receiveTargetData(I2C_target_INST) & 0xF0)>>4);
  68. switch (status) {
  69. case DL_I2C_IIDX_TARGET_START:
  70. break;
  71. case DL_I2C_IIDX_TARGET_STOP:
  72. break;
  73. case DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER:
  74. if (DL_I2C_isTargetRXFIFOEmpty(I2C_target_INST)) {
  75. return;
  76. }
  77. uint8_t receivedByte = DL_I2C_receiveTargetData(I2C_target_INST);
  78. uint8_t receivedCommand = (receivedByte & 0x0F);
  79. uint8_t slot = ((receivedByte & 0xF0) >> 4);
  80. if (receivedCommand == CMD_GET_MEASUREMENT) {
  81. DL_I2C_flushTargetTXFIFO(I2C_target_INST);
  82. DL_I2C_fillTargetTXFIFO(I2C_target_INST, (uint8_t *)&battery_slots[slot].measurement, sizeof(BatteryMeasurement));
  83. }
  84. //mcu_CommandPending= true;
  85. break;
  86. case DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER:
  87. //mcu_CommandPending= true;
  88. //DL_I2C_fillTargetTXFIFO(I2C_target_INST, (uint8_t *)&battery_slots[slot].measurement, sizeof(BatteryMeasurement));
  89. break;
  90. case DL_I2C_IIDX_TARGET_ARBITRATION_LOST:
  91. break;
  92. default:
  93. break;
  94. }
  95. }
  96. int main(void)
  97. {
  98. SYSCFG_DL_init();
  99. battery_slotmgr.init();
  100. NVIC_EnableIRQ(I2C_controller_INST_INT_IRQN);
  101. NVIC_EnableIRQ(I2C_target_INST_INT_IRQN);
  102. initialize_target_address();
  103. while (1) {
  104. for(uint8_t slot= 0; slot< NUM_SLOTS; slot++){
  105. if(mcu_CommandPending){
  106. #ifdef DEBUG_TARGET
  107. printf("Calling MCU target action\n");
  108. #endif
  109. mcu_i2c_handle(I2C_target_INST);
  110. mcu_CommandPending = false;
  111. }
  112. // step 1: update the voltage readings
  113. battery_slotmgr.read_state(slot);
  114. // step 2: control loop to adjust the dac / adc values,
  115. // but only if no error happens
  116. // (0x80 is the error flag of the state)
  117. if ((*battery_slots[slot].state & 0x80) == 0) {
  118. battery_slotmgr.adjust_current(slot);
  119. } else {
  120. battery_slotmgr.disable(slot);
  121. }
  122. break;
  123. }
  124. delay_cycles(MAINLOOP_DELAY);
  125. }
  126. }