【发布时间】:2015-04-19 17:38:35
【问题描述】:
我的 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 毫秒。然后接待开始。内存立即开始传输 [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。这修复了这个特定的错误,但 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);
}
【问题讨论】: