Skip to main content
HAlzo
Associate III
June 27, 2019
Solved

How To Enable SPI Pulsed mode?

  • June 27, 2019
  • 2 replies
  • 1752 views

Hi,

I am reading a burst of data 3072 half words from slave SPI device.

The Slave device requires NSS to be released after each half word transmission.

When I loop on HAL_SPI_TransmitReceive() function with size =1 for 3072 times it's OK.

but when I try to do it in one shoot using Size() with size = 3072 , the NSS is set low for the whole 3072.

the same happens when I try to use DMA "SPI NSS is low during the whole time of the 3072 half words".

I set NSSPMode = SPI_NSS_PULSE_ENABLE;

Here's my SPI Initialization tag.

hspi4.Instance = SPI4;
 hspi4.Init.Mode = SPI_MODE_MASTER;
 hspi4.Init.Direction = SPI_DIRECTION_2LINES;
 hspi4.Init.DataSize = SPI_DATASIZE_16BIT;
 hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
 hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
 hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;
 hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
 hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
 hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
 hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 hspi4.Init.CRCPolynomial = 0x0;
 hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
 hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
 hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
 hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
 hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
 hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
 hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
 hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
 hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
 hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;
 if (HAL_SPI_Init(&hspi4) != HAL_OK)
 {
 Error_Handler();
 }

How can I generate pulse on NSS after each half word if I am reading the whole data in one shot or using DMA?

In the next picture NSS in Yellow and SCK in green, this is the required pattern, I get it when sending data one by one

0690X000009XfJLQA0.png

and in the next picture 1st half word is sent in one command and after that I start DMA,

you can see that NSS is kept low during the whole data transmission

0690X000009XfLHQA0.png

Best Regards

Hossam Alzomor

This topic has been closed for replies.
Best answer by HAlzo

thanks @Community member​ 

it was the MIDI, I should use a value greater than 1

Here's the working configurations

 hspi4.Instance = SPI4;
 hspi4.Init.Mode = SPI_MODE_MASTER;
 hspi4.Init.Direction = SPI_DIRECTION_2LINES;
 hspi4.Init.DataSize = SPI_DATASIZE_16BIT;
 hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
 hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
 hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;
 hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
 hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
 hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
 hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 hspi4.Init.CRCPolynomial = 0x0;
 hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
 hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
 hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
 hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
 hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
 hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
 hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_02CYCLE;
 hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
 hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
 hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;

0690X000009Xgs2QAC.png

Hossam Alzomor

2 replies

waclawek.jan
Super User
June 27, 2019

Set nonzero SPI_CFG2.MIDI, read Slave select (SS) pin management subchapter of the SPI chapter in RM.

JW

HAlzo
HAlzoAuthorBest answer
Associate III
June 28, 2019

thanks @Community member​ 

it was the MIDI, I should use a value greater than 1

Here's the working configurations

 hspi4.Instance = SPI4;
 hspi4.Init.Mode = SPI_MODE_MASTER;
 hspi4.Init.Direction = SPI_DIRECTION_2LINES;
 hspi4.Init.DataSize = SPI_DATASIZE_16BIT;
 hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
 hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
 hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;
 hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
 hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
 hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
 hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 hspi4.Init.CRCPolynomial = 0x0;
 hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
 hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
 hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
 hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
 hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
 hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
 hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_02CYCLE;
 hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
 hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
 hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;

0690X000009Xgs2QAC.png

Hossam Alzomor