2025-12-28 4:16 PM
i have a problem that has bugged me for a while now. Im using a stm32f4 microcontoler to read data from stpm34 microchip, but i can not establish a spi connection betwen them. With my logic analyzer i can see that i send mosi, the clock works and i believe the enable , chipselect and syn all work as they should. But on miso i get 0xffffffff or 0x808080 or 0xffcffeff... changing randomly. I dont know what is causing the problem. Im designing my own pcb but for now im powering the chip via arduino, and i am using stm32f4 discovery(arduino, becase the discovery has only 3v) gnd connected ofcoirse.Is it soldered wrong? Are the pads on the bottom not connected? Is the code not ok?.... any help will be welcomed and thank you in advance.
Code: /* USER CODE BEGIN Header */
/**
@file : main.c
@brief : Main program body
@attention
STM32F4 + STPM34 SPI FIXED VERSION
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;
/* USER CODE BEGIN PV */
#define STPM_EN_PORT GPIOA
#define STPM_EN_PIN GPIO_PIN_2
#define STPM_CS_PORT GPIOA
#define STPM_CS_PIN GPIO_PIN_3
#define STPM_SYN_PORT GPIOA
#define STPM_SYN_PIN GPIO_PIN_4
uint32_t device_id;
/* ===================== LOW LEVEL ===================== */
static void STPM_Delay(uint32_t ms)
{
HAL_Delay(ms);
}
static void STPM_CS_LOW(void)
{
HAL_GPIO_WritePin(STPM_CS_PORT, STPM_CS_PIN, GPIO_PIN_RESET);
}
static void STPM_CS_HIGH(void)
{
HAL_GPIO_WritePin(STPM_CS_PORT, STPM_CS_PIN, GPIO_PIN_SET);
}
/* ===================== STPM34 RESET ===================== */
void STPM34_ResetSequence(void)
{
/* SYN must be LOW BEFORE EN */
HAL_GPIO_WritePin(STPM_SYN_PORT, STPM_SYN_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(STPM_EN_PORT, STPM_EN_PIN, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(STPM_EN_PORT, STPM_EN_PIN, GPIO_PIN_SET);
HAL_Delay(50);
}
/* ===================== STPM34 SPI READ ===================== */
uint32_t STPM34_ReadRegister(uint8_t reg)
{
uint8_t tx[4];
uint8_t rx[4];
tx[0] = 0x80 | (reg & 0x3F); // READ + address
tx[1] = 0xFF; // dummy
tx[2] = 0xFF; // dummy
tx[3] = 0xFF; // dummy
STPM_CS_LOW();
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 4, HAL_MAX_DELAY);
STPM_CS_HIGH();
return ((uint32_t)rx[1] << 16) |
((uint32_t)rx[2] << 8) | ((uint32_t)rx[3]);
}
uint32_t STPM34_ReadRegister_Valid(uint8_t reg)
{
STPM34_ReadRegister(reg);
return STPM34_ReadRegister(reg);
}
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
/* ===================== MAIN ===================== */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
STPM34_ResetSequence();
/* ===== SPI MOSI VISIBILITY TEST ===== */
uint8_t test = 0xAA;
while (1)
{
device_id = STPM34_ReadRegister_Valid(0x00);
HAL_Delay(1000);
}
}
/* ===================== CLOCK ===================== */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV4;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
/* ===================== SPI1 ===================== */
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
/* STPM34 requires SPI MODE 1 */
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
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;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
/* ===================== GPIO ===================== */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
/* === SPI1 pins: PA5=SCK, PA6=MISO, PA7=MOSI === */
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* === Control pins: EN, CS, SYN === */
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3 | 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);
/* Default states */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // EN
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); // CS
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // SYN LOW
}
/* ===================== ERROR ===================== */
void Error_Handler(void)
{
__disable_irq();
while (1) {}
2025-12-28 5:39 PM
If CLK, MOSI, CS are correct, then the STM32 is doing its job and the problem is on the other side. Perhaps you are not using the right pin, perhaps it is miswired, perhaps slave is not powered.