Stm32 SPI无法读取前6个字节

Stm32 SPI无法读取前6个字节,stm32,spi,Stm32,Spi,我的STM32F051 MCU上的SPI模块有很多问题。我已经将它配置为一个主驱动器来驱动一个从闪存模块(这并不重要) 我试图从内存中读取8个字节,这就是“读取数据”消息的结构: 发送消息的前4个字节,然后接收8个字节。 第一个字节是“读取数据”操作码,下面三个字节是数据地址,在本例中等于0 代码: 信号(黄色-时钟,红色-味噌): 以488比特/秒的速度传输4个字节需要4*1E3/(488/8)=65.5毫秒。然后开始接收。内存立即开始传输[0xFF…0xFF],但“in”缓冲区的内容是:

我的STM32F051 MCU上的SPI模块有很多问题。我已经将它配置为一个主驱动器来驱动一个从闪存模块(这并不重要)

我试图从内存中读取8个字节,这就是“读取数据”消息的结构:

发送消息的前4个字节,然后接收8个字节。 第一个字节是“读取数据”操作码,下面三个字节是数据地址,在本例中等于0

代码:

信号(黄色-时钟,红色-味噌):

以488比特/秒的速度传输4个字节需要4*1E3/(488/8)=65.5毫秒。然后开始接收。内存立即开始传输[0xFF…0xFF],但“in”缓冲区的内容是:

[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
所以前六个字节的数据丢失了。我是唯一一个在STM的SPI模块上遇到如此困难的人吗

编辑:

我给自己买了一个不同的评估板,它有一个稍微不同的MCU(STM32F030),它变得更奇怪:

[0x02 0x02 0x02 0x02] 
0x00 0x02 0x00 0x00 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00...0x00
虽然我必须提到,我正在使用一个不同的编译器与这个MCU

编辑2:

我让它部分工作的方式是使用16位模式和SPI。这修复了这个特定的bug,但是STM32的SPI有更多类似的奇怪之处

编辑3:

SPI初始化代码:

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);

}

您确定SPI的初始化是正确的吗? 可能主设备和从设备之间的时钟极性或相位设置不匹配? 带一只手表去看

请显示您的SPI初始化代码

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);

}