微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 我写的SPI操作NRf2401的程序,不知有问题?,求解啊,代码...

我写的SPI操作NRf2401的程序,不知有问题?,求解啊,代码...

时间:10-02 整理:3721RD 点击:
void INit()
{                    
  SPI_InitTypeDef SPI_InitStructure;   //申明结构体
  GPIO_InitTypeDef GPIO_InitStructure;  //zhaodao 哪个模块,然后再开启对应的时钟,配置各个口的工作模式,调用
  ////////////////////////////////////////////////////////////////////////
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //因为A口为复用时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
///////////////////////////////////////////////////////////////////////
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4;   //CE 引脚控制模式选择,因为要用来控制它的
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;    //它的电平,所以选择输出方式((》》》))
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   //
  GPIO_Init(GPIOA,&GPIO_InitStructure);      //
  Set_NRF2401_CE;         ///必须先拉高,因为不工作时为H
// Set_nss;          //先拉高,不让工作
//////////////////////////////////////////////////////////////////////
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7;    //用一个使能,先拉高 ((b)),把所有的片选都配置上了
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//因为用它来控制外面的,所以选择输出,上下拉随意
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  Set_NRF2401_CS;      //
  GPIO_SetBits(GPIOB,GPIO_Pin_6);  //
  GPIO_SetBits(GPIOB,GPIO_Pin_7);  //
  ////////////////////////////////////////////////////////////////////
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;    //IRQ 中断引脚
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;////上拉输入
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
      GPIO_Init(GPIOA,&GPIO_InitStructure);
   GPIO_SetBits(GPIOA,GPIO_Pin_2);   //初始化时先拉高,因为触发时为L
  //////////////////////////////////////////////////////////////////////
  ////////////////////设置俩处,1:GPIO 2:SPI那里的/////////////////////
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽输出 ,只有这样才可以区别不是普通IO口
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  
////////////////设置SPI工作模式////////////////////////////////
      SPI_Cmd(SPI1,DISABLE);              //配置时先失能
   SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //双工模式 ,其实没必要
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //SPI1为主模式
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//8位
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;   //平时时钟为低
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//第1个开始,<<4种(1,0,低,1)(1,1,低,2)(0,1,高,2)(0,0,高,1) >>
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;   //           
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;    //8>>72>>9M,主模式的时钟决定传输速率,suiyi
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;     //数据从MSB开始 ,高位开始
   SPI_InitStructure.SPI_CRCPolynomial=7;               //CRC多项式,校验位
   
   SPI_Init(SPI1,&SPI_InitStructure);
    /////////////////////////////////////////////////////////////////////////////////////////
   SPI_Cmd(SPI1,ENABLE);
   SPI_ReadWrite(0xff);       //启动传输
  /////////////////////////////////////////////////////////////////////////////////////////
  
   ///////////////////////////////////////////////////////////
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;  //GPIO_pin_ALL,所有的IO口都配置了,LCD就这样配置
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;         //推挽输出
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   //
   ///////////////////////////////////////////////////////////
   GPIO_Init(GPIOB,&GPIO_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////////
   Clr_NRF2401_CE;     //模式选择 ,之后就不用设置了
   Set_NRF2401_CS;     //CS 是SPI 片选端,所以每次都要先使能CS,再写相关程序,再关闭
}
初始化的部分。
int main()
{
   u8 buf[33]={0};
   u8 temp1=' ';
   u8 t;
  
   
   
   stm32_clock_init(9);//72M,因为NRF 9M,所以用外部PLL
  // NRF24L01_Init();
   INit();      //对GPIO和SPI配置 ,已经把CE拉低了,所以在后面的SPI作用时都不用配置了,好用
   
      GPIO_SetBits(GPIOB,GPIO_Pin_2);
   while(nrf2401_check())     //如果没有, 返回值
    {            
      
   
     ///LED灯指示 ;
     GPIO_ResetBits(GPIOB,GPIO_Pin_2);   // 一直亮 (A2)
  //delay_ms1(12000000);
  //GPIO_SetBits(GPIOB,GPIO_Pin_2);
  //delay_ms1(12000000);
   
    }
程序一直停在  while(nrf2401_check())
说明没有检测到NRf,不知哪里的问题,大家帮帮忙、、、、、、

建议下次发这样的贴时,把不清楚的标清楚!这样网友更直接

问题设是?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top