STM32F0中SPI的接收部分不工作

时间:2015-01-17 22:51:55

标签: stm32 spi

我使用的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 个答案:

答案 0 :(得分:1)

这个功能不起作用:

  

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

DR寄存器写入一个虚拟值,以便在SPI主模式下触发CLK个脉冲。您可以使用spi_send_8bit()功能来执行此操作。

答案 1 :(得分: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几乎已满”

答案 2 :(得分:1)

我遇到了同样的问题,我通过在SPI1-> CR2寄存器中设置FRXTH位解决了这个问题。

答案 3 :(得分:0)

我遇到了同样的问题,即使在指令SPI2->CR1 &= ~SPI_CR1_BIDIOE;

之后也没有发送时钟输出

我的解决方案:在上述说明之前,请输入:

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

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