ams-slave-22/Core/Inc/BQ_Communication.h

83 lines
2.4 KiB
C

#ifndef BQ_COM
#define BQ_COM
#include "BQ_Register_Definitions.h"
#include "stm32f4xx_hal.h"
#define FRM_WRT_NR 0x90
#define FRM_WRT_R 0x81
#define DEFAULTNUMOFCELLS 10
#define DEFAULTNUMOFDIETEMPS 0
#define BQUARTTIMEOUT 200
typedef enum { BQ_COMM_OK, BQ_COMM_ERR_HAL, BQ_COMM_ERR_CRC } BQ_Comm_Status;
/**
* @brief Defines UART and DMA Handle
*
* Always call the init routine before using any other function of the libary.
*/
void init_BQCom(UART_HandleTypeDef* uarthandle);
/**
* @brief Calculate CRC according to BQ spec.
*
* @param message_buffer Message buffer, including two bytes for the CRC. The
* CRC will be written to the last two bytes.
* @param bufferlength The length of message_buffer, including the two bytes for
* the CRC.
*
* @return 0 if the buffer is to small
* @return 1 if the function was successful
*/
uint16_t Calculate_CRC(uint8_t* message_buffer, uint16_t bufferlength);
/**
* @brief Checks if the CRC is correct
*
* @return 0 if the Buffer is too small or the CRC is incorrect
* @return 1 if the CRC is correct
*/
uint16_t Check_CRC(uint8_t* message_buffer, uint16_t bufferlength);
/**
* @brief Writes data to a register of the BQ76.
*
* @param registeraddress specifies the register. Address definitions are
* available in BQ_Register_Definitions.h
* @param registersize defines the register size in bytes.
* @param data defines the data written to the BQ
*/
uint32_t BQ_Write_Register(uint8_t registeraddress, uint8_t registersize,
uint32_t data);
/**
* @brief Read the data of a register specified by its address
*
* @param registeraddress specifies the register. Address definitions are
* available in BQ_Register_Definitions.h
* @param registersize defines the register size in bytes.
*/
uint8_t BQ_Read_Register(uint8_t registeraddress, uint8_t registersize,
uint32_t* data);
/**
* @brief Reads Voltage Measurements from the BQ76
*
* Result are Written into the Buffer
* Buffer size should be 2xMeasured Voltages
*/
BQ_Comm_Status BQ_ReadMeasurements(uint8_t* buffer, uint8_t bufferlength);
/**
* @brief Hardware layer implementation of the UART transmit
*/
uint8_t BQ_UART_Transmit(uint8_t* message_buffer, uint16_t bufferlength);
/**
* @brief Hardware layer implementation of the UART receive
*/
uint8_t BQ_UART_Receive(uint8_t* message_buffer, uint16_t bufferlength);
#endif