Skip to main content
BMart.2
Associate III
May 22, 2020
Question

Cannot get the SPI pins to toggle.

  • May 22, 2020
  • 13 replies
  • 1828 views

I'm using the project "SPI_FullDuplex_ComPolling_Master" in P-Nucleo-WB55.Nucleo/Examples_MIX/SPI in FW version 1.6.0. Works fine on the nucleo board. I've ported it to my board which uses pins PB5, PB4, and PB3. I'm using a crystal on my board. I did this same exercise with the UART projects and it works fine on the nucleo board as well as my board even though they use different UART pins. I cannot seem to be able to get any activity on the pins, MOSI or CLK, even though the spi instance is set correctly to each boards pins. Is there something I need to do to enable the pins on my board regarding the clocks?

If I just toggle the pins in code they toggle but no activity when transmitting via spi.

Any help would be appreciated.

 MX_SPI1_Init();

 /*##-1- Start the Full Duplex Communication process ########################*/  

 /* Enable SPI before start transmission */

 LL_SPI_Enable(hspi1.Instance);

 /*## Start the transmission process (using HAL Polling mode) #############*/  

 /* In main loop, Tx buffer is sent every 0.5 sec. 

   As soon as RX buffer is detected as full, received bytes are echoed on TX line to PC com port */

 /* USER CODE END 2 */

 while(1)

 {

  /* Check TXE flag to transmit data */

  if(( LL_SPI_IsActiveFlag_TXE(hspi1.Instance)) && (ubNbDataToTransmit > 0))

  {

   /* Transmit 16bit Data */

   LL_SPI_TransmitData16(hspi1.Instance, aaTxBuffer[ubTransmitIndex++]);

   ubNbDataToTransmit--;

  }

  /* Check RXE flag */

  if(LL_SPI_IsActiveFlag_RXNE(hspi1.Instance))

  {

   /* Receive 16bit Data */

   aaRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData16(hspi1.Instance);

   ubNbDataToReceive--;

  }

}

/**

* @brief SPI MSP Initialization

* This function configures the hardware resources used in this example

* @param hspi: SPI handle pointer

* @retval None

*/

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)

{

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 if(hspi->Instance==SPI1)

 {

 /* USER CODE BEGIN SPI1_MspInit 0 */

 /* USER CODE END SPI1_MspInit 0 */

  /* Peripheral clock enable */

  __HAL_RCC_SPI1_CLK_ENABLE();

  

  __HAL_RCC_GPIOB_CLK_ENABLE();

  /**SPI1 GPIO Configuration   

  PB3   ------> SPI1_SCK

  PB4   ------> SPI1_MISO

  PB5   ------> SPI1_MOSI 

  */

  GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_PULLDOWN;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 /* USER CODE BEGIN SPI1_MspInit 1 */

 /* USER CODE END SPI1_MspInit 1 */

 }

}

This topic has been closed for replies.

13 replies

TDK
May 22, 2020

Init seems fine. You don't need to do anything apart from enabling the clock and configuring the pins. Does your code detect the TXE flag and try to transmit data?

"If you feel a post has answered your question, please click ""Accept as Solution""."
BMart.2
BMart.2Author
Associate III
May 22, 2020

if(( LL_SPI_IsActiveFlag_TXE(hspi1.Instance)) && (ubNbDataToTransmit > 0)) so yes. I have no idea what the issue is and have been working on it for a few days.

waclawek.jan
Super User
May 22, 2020

Read out and check/post the relevant GPIO and SPI registers content.

JW

BMart.2
BMart.2Author
Associate III
May 22, 2020

Just before while 1 after spi init

0693W000001pKNfQAM.png

after 1st LL_SPI_TransmitData16 call, breakpoint on ubNbDataToTransmit--.0693W000001pKNkQAM.png

Not real sure how to read/show the relevant GPIO regs.

BMart.2
BMart.2Author
Associate III
May 22, 2020

Just shown portb mode register here which is relevant to the spi being tagged to PB3, PB4, and PB5 I think.

Just after MX_GPIO_Init() not shown but toward the start of main.0693W000001pKPlQAM.png

Just after MX_SPI1_Init().

0693W000001pKPqQAM.png

BMart.2
BMart.2Author
Associate III
May 22, 2020

Could this be the issue? This is from header file stm32wbxx_nucleo.h. Do I need to redefine from GPIO A to GPIO B here and the relevant pins?

0693W000001pKW8QAM.png

waclawek.jan
Super User
May 23, 2020

The binary numbers are extremely hard to read, next time please use hexadecimal.

GPIO_MODER looks good, AF set for PB3, 4, 5; but you did not post the AFR register's content.

SPI registers look good, the fact that RXNE is set after the transmit function makes me believe that the clock is output to physical SCK pin (otherwise the receiver in other STM32 SPIs does not work; I doubt the 'WB is an exception).

Did you observe the pins directly on the package? Isn't there a jumper or solder bridge on the board which you overlooked? See schematics and board manual.

JW

BMart.2
BMart.2Author
Associate III
May 23, 2020
Ok, I took the same CubeMx file and disabled spi1 and made PB3,4,5 outputs so I could toggle them. I added the code shown below

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOB, PB7_Red_Pin);
HAL_GPIO_TogglePin(GPIOB, PB6_Green_Pin);
HAL_GPIO_TogglePin(GPIOD, PD5_Blue_Pin);
HAL_Delay(20);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

And on the test points on the board I measured the following on PB3, 4, and 5. I’ve ohmed each pin to each other plus to ground and surrounding pins and no shorts so I’m confident the hardware is ok.
BMart.2
BMart.2Author
Associate III
May 23, 2020

Ok, I took the same CubeMx file and disabled spi1 and made PB3,4,5 outputs so I could toggle them. I added the code shown below

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

   HAL_GPIO_TogglePin(GPIOB, PB7_Red_Pin);

   HAL_GPIO_TogglePin(GPIOB, PB6_Green_Pin);

   HAL_GPIO_TogglePin(GPIOD, PD5_Blue_Pin);

   HAL_Delay(20);

   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);

   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);

   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);

   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */

 }

 /* USER CODE END 3 */

And on the test points on the board I measured the following on PB3, 4, and 5. I’ve ohmed each pin to each other plus to ground and surrounding pins and no shorts so I’m confident the hardware is ok.

0693W000001pKz5QAE.png

0693W000001pKzAQAU.jpg

waclawek.jan
Super User
May 23, 2020

Well, then if you are sure that GPIOB_AFR contains the expected values for PB3-PB5, then I don't know why you wouldn't see the SCK/MOSI waveforms, sorry.

JW

BMart.2
BMart.2Author
Associate III
May 23, 2020
Ok one last question.

HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000);

works but the LL transmit in the original code does not. Any thoughts as to why that would be?

By the way, I appreciate all your help on this.
TDK
May 23, 2020

Try replacing

LL_SPI_TransmitData16(hspi1.Instance, aaTxBuffer[ubTransmitIndex++]);

with

hspi1.Instance->DR = aaTxBuffer[ubTransmitIndex++];

"If you feel a post has answered your question, please click ""Accept as Solution""."
BMart.2
BMart.2Author
Associate III
May 23, 2020
Nope, that didn’t work. But I found out what the issue was.

When I built the project with CubeMx I compared it to the project in the repository. That project had the BSP directory included which I think was messing up the CubeMx generated setup of the HAL.

I originally had this

Which would not work.

When I removed the file stm32wbxx_nucleo.c from the project like this
It works with LL and hspi1.Instance->DR.

I was trying to get away from the nucleo bsp but to get it running I added the bsp/file to my project thinking I needed it.

Not sure if you work with ST but you’ve been a big help.

Hope you have a great Memorial Day weekend.

Thanks again,

Barry