STM32F0中SPI的接收部分不工作

STM32F0中SPI的接收部分不工作,stm32,spi,Stm32,Spi,我使用的MCU是STM32F042K6T6。我已将SPI配置为双向模式,以便读取传感器MLX90316。现在,读取功能在等待RXNE信号时被阻塞。如果我理解正确,一旦我将SPI置于rx模式,SCLK将自动生成并启动接收程序。但是RXNE从未设置,RxFIFO中也没有设置。SPI的接收部分似乎根本不工作。即使我将MCU置于全双工模式,当我通过写入SPI1->DR开始数据传输时,数据传输成功,但问题仍然存在 相同的代码在STM32F405RGT6上进行了测试,并且功能正常(如果我不关心数据,因为GP

我使用的MCU是STM32F042K6T6。我已将SPI配置为双向模式,以便读取传感器MLX90316。现在,读取功能在等待RXNE信号时被阻塞。如果我理解正确,一旦我将SPI置于rx模式,SCLK将自动生成并启动接收程序。但是RXNE从未设置,RxFIFO中也没有设置。SPI的接收部分似乎根本不工作。即使我将MCU置于全双工模式,当我通过写入SPI1->DR开始数据传输时,数据传输成功,但问题仍然存在

相同的代码在STM32F405RGT6上进行了测试,并且功能正常(如果我不关心数据,因为GPIO没有配置)。我完全不知道这个奇怪的问题

提前谢谢。:)

初始函数

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* SPI configuration -------------------------------------------------------*/
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; // Initially Tx
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // Clock steady high
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // Data write on rising (second) edge
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
SPI_Cmd(SPI1, ENABLE);
传输功能是:

void spi_send_8bit(uint8_t Data){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //wait buffer empty
SPI_SendData8(SPI1, Data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); //wait finish sending}

uint8_t spi_recv_8bit(void){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) ; // wait data receive
return SPI_ReceiveData8(SPI1);}



static void Read(void){

MLX90316_1_Set(); //Pull down the CS line
SPI_BiDirectionalLineConfig(SPI1, SPI_Direction_Tx);
spi_send_8bit(0xAA);
spi_send_8bit(0xFF);


while (SPI_GetReceptionFIFOStatus(SPI1) != SPI_ReceptionFIFOStatus_Empty)
    SPI_ReceiveData8(SPI1);

SPI_Cmd(SPI1, DISABLE);
SPI_BiDirectionalLineConfig(SPI1, SPI_Direction_Rx);
SPI_Cmd(SPI1, ENABLE);

Data[0] = spi_recv_8bit();
Data[1] = spi_recv_8bit();
Data[2] = spi_recv_8bit();
Data[3] = spi_recv_8bit();
SPI_BiDirectionalLineConfig(SPI1, SPI_Direction_Tx);
spi_send_8bit(0xFF);
spi_send_8bit(0xFF);
spi_send_8bit(0xFF);
spi_send_8bit(0xFF);
MLX90316_1_Cl();}

此功能不起作用:

uint8\u t spi\u recv\u 8bit(无效){
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)=重置);//等待数据接收
返回SPI_ReceiveData8(SPI1);}

您必须将虚拟值写入
DR
寄存器,以触发SPI主模式下的
CLK
脉冲。您可以使用您的
spi_send_8bit()
函数来完成此操作。

虽然这可能是一篇“旧”帖子,但现在我发现它可能对其他人有用,但我在STM32F030和042上的RXNE也有问题

我发现CPU挂在RXNE轮询循环上的单步(IAR IDE):

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
我试过:

while (SPI_GetReceptionFIFOStatus(SYS_SPI) == SPI_ReceptionFIFOStatus_Empty);
同样的结果,接收器没有告诉我们它已经完成

我在下面的一行上放了一个断点,从逻辑上讲,它是不会到达的-它是!!!这可能是SPI外围设备或调试问题。
RXNE的描述还有很多需要改进的地方,它几乎读作“FIFO几乎满了”

我有同样的问题,我通过在SPI1->CR2寄存器中设置第X位来解决它。

我也有同样的问题,即使在指令
SPI2->CR1&=~SPI CR1\u BIDIOE之后,时钟也不会发送出去

我的解决方案:在上述说明之前,将:

SPI2->CR1 |= SPI_CR1_RXONLY;
SPI2->CR1 &= ~SPI_CR1_RXONLY;
这将输出时钟并设置位
SPI\u FLAG\u RXNE

我已经使用内部48MHz时钟。

事实上,我已经尝试过了,发现如果我将4字节的数据写入Tx FIFO并记录SR寄存器,我发现当Tx FIFO的数量减少时,这意味着设备正确发送数据,Rx FIFO的数量永远不会增加,因此RXNE位永远不会设置。我在2个不同的STM32F0中尝试了相同的代码,以消除芯片损坏的可能性。我想我可能错过了什么…所以我终于知道发生了什么。它与碾压混凝土有关。STM32F0中有两个RC振荡器,一个是8Mhz,另一个是48Mhz。如果我选择8MHz RC振荡器,并使用PLL拥有48Mhz时钟,则会出现此问题。但如果我直接使用48Mhz振荡器作为主时钟,SPI将正常工作。