首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F0中SPI的接收部分无法正常工作

STM32F0中SPI的接收部分无法正常工作
EN

Stack Overflow用户
提问于 2015-01-18 06:51:55
回答 4查看 8.2K关注 0票数 2

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

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

提前感谢。:)

初始函数

代码语言:javascript
复制
    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);

传输函数是:

代码语言:javascript
复制
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();}
EN

回答 4

Stack Overflow用户

发布于 2017-04-16 20:48:26

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

票数 2
EN

Stack Overflow用户

发布于 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()函数来执行此操作。

票数 1
EN

Stack Overflow用户

发布于 2015-10-05 23:12:27

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

我发现单步执行(IAR IDE) CPU在RXNE轮询循环中挂起:

代码语言:javascript
复制
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

我试过了:

代码语言:javascript
复制
while (SPI_GetReceptionFIFOStatus(SYS_SPI) == SPI_ReceptionFIFOStatus_Empty);

同样的结果,接收器不会让我们知道它已经完成了。

我在这些后面的行上放了一个断点,逻辑上是不会到达的--它是!这可能是SPI外围设备或调试问题。RXNE的描述留下了很多需要改进的地方,它几乎读起来像是"FIFO几乎已满“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28005209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档