我的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);
信号(黄色 - 时钟,红色 - 味噌):
以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);
}