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;
}
此帖出自小平头技术问答
一周热门 更多>