SPI slave on STM32U535
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
2025-04-02 3:56 AM
Hi,
I'm trying to implement SPI slave on STM32U535 ( I have also NUCLEO-U575I).
I need the SPI slave to have 4 bytes communication, 1st byte is a command byte, that has 2 options of command, the next 3 bytes the slave sends the content of one of 2 arrays (depends on the command byte). It uses hardware NSS.
No matter what I've tried, I have issues. Tried to implement it with inteupt, using LL libary for faster procceing the comand byte. I've set the FIFOThreshold to 1.
And still, at the output I recive the data delayed by 4 sends. I assume the TxFIFO is getting full first, and onlt then starting to send, with a delay, anyone can suggest how to overcome it and what am I missing. I'm attaching relevant code of the last configuration, but I've ttreied many others too.
Init:
static void MX_SPI2_Init(void)
{
/* USER CODE BEGIN SPI2_Init 0 */
/* USER CODE END SPI2_Init 0 */
LL_SPI_InitTypeDef SPI_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Initializes the peripherals clock
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SPI2;
PeriphClkInit.Spi2ClockSelection = RCC_SPI2CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
/**SPI2 GPIO Configuration
PB9 ------> SPI2_NSS
PA9 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_3;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_14|LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* SPI2 interrupt Init */
NVIC_SetPriority(SPI2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
NVIC_EnableIRQ(SPI2_IRQn);
/* USER CODE BEGIN SPI2_Init 1 */
/* USER CODE END SPI2_Init 1 */
/* SPI2 parameter configuration*/
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
SPI_InitStruct.Mode = LL_SPI_MODE_SLAVE;
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;
SPI_InitStruct.NSS = LL_SPI_NSS_HARD_INPUT;
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
SPI_InitStruct.CRCPoly = 0x7;
LL_SPI_Init(SPI2, &SPI_InitStruct);
LL_SPI_SetStandard(SPI2, LL_SPI_PROTOCOL_MOTOROLA);
LL_SPI_DisableNSSPulseMgt(SPI2);
/* USER CODE BEGIN SPI2_Init 2 */
/* USER CODE END SPI2_Init 2 */
}
in main:
LL_SPI_EnableIT_RXP(SPI2);
LL_SPI_EnableIT_TXP(SPI2);
LL_SPI_EnableIT_OVR(SPI2);
LL_SPI_SetTransferSize(SPI2, 0);
LL_SPI_SetFIFOThreshold(SPI2, LL_SPI_FIFO_TH_01DATA);
LL_SPI_TransmitData8(SPI2,0x00);
LL_SPI_Enable(SPI2);
Interupt:
*/
void SPI2_IRQHandler(void)
{
/* USER CODE BEGIN SPI2_IRQn 0 */
if (LL_SPI_IsActiveFlag_RXP(SPI2))
{
received_byte = LL_SPI_ReceiveData8(SPI2);
rxind++;
if (rxind==4){
rxind=0;}
if (rxind == 1){
coman=(received_byte & 0xC0) >>6;
}
}
if (LL_SPI_IsActiveFlag_OVR(SPI2))
{
SPI_FlushRxFifo_Fast(SPI2);
LL_SPI_ClearFlag_OVR(SPI2);
}
if (LL_SPI_IsActiveFlag_TXP(SPI2))
{
if (coman==2){
// print_hex(spi_tx_data[txind]);
LL_SPI_TransmitData8(SPI2, spi_tx_data[txind++]); }
else if (coman==3){
LL_SPI_TransmitData8(SPI2, spi_tx_temp[txind++]);
}
else
LL_SPI_TransmitData8(SPI2,0x00);
if (txind==3) {txind=0; coman=8;}
}
if (LL_SPI_IsActiveFlag_UDR(SPI2))
{
LL_SPI_TransmitData8(SPI2, 0x00);
LL_SPI_ClearFlag_UDR(SPI2);
}
/* USER CODE END SPI2_IRQn 0 */
/* USER CODE BEGIN SPI2_IRQn 1 */
/* USER CODE END SPI2_IRQn 1 */
}
Thanks if anyone can help, or suggest how to implement what I need.
- Labels:
-
SPI
-
STM32U5 series
