SPI 初始化问题

2019-07-20 11:10发布

    想问一下 , 我在F407 上对 SPI1 进行了两次初始化
    先是是初始化的 PB4 PB5 PB6 引脚 接了MS5611气压计 然后找了一个不冲突的io作为NCS (初始化完后拉高了片选的)
    另一次是初始化的 PA5 PA6 PA7 引脚 接了NRF24L01无线模块 然后又找了一个不冲突的io作为NCS(初始化完后拉高了片选的)
    但是后面读取器件就出问题了,只有NRF24L01无线模块能正常读取,MS5611气压计就读取不了
    我在想这个会不会和初始化顺序有关? 是不是SPI只能一组引脚出去然后接分线板而不是这样初始化多组引脚??
    求解。

贴一个初始化代码:

在main里面初始化的顺序:

SPI1_MS5611_Init();
SPI1_NRF24L01_Init();



void SPI1_MS5611_Init(void)  // MS5611
{               

    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;
   
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE ) ;        // 使能SPI1时钟
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE ) ;        // 使能GPIO时钟
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE ) ;        // 使能GPIO时钟
   
    //Configure SCK,MISO,MOSI---------------------------------------//
    GPIO_InitStructure.GPIO_Pin        =    GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 ;    // PB3~5复用功能输出   
    GPIO_InitStructure.GPIO_Mode    =    GPIO_Mode_AF ;        // 复用功能
    GPIO_InitStructure.GPIO_OType    =    GPIO_OType_PP ;        // 推挽输出
    GPIO_InitStructure.GPIO_Speed    =    GPIO_Speed_50MHz ;    // 50MHz
    GPIO_Init( GPIOB , &GPIO_InitStructure ) ;            // 初始化
   
    GPIO_PinAFConfig( GPIOB , GPIO_PinSource3 , GPIO_AF_SPI1 ) ;    // PB3复用为 SPI1 SCK
    GPIO_PinAFConfig( GPIOB , GPIO_PinSource4 , GPIO_AF_SPI1 ) ;    // PB4复用为 SPI1 MISO
    GPIO_PinAFConfig( GPIOB , GPIO_PinSource5 , GPIO_AF_SPI1 ) ;    // PB5复用为 SPI1 MOSI   

    //Configure NSS-------------------------------------------------//
    GPIO_InitStructure.GPIO_Pin        =    GPIO_Pin_0 ;
    GPIO_InitStructure.GPIO_Mode    =    GPIO_Mode_OUT ;            // 输出
    GPIO_InitStructure.GPIO_OType    =    GPIO_OType_PP ;            // 推挽输出
    GPIO_InitStructure.GPIO_Speed    =    GPIO_Speed_50MHz ;         // 50MHz
    GPIO_Init( GPIOE , &GPIO_InitStructure ) ;                // PE0设置为 SPI1 CS
    GPIO_SetBits(GPIOE,GPIO_Pin_0);        // 上拉
   
    // SCK  -> SCL -> PB3
    // MISO -> SDO -> PB4
    // MOSI -> SDA -> PB5
    // CS   -> NCS -> PE0
   
    SPI_Cmd(SPI1, DISABLE) ;
   
    SPI_InitStructure.SPI_BaudRatePrescaler        =    SPI_BaudRatePrescaler_8 ;            // 定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_CRCPolynomial            =    7 ;                                    // CRC值计算的多项式
    SPI_InitStructure.SPI_Direction                =     SPI_Direction_2Lines_FullDuplex ;    // 设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_DataSize                =     SPI_DataSize_8b ;                    // 设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_FirstBit                =    SPI_FirstBit_MSB ;                    // 指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_Mode                    =     SPI_Mode_Master ;                    // 设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_CPOL                    =     SPI_CPOL_Low ;                        // 串行同步时钟的空闲状态为高电平
    SPI_InitStructure.SPI_CPHA                    =     SPI_CPHA_1Edge ;                    // 串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS                    =     SPI_NSS_Soft ;                        // NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_Init(SPI1, &SPI_InitStructure) ;        // 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

    SPI_Cmd(SPI1, ENABLE) ;        // 使能SPI外设   
    delay_ms(5);
    SPIx_ReadWriteByte(SPI1,0xff);    // 启动传输         
    MS_5611_DISENABLE;          // MS5611片选取消
    delay_ms(50);               
}

void SPI1_NRF24L01_Init(void)  // NRF24L01
{               

    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;
   
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE ) ;        // 使能SPI1时钟
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE ) ;        // 使能GPIO时钟
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOG , ENABLE ) ;        // 使能GPIO时钟
   
    //Configure SCK,MISO,MOSI---------------------------------------//
    GPIO_InitStructure.GPIO_Pin        =    GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;    // PA5~7复用功能输出   
    GPIO_InitStructure.GPIO_Mode    =    GPIO_Mode_AF ;        // 复用功能
    GPIO_InitStructure.GPIO_OType    =    GPIO_OType_PP ;        // 推挽输出
    GPIO_InitStructure.GPIO_Speed    =    GPIO_Speed_50MHz ;    // 50MHz
    GPIO_Init( GPIOA , &GPIO_InitStructure ) ;            // 初始化
   
    GPIO_PinAFConfig( GPIOA , GPIO_PinSource5 , GPIO_AF_SPI1 ) ;    // PA5复用为 SPI1 SCK
    GPIO_PinAFConfig( GPIOA , GPIO_PinSource6 , GPIO_AF_SPI1 ) ;    // PA6复用为 SPI1 MISO
    GPIO_PinAFConfig( GPIOA , GPIO_PinSource7 , GPIO_AF_SPI1 ) ;    // PA7复用为 SPI1 MOSI   

    //Configure NSS-------------------------------------------------//
    GPIO_InitStructure.GPIO_Pin        =    GPIO_Pin_13 ;
    GPIO_InitStructure.GPIO_Mode    =    GPIO_Mode_OUT ;            // 输出
    GPIO_InitStructure.GPIO_OType    =    GPIO_OType_PP ;            // 推挽输出
    GPIO_InitStructure.GPIO_Speed    =    GPIO_Speed_50MHz ;         // 50MHz
    GPIO_Init( GPIOG , &GPIO_InitStructure ) ;                // PG13设置为 SPI1 CS
    GPIO_SetBits(GPIOG,GPIO_Pin_13);        // 上拉
   
    // SCK  -> SCL -> PA5
    // MISO -> SDO -> PA6
    // MOSI -> SDA -> PA7
    // CS   -> NCS -> PG13
   
    SPI_Cmd(SPI1, DISABLE) ;
   
    SPI_InitStructure.SPI_BaudRatePrescaler        =    SPI_BaudRatePrescaler_8 ;            // 定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_CRCPolynomial            =    7 ;                                    // CRC值计算的多项式
    SPI_InitStructure.SPI_Direction                =     SPI_Direction_2Lines_FullDuplex ;    // 设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_DataSize                =     SPI_DataSize_8b ;                    // 设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_FirstBit                =    SPI_FirstBit_MSB ;                    // 指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_Mode                    =     SPI_Mode_Master ;                    // 设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_CPOL                    =     SPI_CPOL_Low ;                        // 串行同步时钟的空闲状态为高电平
    SPI_InitStructure.SPI_CPHA                    =     SPI_CPHA_1Edge ;                    // 串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS                    =     SPI_NSS_Soft ;                        // NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_Init(SPI1, &SPI_InitStructure) ;        // 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

    SPI_Cmd(SPI1, ENABLE) ;        // 使能SPI外设   
    delay_ms(5);
    SPIx_ReadWriteByte(SPI1,0xff);    // 启动传输         
    NRF24L01_DISENABLE;          // NRF24L01片选取消
    delay_ms(50);        
   
   
    //以下初始化其他引脚
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE ) ;        // 使能GPIO时钟
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOG , ENABLE ) ;        // 使能GPIO时钟
   
    //Configure CE--------------------------------------------------//
    GPIO_InitStructure.GPIO_Pin        =    GPIO_Pin_14  ;    // PG14输出   
    GPIO_InitStructure.GPIO_Mode    =    GPIO_Mode_OUT ;        // 输出
    GPIO_InitStructure.GPIO_OType    =    GPIO_OType_PP ;        // 推挽
    GPIO_InitStructure.GPIO_PuPd    =    GPIO_PuPd_UP;        // 上拉
    GPIO_InitStructure.GPIO_Speed    =    GPIO_Speed_50MHz ;    // 50MHz
    GPIO_Init( GPIOG , &GPIO_InitStructure ) ;            // 初始化

    //Configure IRQ-------------------------------------------------//
    GPIO_InitStructure.GPIO_Pin        =    GPIO_Pin_8 ;    // PA8输入   
    GPIO_InitStructure.GPIO_Mode    =    GPIO_Mode_IN ;        // 输入
    GPIO_InitStructure.GPIO_OType    =    GPIO_OType_PP ;        // 推挽
    GPIO_InitStructure.GPIO_PuPd    =    GPIO_PuPd_UP;        // 上拉
    GPIO_InitStructure.GPIO_Speed    =    GPIO_Speed_50MHz ;     // 50MHz
    GPIO_Init( GPIOA , &GPIO_InitStructure ) ;            // 初始化
   
    NRF24L01_CE=0;    //使能24L01
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。