你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
yklkadlfk7898 提问时间:2021-7-27 19:41 / 未解决
我的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数据吗?
收藏 评论3 发布时间:2021-7-27 19:41

举报

3个回答
胤幻1988 回答时间:2021-7-28 12:42:58
你不是双向的,光接收么??BON080_SPI1_ReadWriteByte(0xff),这个函数是不是也能读,试下这个呢?
butterflyspring 回答时间:2021-7-28 15:09:20
建议楼主做个测试,去掉超时,先调用函数,然后再发数据给F407, 看看是不是时序问题引起的
废鱼 回答时间:2021-7-28 17:17:13
楼主你好,从配置上看到的是主机模式,如果想读取数据,主机需要先发送一个空数据,产生波形后,才能读取到数据。这个可以参考对应SPI的芯片手册,读取操作都有介绍。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版