cancel
Showing results for 
Search instead for 
Did you mean: 

HAL_SPI_Transmit does not transfer 8 bits

pass3master
Associate III

We want to use HAL_SPI_Transmit to send data (master) in 8-bit units.
However, even though we have set SPI_DATASIZE_8BIT, data is sent in 16 bits.

Is there anything incorrect in the code below?

 

uint8_t *spi_txdata;

spi_txdata = (uint8_t *)malloc(2 * sizeof(uint8_t));

spi_txdata[0] = 1;

spi_txdata[1] = 2;

 

/* SPI5_CS High_out */

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET);

 

/* SPI5_CLK En */

__HAL_SPI_ENABLE(&hspi5);

 

/* SPI5_CS Low_out */

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET);

 

/* SPI5_Transmit */

hal_spi_err = HAL_SPI_Transmit(&hspi5, spi_txdata, sizeof(spi_txdata), 1000);

 

/* SPI5_CS High_out */

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET);

 

**************************************************************

static void MX_SPI5_Init(void)

{

/* SPI5 parameter configuration*/

hspi5.Instance = SPI5;

hspi5.Init.Mode = SPI_MODE_MASTER;

hspi5.Init.Direction = SPI_DIRECTION_2LINES;

hspi5.Init.DataSize = SPI_DATASIZE_8BIT;

hspi5.Init.CLKPolarity = SPI_POLARITY_HIGH;

hspi5.Init.CLKPhase = SPI_PHASE_2EDGE;

hspi5.Init.NSS = SPI_NSS_SOFT;

hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;

hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi5.Init.TIMode = SPI_TIMODE_DISABLE;

hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

hspi5.Init.CRCPolynomial = 10;

if (HAL_SPI_Init(&hspi5) != HAL_OK)

{

Error_Handler();

}

}

 

2 REPLIES 2
TDK
Guru

> hal_spi_err = HAL_SPI_Transmit(&hspi5, spi_txdata, sizeof(spi_txdata), 1000);

spi_txdata is a pointer, so sizeof(spi_txdata) = 4. (This is true regardless of whether the pointer is valid, or whatever you put in the malloc call).

If you want to send 2 bytes stored at spi_txdata:

 

hal_spi_err = HAL_SPI_Transmit(&hspi5, spi_txdata, 2, 1000);

 

If you feel a post has answered your question, please click "Accept as Solution".
BarryWhit
Senior III

Is there anything incorrect in the code below?

yes, you should have placed it inside a code block so it would be easier to read.

 

There is no reason to call __HAL_SPI_ENABLE by hand,  HAL_SPI_Transmit does that for you.

 

It 's generally better to avoid malloc in embedded code unless there's an actual need.

 

 

#define TXBUF_BYTELEN (2)
uint8_t spi_txdata[TXBUF_BYTELEN];
spi_txdata[0] = 1;
spi_txdata[1] = 2;

// This works, since spi_txdata is now an array, not a pointer.
// Placing opaque constants behind a define, as done 
// here with TXBUF_BYTELEN is also good practice.
assert(sizeof(spi_txdata) == TXBUF_BYTELEN); 

 

 

- If a post has answered your question, please acknowledge the help you received by clicking "Accept as Solution".
- Once you've solved your issue, please consider posting a summary of any additional details you've learned. Your new knowledge may help others in the future.