首页 文章

STM32F0中SPI的接收部分不工作

提问于
浏览
2

我使用的MCU是STM32F042K6T6 . 我已将SPI配置为双向模式,以便读取传感器MLX90316 . 现在,在等待RXNE信号时阻止读取功能 . 如果我理解正确,一旦我将SPI置于rx模式,SCLK就会自动生成并开始接收程序 . 但RXEC从未在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();}

4 回答

  • 1

    此功能不起作用:

    uint8_t spi_recv_8bit(void){while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)== RESET); //等待datareceive返回SPI_ReceiveData8(SPI1);}

    您必须将一个虚拟值写入 DR 寄存器以在SPI主模式下触发 CLK 脉冲 . 您可以使用 spi_send_8bit() 函数来执行此操作 .

  • 1

    虽然现在这可能是一个“旧”的帖子,但我发现它可能对其他人有用,我在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几乎已满”

  • 0

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

  • 1

    我有相同的问题,即使在指令 SPI2->CR1 &= ~SPI_CR1_BIDIOE; 之后也没有发送时钟输出

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

    SPI2->CR1 |= SPI_CR1_RXONLY;
    SPI2->CR1 &= ~SPI_CR1_RXONLY;
    

    这将输出时钟并设置位 SPI_FLAG_RXNE . 我已经使用了内部48MHz时钟 .

相关问题