创建博客 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zpehome的博客

Hope is a good thing,the best of things

 
 
 

日志

 
 

nRF24L01+射频芯片使用  

2012-12-18 15:41:50|  分类: 嵌入式软件 |  标签: |举报 |字号 订阅

nRF24L01+是由NORDIC出品的工作在2.4GHz~2.5GHz的ISM频段的单片无线收发器芯片。该芯片在Power Down模式下功耗只有900nA,适合与STM32L系列单片机结合开发低功耗产品。

nRF24L01+的接口方式采用SPI接口。

IRQ:中断引脚,低电平有效。由三个可屏蔽中断控制。

CE:拉高CE脚进行射频收发。

命令字:

R_REGESTER:000A AAAA读命令和状态寄存器,AAAAA=5位寄存器地址;

W_REGISTER:001A AAAA写命令和状态寄存器,AAAAA=5位寄存器地址;

R_RX_PAYLOAD:0110 0001读接收缓冲区,从第0字节开始读,读完后数据从缓冲区中删除;

W_RX_PAYLOAD:1010 0000写发送缓冲区,从第0字节开始写;

FLUSH_TX:1110 0001清发送缓冲区;

FLUSH_RX:1110 0001清接收缓冲区;

REUSE_TX_PL:1110 0011重用上一发送包;

R_RX_PL_WID:0110 0000读接收缓冲区的长度;

W_ACK_PAYLOAD:1010 1PPP

W_TX_PAYLOAD_NOACK:1011 0000

NOP:1111 1111空操作,可以用于读状态寄存器

SPI:

void SPI1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

SPI_InitTypeDef SPI_InitStruct;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5;

GPIO_InitStruct.GPIO_Speed=GPIO_SPeed_10MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;

GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_PinAFCongif(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);//使能复用功能,这点跟stm32f103不一样

GPIO_PinAFCongif(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);

GPIO_PinAFCongif(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;//NSS

GPIO_InitStruct.GPIO_Speed=GPIO_SPeed_10MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;

GPIO_Init(GPIOA,&GPIO_InitStruct);

SET_SS;//片选禁止

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;//CE

GPIO_InitStruct.GPIO_Speed=GPIO_SPeed_10MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;

GPIO_Init(GPIOA,&GPIO_InitStruct);

SPI_I2S_DeInit(SPI1);//重置SPI1

SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//spi设置成双向双线全双工

SPI_InitStruct.SPI_Mode=SPI_Mode_Master;//SPI工作在主模式

SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;//SPI接收发送8位数据

SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;//始终悬空低,SCK在空闲时保持低电平

SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;//数据捕获于第一个时钟沿

SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;//软件控制NSS

SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;比特率预分频值为4分频

SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;//数据传输从MSB开始

SPI_InitStruct.SPI_CRCPolynomial=7;//用于CRC值校验的多项式

SPI_Init(SPI1,&SPI_InitStruct);

SPI_Cmd(SPI1,ENABLE);

}

unsigned char SPI_ReadWriteByte(unsigned char TxData,SPI_TypeDef *SPI)

{

MS_count = 0;//SPI超时判断

while((SPI_I2S_GetFlagStatus(SPIx,SPI_I2S_FLAG_TXE)==RESET)&&(MS_count<2));

SPI_I2S_SendData(SPIx,TxData);

MS_count=0;

while((SPI_I2S_GetFlagStatus(SPIx,SPI_I2S_FLAG_RXNE)==RESET)&&(MS_count<2));

return SPI_I2S_ReceiveData(SPIx);

}

unsigned char nRF24L01_Write_Reg(unsigned char regaddr,unsgiend char data)

{

unsigned char status;

CLR_SS;//使能片选

status=SPI_ReadWriteByte(regaddr,SPI1);

SPI_ReadWriteByte(data,SPI1);

SET_SS;

return status;

}

unsigned char nRF24L01_Write_Buf(unsigned char regaddr,unsigned char *pBuf,unsigned char datalen)

{

unsigned char status,ctr;

CLR_SS;

status=SPI_ReadWriteByte(regaddr,SPI1);

for(ctr=0;ctr<datalen;ctr++)

{

SPI_ReadWriteByte(*pBuf++,SPI1);

}

SET_SS;

return status;

}

unsigned char nRF24L01_Read_Reg(unsigned char regaddr)

{

unsigned char ret;

CLR_SS;

SPI_ReadWriteByte(regaddr,SPI1);

ret=SPI_ReadWriteByte(0,SPI);

SET_SS;

return ret;

}

unsigned char nRF24L01_Read_Buf(unsigned char regaddr,unsigned char *pBuf,unsigned char datalen)

{

unsigned char status,ctr;

CLR_SS;

status=SPI_ReadWriteByte(regaddr,SPI1);

for(ctr=0;ctr<datalen;ctr++)

{

pBuf[ctr]=SPI_ReadWriteByte(0,SPI1);

}

SET_SS;

return status;

}

//射频初始化,使能通道0接收

void init_nRF24L01(unsigned char ch,unsigned char pa,unsigned char pload,unsigned char speed,unsigned char addr)

{

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR,TX_ADDRESS,TX_ADDR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+EN_AA,0x00);//禁止自动应答

nRF24L01_Write_Buf(W_REGISTER+EN_RXADDR,0x01);//允许通道0接收

nRF24L01_Write_Buf(W_REGISTER+SETUP_RETR,0x00);//禁止自定重发

nRF24L01_Write_Buf(W_REGISTER+SETUP_AW,0x01);//设置地址长度为3

nRF24L01_Write_Buf(W_REGISTER+RF_CH,ch);//设置通讯频道

nRF24L01_Write_Buf(W_REGISTER+RX_PW_0,pload);//设置载荷长度

nRF24L01_Write_Buf(W_REGISTER+RF_SETUP,speed|pa);//设置发射功率和数据传输速率

}


//同时接收通道0、通道1初始化

void init_nRF24L01_multich(unsigned char ch,unsigned char pa,unsigned char pload0,unsigned char pload1,unsigned char speed,unsigned char addr)

{

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR,TX_ADDRESS,TX_ADDR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR_P1,RX_ADDRESS1,RX_ADR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+EN_AA,0x00);//禁止自动应答

nRF24L01_Write_Buf(W_REGISTER+EN_RXADDR,0x03);//允许通道0和1接收

nRF24L01_Write_Buf(W_REGISTER+SETUP_RETR,0x00);//禁止自定重发

nRF24L01_Write_Buf(W_REGISTER+SETUP_AW,0x01);//设置地址长度为3

nRF24L01_Write_Buf(W_REGISTER+RF_CH,ch);//设置通讯频道

nRF24L01_Write_Buf(W_REGISTER+RX_PW_0,pload0);//设置载荷长度

nRF24L01_Write_Buf(W_REGISTER+RX_PW_1,pload1);//设置载荷长度

nRF24L01_Write_Buf(W_REGISTER+RF_SETUP,speed|pa);//设置发射功率和数据传输速率

}

 

//动态字节接收初始化

void init_nRF24L01_Dynamic(unsigned char ch,unsigned char pa,unsigned char pload,unsigned char speed,unsigned char addr)

{

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR,TX_ADDRESS,TX_ADDR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+TX_AADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

nRF24L01_Write_Buf(W_REGISTER+EN_AA,0x00);//禁止自动应答

nRF24L01_Write_Buf(W_REGISTER+EN_RXADDR,0x01);//允许通道0接收

nRF24L01_Write_Buf(W_REGISTER+SETUP_RETR,0x00);//禁止自定重发

nRF24L01_Write_Buf(W_REGISTER+SETUP_AW,0x03);//设置地址长度为5

nRF24L01_Write_Buf(W_REGISTER+RF_CH,ch);//设置通讯频道

nRF24L01_Write_Buf(W_REGISTER+RF_SETUP,speed|pa);//设置发射功率和数据传输速率

nRF24L01_Write_Buf(W_REGISTER+FEATURE,0x04);//使能动态载荷长度

nRF24L01_Write_Buf(W_REGISTER+DYNPD,0x01);//使能通道0的动态载荷长度

}
void SetRx_Mode(void)

{

nRF24L01_Write_Buf(W_REGISTER+CONFIG,0x0F);//上电、接收模式、16位CRC校验、中断引脚低电平有效

SET_EN;//开始接收

}

void SetTx_Mode(void)

{

nRF24L01_Write_Buf(W_REGISTER+CONFIG,0x0E);//上电、发送模式、16位CRC校验、中断引脚低电平有效

delay_soft(8000);//延时大约1.5ms   24L01从PowerDown->PWR_UP=1 需要最大1.5ms,这点我认为nRF24L01做的不太好,没有一个状态位,只能死等。

SET_EN;//开始接收     发送时给一个10us以上的高脉冲

delay_soft(60);//延时超过10us

CLR_EN;

}


 

  评论这张
 
阅读(69)| 评论(0)
|      
推荐 转载

历史上的今天

最近读者

热度

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014