久芯网

关于stm32f407 spi1 接收数据时一致卡死while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)

avatar yklkadlfk7898 提问时间: 2023-08-26 08:56:15 / 未解决
我的stm32f407 spi1配置如下:
void BON080_SPI1_Init(void)
{     
        GPIO_InitTypeDef  GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
       
        GPIO_Set(GPIOA,PIN2|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);       
        GPIO_Set(GPIOE,PIN8,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);
        GPIO_SetBits(GPIOE,GPIO_Pin_8);
        //BNO080_SPI_RESET_H() ;
       
        GPIO_Set(GPIOE,PIN12,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);
        GPIO_SetBits(GPIOE,GPIO_Pin_12);
        //BNO080_WAKE_HIGH();
       
       
        GPIO_Set(GPIOB,PIN3,GPIO_Mode_AF,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);        //PB3,CLK信号,推挽输出                          
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                        //MSPI1_MOSI PA7,SPI1_MISO PA6
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                    //复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                  //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_25M;                                    //25MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_PU;                    //上拉     
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                                   
       
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);           //PA6复用为 SPI1---SPI1_MISO
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);           //PA7复用为 SPI1---SPI1_MOSI
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);           //PB3复用为 SPI1---SPI1---CLK

        //SPI口初始化
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                         //串行同步时钟的空闲状态为高电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                  //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 0;                            //CRC值计算的多项式 0
    SPI_Init(SPI1, &SPI_InitStructure);                                 //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

    SPI_Cmd(SPI1, ENABLE);            //使能SPI外设
        BNO080_CHIP_DESELECT();

    BON080_SPI1_ReadWriteByte(0xff); //启动传输

}


接收函数:
CyBool_t BON080_SPI1_ReadByte(uint8_t *data)
{                     
        uint32_t waitnum=0;
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
        {  
                waitnum++;  
                if(waitnum>DELAY_COUNT){
                        LOG("BON080_SPI1_ReadByte error");
                        return False;  
                }
        }
        *data = SPI_I2S_ReceiveData(SPI1);
    return True;      
}


当外部有数据过来时,调用次函数接收数据,发现一直死在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)循环知道超时退出。通过查MISO线是有数据的,clk也是有波形的。为何一直卡住呢?
但是同样的spi口和函数,去读另外芯片时又能读到数据。请问卡死while循环是为啥,是检测不到miso数据吗?

如需获得 stm32f407 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

3个回答
  • avatar 胤幻1988
    回答时间: 2023-08-26 09:19:19

    你不是双向的,光接收么??BON080_SPI1_ReadWriteByte(0xff),这个函数是不是也能读,试下这个呢?

  • avatar butterflyspring
    回答时间: 2023-08-26 09:49:21

    建议楼主做个测试,去掉超时,先调用函数,然后再发数据给F407, 看看是不是时序问题引起的

  • avatar 废鱼
    回答时间: 2023-08-26 10:16:16

    楼主你好,从配置上看到的是主机模式,如果想读取数据,主机需要先发送一个空数据,产生波形后,才能读取到数据。这个可以参考对应SPI的芯片手册,读取操作都有介绍。

会员中心 微信客服
客服
回到顶部