Skip to main content
MNapi
Senior II
Nov 1, 2024 8:25 PM UTC
Solved

HAL_SPI_Transmit, dose it transfer data or address of the data?

what does exactly happen here ?

static void WriteCommand(uint8_t cmd)
{
 HAL_SPI_Transmit(&hspi2, &cmd, sizeof(cmd), HAL_MAX_DELAY);
}

&cmd is address of the variable

I wonder if HAL is actually transferring data at that address ?

This topic has been closed for replies.
mƎALLEm
mƎALLEmBest answer
ST Technical Moderator
Nov 2, 2024 2:07 PM UTC

Hello,

You are transmitting someting from the stack. 

1- &cmd is not the address of the variable but pointing  to something in the stack.

This is the declaration of HAL_SPI_Transmit() in stm32h7xx_hal_spi.c:

 

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

 

2- sizeof(cmd) will be always = 1 as it's a byte.

 

So if you want to send the command with a flexible data input and size, this how to implement it:

 

uint8_t command[2] = {0xAA, 0x55};

static void WriteCommand(uint8_t* cmd, uint16_t cmd_size)
{
 HAL_SPI_Transmit(&hspi2, cmd, cmd_size, HAL_MAX_DELAY);
}

/* call WriteCommand */
WriteCommand(command, sizeof(command));

 

To give better visibility on the answered topics, please click "Best answer" on the reply which solved your issue or answered your question.

2 replies

Tesla DeLorean
Guru
Nov 1, 2024 9:00 PM UTC

It's a pointer to the bytes you want to send. Could be a WORD count if SPI configured in 16-bit mode.

WriteCommand is sending the BYTE value that you pass to the function

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
mƎALLEm
mƎALLEmBest answer
ST Technical Moderator
Nov 2, 2024 2:07 PM UTC

Hello,

You are transmitting someting from the stack. 

1- &cmd is not the address of the variable but pointing  to something in the stack.

This is the declaration of HAL_SPI_Transmit() in stm32h7xx_hal_spi.c:

 

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

 

2- sizeof(cmd) will be always = 1 as it's a byte.

 

So if you want to send the command with a flexible data input and size, this how to implement it:

 

uint8_t command[2] = {0xAA, 0x55};

static void WriteCommand(uint8_t* cmd, uint16_t cmd_size)
{
 HAL_SPI_Transmit(&hspi2, cmd, cmd_size, HAL_MAX_DELAY);
}

/* call WriteCommand */
WriteCommand(command, sizeof(command));

 

To give better visibility on the answered topics, please click "Best answer" on the reply which solved your issue or answered your question.