自己写的NRF不能用,急啊,求大神看看,代码如下

2019-03-23 19:13发布

void INit()
{                    
  SPI_InitTypeDef SPI_InitStructure;   //申明结构体
  GPIO_InitTypeDef GPIO_InitStructure;  //zhaodao 哪个模块,然后再开启对应的时钟,配置各个口的工作模式,调用
  ////////////////////////////////////////////////////////////////////////
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
  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;    //用一个使能,先拉高 ((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_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);
  //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
////////////////设置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_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,主模式的时钟决定传输速率
   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口都配置了
   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 是片选端,所以每次都要先使能CS,再写相关程序,再关闭
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
u8 nrf2401_check(void) //返回字节
{
  u8 bf1[]={0xaa,0xaa,0xaa,0xaa,0xaa};
  u8 bf2[5]={0};
  u8 i=0;
  NRF2401_WR_BF(SPI_WRITE_REG+TX_ADDR,bf1,5);     //首先要确定是读还是写,向缓冲器里写
  NRF2401_RD_BF(SPI_READ_REG+TX_ADDR,bf2,5);      //因为#SPI_READ 0X00 ,所以,可以不写,NRF2401_read(TX_ADDR,bf2,5);
  for(i=0;i<5;i++)
  {
  if(bf2!=0xaa)/*bf1)*/
          break;
  }
  if(i!=5) return 1;   //用来判断是否接受正确
  return 0;
}
u8 NRF2401_WR_REG(u8 reg,u8 data)  //寄存I器的访问[url=]\[/url]看返回值是否在位
{
  u8 status=0;
  //Clr_NRF2401_CE ; //{GPIO_ResetBits(GPIOA,GPIO_Pin_3);} //先拉低,用来判断模式
  Clr_NRF2401_CS;           //使能片选
  status=SPI_ReadWrite(reg);        //写入寄存器号,都是通过SPI来写的
  SPI_ReadWrite(data);       //写入数据
  Set_NRF2401_CS;
  return (status);        //写入地址就返回地址状态,写入数据就是返回接受到的数据
}
u8 NRF2401_RD_REG(u8 reg)      //读寄存器
{
  u8 val_a=0;
  Clr_NRF2401_CS;
  SPI_ReadWrite(reg);        //读到的是哪个寄存器
  val_a=SPI_ReadWrite(0XFF);       //读寄存器 0x00(((((((0xff))))))) ,读出值
  Set_NRF2401_CS;
  return (val_a);         //返回读到的值
}

u8  NRF2401_RD_BF(u8 reg,u8 *bf,unsigned char len)  //接受缓冲区  访问函数,用来 接受时读取FIFO中的值
{              ///用READ把数据从PLOAD中读出
  u8 VAL=0;
  u8 len1=0;
   Clr_NRF2401_CS;
   VAL=SPI_ReadWrite(reg);
   for(len1=0;len1<len;len1++)
       bf[len1]=SPI_ReadWrite(0XFF);
   Set_NRF2401_CS;
   return (VAL);
}
u8 NRF2401_WR_BF(u8 reg,u8 *bf,unsigned char len)       //发送时把数据放到FIFO中 ,用WRITE_reg
{
   u8 VAL=0;u8 len1=0;
   Clr_NRF2401_CS;
   VAL=SPI_ReadWrite(reg);
   for(len1=0;len1<len;len1++)
       SPI_ReadWrite(*bf++);
   Set_NRF2401_CS;
   return (VAL);
}
u8 NRF2401_TXpack(u8 *bf)    //发送字节首地址, 发送一个字节
{
     u8 VAL=0;
     u8 len1=0;
    // Clr_NRF2401_CS;      //ladi??????????
           Clr_NRF2401_CE;       //用来进行模式选择
     NRF2401_WR_BF(WR_TX_PLOAD,bf,TX_PLOAD_WIDTH);
           Set_NRF2401_CE;
     while (NRF2401_IRQ);  
   
     VAL=NRF2401_RD_REG(STATUS);      
     NRF2401_WR_REG(SPI_WRITE_REG+STATUS,VAL);  //写寄存器.清TX
     if((VAL&MAX_TX))   //按位与(x&1)  达到最大发送次数
        {     
        NRF2401_WR_REG(FLUSH_TX,0XFF);    //写1清0 ,发送成功直接清零
     return MAX_TX;
     }
     if(VAL&TX_OK)
     return TX_OK;   //会在后面用到
   
     else return (0xff);
  

}
u8 NRF2401_RX_PACK(u8 *buf)
{
  u8 val;
  val=NRF2401_RD_REG(STATUS) ;   //读取当前状态寄存器的值
  NRF2401_WR_REG(SPI_WRITE_REG+STATUS,val); //清状态
  if(val&RX_OK)        //接受成功 ,读出来再清零
  {
    NRF2401_RD_BF(RD_RX_PLOAD,buf,RX_PLOAD_WIDTH);
  NRF2401_WR_REG(FLUSH_TX,0XFF);      //清零(1>>0)
  }
}
void TX_MoDe()
{
Clr_NRF2401_CE ;
   NRF2401_WR_BF(SPI_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);      //tx节点
   NRF2401_WR_BF(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);       ///RX节点/////////
   NRF2401_WR_REG(SPI_WRITE_REG+EN_AA,0X01);          //使能自动应答
   NRF2401_WR_REG(SPI_WRITE_REG+EN_RXADDR,0X01);         //默认为1通道((可以改为多通道
   NRF2401_WR_REG(SPI_WRITE_REG+SETUP_RETR,0X1A);  //1: (500+86NS,,,A:10:10 TIMES
   NRF2401_WR_REG(SPI_WRITE_REG+RF_CH,40);  //公式:2400+RF_CH   2M下时,射频(2.4~2.52)(0~120)
   NRF2401_WR_REG(SPI_WRITE_REG+RF_SETUP,0X0F); ///2M下 0dBM 低噪声
  // NRF2401_WR_REG(SPI_WRITE_REG+,40);
   NRF2401_WR_REG(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//32位
   //NRF24L01_Write_Reg(SPI_WRITE_REG+,0x0e);//启动,中断产生时为低  上电 发送模式
   NRF2401_WR_REG(SPI_WRITE_REG+CONFIG,0x0e);  
  
Set_NRF2401_CE;
}
void RX_MODE()
{
Clr_NRF2401_CE ;
    NRF2401_WR_BF(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);   //_写接受地址
    NRF2401_WR_REG(SPI_WRITE_REG+EN_AA,0X01);
    NRF2401_WR_REG(SPI_WRITE_REG+EN_RXADDR,0X01);
    NRF2401_WR_REG(SPI_WRITE_REG+RF_CH,40);
    NRF2401_WR_REG(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//32位
    NRF2401_WR_REG(SPI_WRITE_REG+RF_SETUP,0X0F);     
    NRF2401_WR_REG(SPI_WRITE_REG+CONFIG,0x0F);    //最后一位来控制模式
Set_NRF2401_CE;
} 此帖出自小平头技术问答
0条回答

一周热门 更多>