2023-05-01 03:13 AM
Hello!
I'm trying to run SPI in Transmit Only Master mode.
It's strange - result of HAL_SPI_Transmit is HAL_OK but I can't see any signals on SCK and MOSI pins.
main.c
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 */
/* 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_SPI3_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint8_t dacRegisterAddress = 0xAA;
uint8_t dacRegisterData = 0xAA;
uint8_t sendData[2] = {dacRegisterAddress, dacRegisterData};
HAL_GPIO_WritePin(GPIOB, STATUS_LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
while (HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY);
if (HAL_SPI_Transmit(&hspi3, &sendData[0], 2, 1000) != HAL_OK)
{
HAL_GPIO_WritePin(GPIOA, ERROR_LED_Pin, GPIO_PIN_RESET);
}
HAL_GPIO_WritePin(GPIOB, STATUS_LED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
HAL_Delay(200);
/* 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};
/** 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_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
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_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief SPI3 Initialization Function
* @param None
* @retval None
*/
static void MX_SPI3_Init(void)
{
/* USER CODE BEGIN SPI3_Init 0 */
/* USER CODE END SPI3_Init 0 */
/* USER CODE BEGIN SPI3_Init 1 */
/* USER CODE END SPI3_Init 1 */
/* SPI3 parameter configuration*/
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI3_Init 2 */
/* USER CODE END SPI3_Init 2 */
}
HAL_SPI_MspInit in stm32f1xx_hal_msp.c
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hspi->Instance==SPI3)
{
/* USER CODE BEGIN SPI3_MspInit 0 */
/* USER CODE END SPI3_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI3 GPIO Configuration
PB3 ------> SPI3_SCK
PB5 ------> SPI3_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN SPI3_MspInit 1 */
/* USER CODE END SPI3_MspInit 1 */
}
}
I've checked this with many official and users examples. I can't find mistake. I checked this on STM32F0 too and behaviour is the same.
I updated CubeIDE - no result.
What I'm doing wrong?
Solved! Go to Solution.
2023-05-01 05:31 AM
This looks all OK.
Try to set given pins as GPIO outputs and toggle them in a simple loop, while observing the output on the pins.
JW
2023-05-01 03:16 AM
Which 'F1 exactly? And which 'F0 exactly?
Read out and check/post content of SPI and relevant GPIO/AFIO registers.
JW
2023-05-01 03:40 AM - edited 2023-11-20 06:45 AM
Thank you for reply
STM32 model is STM32F103RCT6
Registers before init:
Registers after SPI init:
Registers after transmit:
Is it correct?
2023-05-01 05:31 AM
This looks all OK.
Try to set given pins as GPIO outputs and toggle them in a simple loop, while observing the output on the pins.
JW
2023-05-01 06:31 AM
Good idea! I tried this:
SPI3 MISO (PB5) - toggle ok
SPI3 SCK (PB3) - no reaction
SCK is also SYS_JTDO so I add to HAL_MspInit:
__HAL_AFIO_REMAP_SWJ_NOJTAG();
After that SCK toggle too. When I turn on SPI I don't have any signal again :\
I fund in F1 HAL documentation "__HAL_AFIO_REMAP_SPI3_DISABLE" but it isn't available in my MCU.
Should I use more configuration to run SPI3?
2023-05-01 09:43 AM - edited 2023-11-20 06:45 AM
you did...prior configure spi3 ?
2023-05-01 10:41 AM - edited 2023-11-20 06:45 AM
I disabled JTAG in HAL_MspInit function, so before SPI init, but...
I aslo want to use PB4 as GPIO so I added "__HAL_AFIO_REMAP_SWJ_NONJTRST();" too.
Then I have value 0x060 in SWJ_CFG register.
I find table in RM0008 where is no 011 value. So I use only "__HAL_AFIO_REMAP_SWJ_NOJTAG();" and now SPI is working.
Thank you AScha.3 and waclawek.jan for help! :)