1
votes

I'm having a lot of issues with SPI module on my STM32F051 MCU. I've got it configured as a master to drive a slave flash memory module (that doesn't really matter).

I'm trying to read 8 bytes from memory, this is how the 'read data' message is structured:

First 4 bytes of the message are transmitted, next 8 are received. First byte is 'read data' opcode, three following are data address and equal 0 in this case.

Code:

memset(out, 0x00, 256);
memset(in, 0x00, 256);
out[0] = OPCODE_READ;
out[1] = 0x00;
out[2] = 0x00;
out[3] = 0x00;
uint32_t len = 4 + size;  // size == 8

spi_select(M25P80);
HAL_SPI_TransmitReceive(&hspi1, out, in, len, TIMEOUT);
delay_ms(BYTE_SPEED_MS * 5); // Needed because ^ finishes before physically 
                             // transmitting the data. Nevermind the 5, it 
                             // was picked experimentally 
spi_deselect(M25P80);

Signal (yellow - clock, red - miso):

enter image description here

At 488 bits/s transmitting 4 bytes takes 4 * 1E3 / (488 / 8) = 65.5 ms. Then the reception starts. Memory starts transmitting [0xFF...0xFF] right away, but contents of the 'in' buffer are:

[0x00 0x00 0x00 0x00] [0x00 0x00 0x00 0x00 0x00] 0xFF 0xFF 0x00...0x00
^ zero because this   ^ should be 0xFF           ^ correct data
  is the part where
  data was being sent
  to the memory

So first six bytes of data are just lost. Am I the only one who's having such a hard time with STM's SPI module?

EDIT:

I've gotten myself a different eval board with a slightly different MCU (STM32F030) and it gets even weirder:

[0x02 0x02 0x02 0x02] 
0x00 0x02 0x00 0x00 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00...0x00

Although I must mention that I'm using a different compiler with this MCU.

EDIT 2:

The way I partially got it to work is using 16-bit mode with SPI. This fixed this particular bug, but there are more similar oddities with STM32's SPI.

EDIT 3:

SPI initialisation code:

void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
  HAL_SPI_Init(&hspi1);

}
1

1 Answers

0
votes

Are you sure that the initialization of SPI is right? Maybe your Clock polarity or phase settings does not match between Master and Slave? Take a watch to ClockSettings.

Please show your SPI-Initialization-Code!