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