Post Go back to editing

ADBMS6830 SPI Communication

Category: Hardware
Product Number: ADBMS6830

Hi,

I am trying to communicate using SPI with the EVAL BOARD of ADBMS6830 utilizing a NUCLEO-F401RE as the Main and the EVAL BOARD of ADBMS6822. I have connected 16 1kΩ resistors between each cpin and supplied the board with 15V (Also tried 25V but it did not make a difference). Then using the cable provided i have connected the isoSPI A port of the ADBMS6830 Eval Board with the MAIN port of the ADBMS6822 Eval Board. I have checked my hardware connections multiple times and they seem to be correct. What i am trying to do is send a simple ADC command to the ADBMS6830 in order to measure the "cell voltage", but the chip does not seem to be responding to any commands that i send (I just receive 0xFF).

Please provide any information on how to resolve the issue.

IMPORTANT NOTE!!: When using PLADC the code gets stuck on the while loop because the chip is still not responsive, i have tried without the PLADC and i still cannot communicate

Code used:

#include "main.h"

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

// CSB Control

#define SP1_CS_HIGH() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET)

#define SP1_CS_LOW() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET)

#define WAKEUP_TIME 2

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

SPI_HandleTypeDef hspi1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_SPI1_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

uint8_t data_Rx[12]={0};

uint8_t debug=0;

HAL_StatusTypeDef SPI_STATUS=HAL_OK;

uint16_t pec15Table[256];

uint16_t CRC15_POLY = 0x4599;

void init_PEC15_Table()

{

uint16_t remainder;

for (int i = 0; i < 256; i++)

{

remainder = i << 7;

for (int bit = 8; bit > 0; --bit)

{

if (remainder & 0x4000)

{

remainder = ((remainder << 1));

remainder = (remainder ^ CRC15_POLY);

}

else

remainder = ((remainder << 1));

}

pec15Table[i] = remainder & 0xFFFF;

}

}

uint16_t pec15(const uint8_t *data , const uint8_t len)

{

uint16_t remainder,address;

remainder = 16; //PEC seed

for (uint8_t i = 0; i < len; i++){

address = ((remainder >> 7) ^ data[i]) & 0xFF; // calculate PEC table address

remainder = (remainder << 8 ) ^ pec15Table[address];

}

return (remainder * 2); // The CRC15 has a 0 in the LSB so the final value must be multiplied by 2

}

void ADBMS6830_WAKEUP(){

SP1_CS_LOW();

HAL_Delay(WAKEUP_TIME);

SP1_CS_HIGH();

HAL_Delay(WAKEUP_TIME);

}

void ADBMS6830_COMMAND(uint16_t command){

uint8_t cmd0 = command >> 8;

uint8_t cmd1 = command;

uint8_t cmd[2]={cmd0,cmd1};

uint16_t cmd_pec = pec15(cmd, 2);

uint8_t cmd_pec0 = cmd_pec >> 8;

uint8_t cmd_pec1 = cmd_pec;

uint8_t data_Tx[4]={cmd0, cmd1, cmd_pec0, cmd_pec1};

SP1_CS_LOW();

HAL_Delay(10);

HAL_SPI_Transmit(&hspi1, data_Tx, sizeof(data_Tx), HAL_TIMEOUT);

SP1_CS_HIGH();

}

void ADBMS6830_PLADC(){

uint8_t received = 0x00;

uint16_t PLADC=0x0718;

uint8_t cmd0 = PLADC >> 8;

uint8_t cmd1 = PLADC;

uint8_t cmd[2]={cmd0,cmd1};

uint16_t cmd_pec = pec15(cmd, 2);

uint8_t cmd_pec0 = cmd_pec >> 8;

uint8_t cmd_pec1 = cmd_pec;

uint8_t data_Tx[4]={cmd0, cmd1, cmd_pec0, cmd_pec1};

SP1_CS_LOW();

HAL_Delay(10);

HAL_SPI_Transmit(&hspi1,data_Tx,sizeof(data_Tx),HAL_TIMEOUT);

HAL_Delay(10);

do{

HAL_SPI_Receive(&hspi1,&received,1,HAL_TIMEOUT);

}while(!(received == 0x00));

SP1_CS_HIGH();

}

void ADBMS6830_ADC_DEFAULT(){

uint16_t ADCV_DEFAULT=0x0260; //This is the default command in HEX all user-configurable bits are set to 0

ADBMS6830_COMMAND(ADCV_DEFAULT);

}

void ADBMS6830_CELL_MEASSURE(){

ADBMS6830_WAKEUP();

ADBMS6830_ADC_DEFAULT();

ADBMS6830_PLADC();

}

void ADBMS6830_READ_DATA(uint16_t command,uint8_t* data_recieved){

uint8_t cmd0 = command >> 8;

uint8_t cmd1 = command;

uint8_t cmd[2]={cmd0,cmd1};

uint16_t cmd_pec = pec15(cmd, 2);

uint8_t cmd_pec0 = cmd_pec >> 8;

uint8_t cmd_pec1 = cmd_pec;

uint8_t data_Tx[12]={0};

data_Tx[0] = cmd0;

data_Tx[1] = cmd1;

data_Tx[2] = cmd_pec0;

data_Tx[3] = cmd_pec1;

SP1_CS_LOW();

HAL_Delay(10);

HAL_SPI_TransmitReceive(&hspi1, data_Tx, data_recieved, sizeof(data_Tx), HAL_TIMEOUT);

SP1_CS_HIGH();

}

void ADBMS6830_CELL_READ(uint8_t *data_Rx){

uint16_t RDCVA=0x0004;

ADBMS6830_WAKEUP();

ADBMS6830_READ_DATA(RDCVA, data_Rx);

}

/* USER CODE END 0 */

/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

init_PEC15_Table();

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_SPI1_Init();

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1){

ADBMS6830_CELL_MEASSURE();

ADBMS6830_CELL_READ(data_Rx);

HAL_Delay(400);

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the main internal regulator output voltage

*/

__HAL_RCC_PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

/** Initializes the CPU, AHB and APB buses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

{

Error_Handler();

}

}

/**

* @brief SPI1 Initialization Function

* @param None

* @retval None

*/

static void MX_SPI1_Init(void)

{

/* USER CODE BEGIN SPI1_Init 0 */

/* USER CODE END SPI1_Init 0 */

/* USER CODE BEGIN SPI1_Init 1 */

/* USER CODE END SPI1_Init 1 */

/* SPI1 parameter configuration*/

hspi1.Instance = SPI1;

hspi1.Init.Mode = SPI_MODE_MASTER;

hspi1.Init.Direction = SPI_DIRECTION_2LINES;

hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

hspi1.Init.NSS = SPI_NSS_SOFT;

hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

hspi1.Init.CRCPolynomial = 10;

if (HAL_SPI_Init(&hspi1) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN SPI1_Init 2 */

/* USER CODE END SPI1_Init 2 */

}

/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* USER CODE BEGIN MX_GPIO_Init_1 */

/* USER CODE END MX_GPIO_Init_1 */

/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(SP1_CSB_GPIO_Port, SP1_CSB_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin : SP1_CSB_Pin */

GPIO_InitStruct.Pin = SP1_CSB_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(SP1_CSB_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */

/* USER CODE END MX_GPIO_Init_2 */

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

__disable_irq();

while (1)

{

}

/* USER CODE END Error_Handler_Debug */

}

#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */