我使用的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();}
答案 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时钟。