SPI无法读取前6个字节

时间:2015-02-18 16:17:22

标签: stm32 spi

我的STM32F051 MCU上的SPI模块存在很多问题。我已将其配置为驱动从属闪存模块的主设备(这并不重要)。

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

发送消息的前4个字节,接收8个字节。 第一个字节是'读取数据'操作码,以下三个是数据地址,在这种情况下等于0.

代码:

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

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

enter image description here

以488位/秒发送4个字节需要4 * 1E3 /(488/8)= 65.5 ms。然后接待开始。内存立即开始传输[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:

我部分使用它的方法是使用带有SPI的16位模式。这解决了这个特殊的错误,但是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);

}

1 个答案:

答案 0 :(得分:0)

你确定SPI的初始化是对的吗? 也许您的时钟极性或相位设置在主设备和从设备之间不匹配? 请注意ClockSettings

请出示您的SPI初始化代码!