From cd21cc0ff484709ba0d0f2a678d0877d8a14cde6 Mon Sep 17 00:00:00 2001 From: Kilian Bracher Date: Thu, 6 Feb 2025 20:26:06 +0100 Subject: [PATCH] refactor: move files around, add external interface header file for ADBMS6830 HAL --- .../Core/Inc/ADBMS_Abstraction.h | 46 +--------- .../ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h | 86 +++++++++++++++++++ .../ADBMS6830B_Driver/Core/Inc/ADBMS_Error.h | 18 ++++ .../{AMS_HighLevel.h => ADBMS_HighLevel.h} | 4 - .../Lib/ADBMS6830B_Driver/Core/Inc/errors.h | 41 --------- .../Core/Src/ADBMS_Abstraction.c | 1 + .../Core/Src/{errors.c => ADBMS_Error.c} | 2 +- .../{AMS_HighLevel.c => ADBMS_HighLevel.c} | 4 +- AMS_Master_Code/Core/Src/slave_monitoring.c | 2 +- 9 files changed, 110 insertions(+), 94 deletions(-) create mode 100755 AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h create mode 100644 AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Error.h rename AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/{AMS_HighLevel.h => ADBMS_HighLevel.h} (90%) delete mode 100755 AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/errors.h rename AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/{errors.c => ADBMS_Error.c} (94%) rename AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/{AMS_HighLevel.c => ADBMS_HighLevel.c} (98%) diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h index 380038d..9e147ad 100755 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h @@ -10,59 +10,15 @@ #include "ADBMS_CMD_MAKROS.h" #include "ADBMS_LL_Driver.h" +#include "ADBMS_Driver.h" #include "main.h" - -#define MAXIMUM_CELL_VOLTAGES 16 -#define MAXIMUM_AUX_VOLTAGES 10 -#define MAXIMUM_GPIO 10 - //see table 103 in datasheet (page 71) #define DEFAULT_UV 417 //VUV * 16 * 150 uV + 1.5 V Default Setting 2.5V #define DEFAULT_OV 1125 //VOV * 16 * 150 uV + 1.5 V Default Setting 4.2V #define mV_from_ADBMS6830(x) (((((int16_t) (x))) * 0.150) + 1500) -struct ADBMS6830_Internal_Status { - uint16_t CS_FLT : 16; //ADC fault - mismatch between S- and C-ADC - uint16_t : 3; - uint16_t CCTS : 13; //Conversion counter - uint16_t SMED : 1; //S-ADC multiple trim error (uncorrectable) - uint16_t SED : 1; //S-ADC single trim error (correctable) - uint16_t CMED : 1; //C-ADC multiple trim error (uncorrectable) - uint16_t CED : 1; //C-ADC single trim error (correctable) - uint16_t VD_UV : 1; //3V digital supply undervoltage - uint16_t VD_OV : 1; //3V digital supply overvoltage - uint16_t VA_UV : 1; //5V analog supply undervoltage - uint16_t VA_OV : 1; //5V analog supply overvoltage - uint16_t OSCCHK : 1; //Oscillator check - uint16_t TMODCHK : 1; //Test mode check - uint16_t THSD : 1; //Thermal shutdown - uint16_t SLEEP : 1; //Sleep mode previously entered - uint16_t SPIFLT : 1; //SPI fault - uint16_t COMPARE : 1; //Comparasion between S- and C-ADC active - uint16_t VDE : 1; //Supply voltage error - uint16_t VDEL : 1; //Latent supply voltage error -}; - -typedef struct { - int16_t cellVoltages[MAXIMUM_CELL_VOLTAGES]; - int16_t auxVoltages[MAXIMUM_AUX_VOLTAGES]; - - struct ADBMS6830_Internal_Status status; - uint16_t internalDieTemp; - uint16_t analogSupplyVoltage; - uint16_t digitalSupplyVoltage; - uint16_t sumOfCellMeasurements; - uint16_t refVoltage; - - uint16_t GPIO_Values[MAXIMUM_GPIO]; - - uint32_t overVoltage; - uint32_t underVoltage; - -} Cell_Module; - HAL_StatusTypeDef amsReset(); HAL_StatusTypeDef initAMS(SPI_HandleTypeDef* hspi); diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h new file mode 100755 index 0000000..d306548 --- /dev/null +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h @@ -0,0 +1,86 @@ +#ifndef ADBMS_DRIVER_H +#define ADBMS_DRIVER_H + +#include + +#define ERROR_TIME_THRESH 150 // ms + +typedef enum { + SEK_OVERTEMP, + SEK_UNDERTEMP, + SEK_OVERVOLT, + SEK_UNDERVOLT, + SEK_TOO_FEW_TEMPS, + SEK_OPENWIRE, + SEK_EEPROM_ERR, + SEK_INTERNAL_BMS_TIMEOUT, + SEK_INTERNAL_BMS_CHECKSUM_FAIL, + SEK_INTERNAL_BMS_OVERTEMP, + SEK_INTERNAL_BMS_FAULT, + SEK_1WIRE_ERR, + SEK_DS18B20_TIMEOUT, + NUM_ERROR_KINDS +} SlaveErrorKind; + +typedef struct { + uint8_t data[4]; + uint32_t errors_since; +} SlaveErrorData; + +struct ADBMS6830_Internal_Status { + uint16_t CS_FLT : 16; //ADC fault - mismatch between S- and C-ADC + uint16_t : 3; + uint16_t CCTS : 13; //Conversion counter + uint16_t SMED : 1; //S-ADC multiple trim error (uncorrectable) + uint16_t SED : 1; //S-ADC single trim error (correctable) + uint16_t CMED : 1; //C-ADC multiple trim error (uncorrectable) + uint16_t CED : 1; //C-ADC single trim error (correctable) + uint16_t VD_UV : 1; //3V digital supply undervoltage + uint16_t VD_OV : 1; //3V digital supply overvoltage + uint16_t VA_UV : 1; //5V analog supply undervoltage + uint16_t VA_OV : 1; //5V analog supply overvoltage + uint16_t OSCCHK : 1; //Oscillator check + uint16_t TMODCHK : 1; //Test mode check + uint16_t THSD : 1; //Thermal shutdown + uint16_t SLEEP : 1; //Sleep mode previously entered + uint16_t SPIFLT : 1; //SPI fault + uint16_t COMPARE : 1; //Comparasion between S- and C-ADC active + uint16_t VDE : 1; //Supply voltage error + uint16_t VDEL : 1; //Latent supply voltage error +}; + +#define MAXIMUM_CELL_VOLTAGES 16 +#define MAXIMUM_AUX_VOLTAGES 10 +#define MAXIMUM_GPIO 10 + +typedef struct { + int16_t cellVoltages[MAXIMUM_CELL_VOLTAGES]; + int16_t auxVoltages[MAXIMUM_AUX_VOLTAGES]; + + struct ADBMS6830_Internal_Status status; + uint16_t internalDieTemp; + uint16_t analogSupplyVoltage; + uint16_t digitalSupplyVoltage; + uint16_t sumOfCellMeasurements; + uint16_t refVoltage; + + uint16_t GPIO_Values[MAXIMUM_GPIO]; + + uint32_t overVoltage; + uint32_t underVoltage; + +} Cell_Module; + +extern uint32_t error_sources; // Bitfield of error sources +extern SlaveErrorData error_data[NUM_ERROR_KINDS]; + +[[gnu::nonnull]] +void AMS_Init(SPI_HandleTypeDef* hspi); + +uint8_t AMS_Idle_Loop(); + +#undef MAXIMUM_CELL_VOLTAGES +#undef MAXIMUM_AUX_VOLTAGES +#undef MAXIMUM_GPIO + +#endif // ADBMS_DRIVER_H diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Error.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Error.h new file mode 100644 index 0000000..4d2a8d5 --- /dev/null +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Error.h @@ -0,0 +1,18 @@ +// +// Created by kbracher on 2/6/25. +// + +#ifndef AMS_MASTER_CODE_ADBMS_ERROR_H +#define AMS_MASTER_CODE_ADBMS_ERROR_H + +#include "ADBMS_Driver.h" +#include + +static_assert(sizeof(error_sources) * CHAR_BIT >= NUM_ERROR_KINDS, + "error_sources is too small to hold all error sources"); + +void set_error_source(SlaveErrorKind source); +void clear_error_source(SlaveErrorKind source); + + +#endif //AMS_MASTER_CODE_ADBMS_ERROR_H diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/AMS_HighLevel.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_HighLevel.h similarity index 90% rename from AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/AMS_HighLevel.h rename to AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_HighLevel.h index f7f41cf..2222503 100755 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/AMS_HighLevel.h +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_HighLevel.h @@ -32,8 +32,4 @@ extern bool BalancingActive; extern uint8_t numberofCells; -void AMS_Init(SPI_HandleTypeDef* hspi); - -uint8_t AMS_Idle_Loop(); - #endif /* INC_AMS_HIGHLEVEL_H_ */ diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/errors.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/errors.h deleted file mode 100755 index b604604..0000000 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/errors.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef INC_ERRORS_H -#define INC_ERRORS_H - -#include -#include -#include - -#define ERROR_TIME_THRESH 150 // ms - -typedef enum { - SEK_OVERTEMP, - SEK_UNDERTEMP, - SEK_OVERVOLT, - SEK_UNDERVOLT, - SEK_TOO_FEW_TEMPS, - SEK_OPENWIRE, - SEK_EEPROM_ERR, - SEK_INTERNAL_BMS_TIMEOUT, - SEK_INTERNAL_BMS_CHECKSUM_FAIL, - SEK_INTERNAL_BMS_OVERTEMP, - SEK_INTERNAL_BMS_FAULT, - SEK_1WIRE_ERR, - SEK_DS18B20_TIMEOUT, - NUM_ERROR_KINDS -} SlaveErrorKind; - -typedef struct { - uint8_t data[4]; - uint32_t errors_since; -} SlaveErrorData; - -extern uint32_t error_sources; // Bitfield of error sources -extern SlaveErrorData error_data[NUM_ERROR_KINDS]; - -static_assert(sizeof(error_sources) * CHAR_BIT >= NUM_ERROR_KINDS, - "error_sources is too small to hold all error sources"); - -void set_error_source(SlaveErrorKind source); -void clear_error_source(SlaveErrorKind source); - -#endif // INC_ERRORS_H diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c index fd844c8..cb31a96 100755 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c @@ -390,6 +390,7 @@ HAL_StatusTypeDef amsSendI2C(const uint8_t addresses[static N_BMS], uint8_t * da return HAL_OK; } +//Each selected BMS must have a corresponding address, and the data array for that BMS must be at least datalens[i] bytes long HAL_StatusTypeDef amsReadI2C(const uint8_t addresses[static N_BMS], uint8_t * data[static N_BMS], const uint8_t datalens[static N_BMS], uint32_t bms_mask) { uint8_t buffer[CMD_BUFFER_SIZE(COMM_GROUP_SIZE)] = {}; diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/errors.c b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Error.c similarity index 94% rename from AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/errors.c rename to AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Error.c index 1767191..6b94b28 100755 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/errors.c +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Error.c @@ -1,4 +1,4 @@ -#include "errors.h" +#include "ADBMS_Error.h" #include "stm32h7xx_hal.h" SlaveErrorData error_data[NUM_ERROR_KINDS] = {}; diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/AMS_HighLevel.c b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c similarity index 98% rename from AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/AMS_HighLevel.c rename to AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c index 3099684..4e34f6d 100755 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/AMS_HighLevel.c +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c @@ -5,11 +5,11 @@ * Author: max */ -#include "AMS_HighLevel.h" +#include "ADBMS_HighLevel.h" #include "ADBMS_Abstraction.h" #include "ADBMS_LL_Driver.h" #include "config_ADBMS6830.h" -#include "errors.h" +#include "ADBMS_Driver.h" #include "stm32h7xx_hal.h" #include "swo_log.h" #include diff --git a/AMS_Master_Code/Core/Src/slave_monitoring.c b/AMS_Master_Code/Core/Src/slave_monitoring.c index 7263001..1414c27 100644 --- a/AMS_Master_Code/Core/Src/slave_monitoring.c +++ b/AMS_Master_Code/Core/Src/slave_monitoring.c @@ -1,6 +1,6 @@ #include "slave_monitoring.h" -#include "AMS_HighLevel.h" +#include "ADBMS_Driver.h" #include "can.h" #include "main.h" #include "ts_state_machine.h"