cancel
Showing results for 
Search instead for 
Did you mean: 

ADE9000 COMMUNICATION PROBLEM WITH STM32F401

Caan
Associate III

I have setup a base board of ADE9000 With only Basic Components connected, Like Bypass capacitors, Reset pullups and connected SPI Directly with the STM32F401 Blackpill board , Everything starts-up perfectly.
So I want to check the communication between the MCU and AE9000, So To read the Register value at 0x4FE (Version of ADE9000) I am sending 0x4FE8 (8 Is added so as to set bit 3 High For read Command) But I am only getting 0xfffc and 0xfff8 in random patterns.
SPI for STM32F4 is set to 16 bits with Mode 0 Configuration and I am checking the data using Logic Analyzer which check out that the data sent from the MCU is 0x4FE8 but receiving is 0xfffc and/or 0xfff8

1 ACCEPTED SOLUTION

Accepted Solutions
Andrew Neil
Evangelist III

@Caan wrote:

I have setup a base board of ADE9000 


You mean this: https://www.analog.com/en/products/ade9000.html ?
Is that a custom board you've made yourself, or something from ADI? or 3rd party?

Please post your code & schematics, and logic analyser traces - see:

https://community.st.com/t5/community-guidelines/how-to-write-your-question-to-maximize-your-chances-to-find-a/ta-p/575228

Some good, clear photos of your setup would also help.

 


@Caan wrote:

 I am checking the data using Logic Analyzer which check out that the data sent from the MCU is 0x4FE8 but receiving is 0xfffc and/or 0xfff8


Have you shown ADI the traces? It's their chip, so they'd be best to spot anything that's not right in your comms...

AndrewNeil_0-1719915186121.png

 

EDIT:

Have you tried the Software Driver which ADI provide?

AndrewNeil_0-1719915564756.png

 

It seems there's an Arduino library available:

AndrewNeil_1-1719915747180.png

 

View solution in original post

5 REPLIES 5
Andrew Neil
Evangelist III

@Caan wrote:

I have setup a base board of ADE9000 


You mean this: https://www.analog.com/en/products/ade9000.html ?
Is that a custom board you've made yourself, or something from ADI? or 3rd party?

Please post your code & schematics, and logic analyser traces - see:

https://community.st.com/t5/community-guidelines/how-to-write-your-question-to-maximize-your-chances-to-find-a/ta-p/575228

Some good, clear photos of your setup would also help.

 


@Caan wrote:

 I am checking the data using Logic Analyzer which check out that the data sent from the MCU is 0x4FE8 but receiving is 0xfffc and/or 0xfff8


Have you shown ADI the traces? It's their chip, so they'd be best to spot anything that's not right in your comms...

AndrewNeil_0-1719915186121.png

 

EDIT:

Have you tried the Software Driver which ADI provide?

AndrewNeil_0-1719915564756.png

 

It seems there's an Arduino library available:

AndrewNeil_1-1719915747180.png

 

Caan_1-1719916076598.png

Caan_2-1719916082870.png

 

I have made a custom board for ADE9000

Code

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
  uint8_t txData;
  uint16_t rxData;
  uint16_t LOW=0XB8;
  uint16_t HIGH=0x00B8;
 
SPI_HandleTypeDef hspi1;
 
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
 
int main(void)
{
 
  HAL_Init();
 
  SystemClock_Config();
 
  MX_GPIO_Init();
  MX_SPI1_Init();
 

  while (1)
  {
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

	  //temp_address = (((0x25d << 4) & 0xFFF0) + 8);

	  if (HAL_SPI_TransmitReceive(&hspi1,&HIGH,&rxData, 1, HAL_MAX_DELAY) != HAL_OK)
	      {
	          // Transmission error
	          Error_Handler();
	      }



	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
	  HAL_Delay(100);
  }
}

/**
  * @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_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  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_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != 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_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  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_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA4 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &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 */

 

 

 

Caan
Associate III

Problem Solved.

For the benefit of future readers, it would be helpful if you described what the problem was, how you found it, and how you fixed it.

SPI Configuration that worked

 

 hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  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();
  }

 

SPI Routine to read and Write 16 Bit Registers and 32 Bits Registers.

uint16_t SPI_Read_16(uint16_t address)
{
	 uint16_t temp_address = (((address << 4) & 0xFFF0) + 8);
	 uint16_t data[2];
	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	 HAL_SPI_TransmitReceive(&hspi1,&temp_address,&data,2, HAL_MAX_DELAY);
	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
  //   HAL_Delay(1);
     return data[2];
}

void SPI_Write_16(uint16_t address,uint16_t writedata)
{
	 uint16_t addresswrite = (((address << 4) & 0xFFF0) + 0);

	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	 HAL_SPI_Transmit(&hspi1,&addresswrite,1, HAL_MAX_DELAY);
	 HAL_SPI_Transmit(&hspi1,&writedata,1, HAL_MAX_DELAY);
	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
  //   HAL_Delay(1);
     return writedata;
}


uint32_t SPI_Read32(uint16_t address)
{
	 uint32_t addresswrite32[3] = {(((address << 4) & 0xFFF0) + 8),0x0000,0x0000};
	 uint16_t readdata[3];
	 uint32_t send;
	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	 HAL_SPI_TransmitReceive(&hspi1,&addresswrite32,&readdata,3, HAL_MAX_DELAY);
	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
	 send=(readdata[1]<<16)|readdata[2];
//	 HAL_Delay(1);
     return send;
}


uint32_t SPI_Write_32(uint16_t address,uint16_t writedata)
{
	 uint16_t temp_addresswrite32[3] = {(((address << 4) & 0xFFF0) + 0),0x0000,0x0000};
     uint16_t temp_highpacket;
	 uint16_t temp_lowpacket;

	 temp_highpacket= (writedata & 0xFFFF0000)>>16;
	 temp_lowpacket= (writedata & 0x0000FFFF);

	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	 HAL_SPI_Transmit(&hspi1,&temp_addresswrite32,1, HAL_MAX_DELAY);
	 HAL_SPI_Transmit(&hspi1,&temp_highpacket,1, HAL_MAX_DELAY);
	 HAL_SPI_Transmit(&hspi1,&temp_lowpacket,1, HAL_MAX_DELAY);

	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
//	 HAL_Delay(1);
     return 0;
}


now the ADE9000 is communicating happily.