真的很爱上厕所 2021-10-06 13:59
浏览 294
已结题

关于STM32SPI2单线双向模式下接收数据的问题

目标效果:传感器返回值通过SPI通信传输至单片机,单片机通过处理后筛选有效信息进行显示
问题简述:现在通过读取SPI寄存器获得传感器数据,一直无返回值(都是0x00),考虑是时序问题。
尝试:1、修改过APB1的时钟为36M,16M均无效果。
2、考虑是不是SPI2一定要用对应片选引脚,尝试后也无返回数据。
希望有懂的老哥帮帮我!!

下图是传感器的时序

img

下面是芯片引脚接口,因为芯片自带了spi flash封装,所以我想连接外设,就启用SPI2选用另外一个其他引脚当作片选。不知道可不可以?

img

img

一、下面这一段是初始化引脚和SPI


void Rcc_Init(void)
{
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_ON);                                                        //OPEN_HSE
    while(!(RCC->CR>>17));
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    //SYSTEMCLK:9*8=72M
    RCC_HCLKConfig(RCC_SYSCLK_Div1);                                            //AHB: 72/1=48M
    RCC_PCLK1Config(RCC_HCLK_Div4);                                                //APB1:72/4=18M
    RCC_PCLK2Config(RCC_HCLK_Div1);                                                //APB2:72/1=72MS
    RCC_PLLCmd(ENABLE);
    while(!(RCC->CR>>25));
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                        //set_pll=sysclk
    while(RCC_GetSYSCLKSource() != 0x08);                                    
}
void SPI2_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
     SPI_InitTypeDef  SPI_InitStructure;
    /*使能时钟信号*/
    RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE );//PORTB时钟使能 
    RCC_APB1PeriphClockCmd(    RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能     
    /*SPI2 definated pin*/
    
                                /*CLK*/    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
                                /*SO*/    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化GPIOB
    /*user definated pin*/
                            /*CS1*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);


  
    GPIO_ResetBits(GPIOB,GPIO_Pin_13);                  //时钟信号空闲位:低                                    
    GPIO_SetBits(GPIOB,GPIO_Pin_14);
    GPIO_SetBits(GPIOD,GPIO_Pin_3);        
    /*SPI2初始化*/
    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;  //设置SPI为单线双向接收
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               //设置为主机
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;           //设置SPI输出大小:接收16位帧数据
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                   //串口同步时钟空闲位为低电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;               //上升沿采样
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                   //NSS信号由软件控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //波特率预分频值256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;            //数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;                    //CRC计算多项式
    SPI_Init(SPI2, &SPI_InitStructure);                          //初始化寄存器

    SPI_Cmd(SPI2, ENABLE);                                 //使能spi外设      
} 
二、下面这一段是获取数据,但是始终获取的数据都是0x00
```c
void SPI2_ReadWriteByte(void)
{    
    while (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == SET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
    {
        read_byte=SPI_I2S_ReceiveData(SPI2); //返回通过SPI2最近接收的数据

        start_byte=1;                      
    }    
}
    
void SPI_ReadSR(void)   
{  
    SPI_CS_CLR;                            //使能器件   
    Delay_us(1); 
    SPI2_ReadWriteByte();                     //读取一个字节 
    SPI_CS_SET;                            //取消片选     
}



  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月14日
    • 修改了问题 10月6日
    • 创建了问题 10月6日

    悬赏问题

    • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
    • ¥15 虚拟机检测,可以是封装好的DLL,可付费
    • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
    • ¥30 使用matlab将观测点聚合成多条目标轨迹
    • ¥15 Workbench中材料库无法更新,如何解决?
    • ¥20 如何推断此服务器配置
    • ¥15 关于github的项目怎么在pycharm上面运行
    • ¥15 内存地址视频流转RTMP
    • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
    • ¥15 有没有整苹果智能分拣线上图像数据