我使用的单片机是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();}发布于 2017-04-16 20:48:26
我也有同样的问题,我通过在SPI1->CR2寄存器中设置FRXTH位解决了这个问题。
发布于 2015-01-19 04:07:15
此函数将不起作用:
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()函数来执行此操作。
发布于 2015-10-05 23:12:27
虽然这可能是一个“旧”帖子,现在我发现它可能对其他人有用,但我在STM32F030和042上使用RXNE也有问题。
我发现单步执行(IAR IDE) CPU在RXNE轮询循环中挂起:
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);我试过了:
while (SPI_GetReceptionFIFOStatus(SYS_SPI) == SPI_ReceptionFIFOStatus_Empty);同样的结果,接收器不会让我们知道它已经完成了。
我在这些后面的行上放了一个断点,逻辑上是不会到达的--它是!这可能是SPI外围设备或调试问题。RXNE的描述留下了很多需要改进的地方,它几乎读起来像是"FIFO几乎已满“。
https://stackoverflow.com/questions/28005209
复制相似问题