//NRF24L01寄存器操作命令
#define READ_REG
#define WRITE_REG
#define RD_RX_PLOAD
#define WR_TX_PLOAD
#define FLUSH_TX
#define FLUSH_RX
#define REUSE_TX_PL
#define NOP
//SPI(NRF24L01)寄存器地址
#define CONFIG
#define EN_AA
#define EN_RXADDR
#define SETUP_AW
#define SETUP_RETR
#define RF_CH
#define RF_SETUP
#define STATUS
#define MAX_TX
#define TX_OK
#define RX_OK
#define OBSERVE_TX
#define CD
#define RX_ADDR_P0
#define RX_ADDR_P1
#define RX_ADDR_P2
#define RX_ADDR_P3
#define RX_ADDR_P4
#define RX_ADDR_P5
#define TX_ADDR
#define RX_PW_P0
#define RX_PW_P1
#define RX_PW_P2
#define RX_PW_P3
#define RX_PW_P4
#define RX_PW_P5
#define FIFO_STATUS
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//24L01片选信号
#define CE_H()
#define CE_L()
//SPI片选信号
#define CSN_H()
#define CSN_L()
//IRQ主机数据输入
//#define NRF24L01_IRQ
//24L01发送接收数据宽度定义
#define TX_ADR_WIDTH
#define RX_ADR_WIDTH
#define TX_PLOAD_WIDTH
#define RX_PLOAD_WIDTH
void NRF24L01_Init(void);//初始化
void RX_Mode(void);//配置为接收模式
void TX_Mode(void);//配置为发送模式
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//写数据区
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);//读数据区
u8 NRF24L01_Read_Reg(u8 reg); //读寄存器
u8 NRF24L01_Write_Reg(u8 reg, u8 value);//写寄存器
u8 NRF24L01_Check(void);//检查24L01是否存在
u8 NRF24L01_TxPacket(u8 *txbuf);//发送一个包的数据
u8 NRF24L01_RxPacket(u8 *rxbuf);//接收一个包的数据
//#include "stm32f10x_spi.h"
//#include "NRF24L01.h"
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
//发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
//发送地址
// SPI总线速度设置
#define SPI_SPEED_2
#define SPI_SPEED_8
#define SPI_SPEED_16
#define SPI_SPEED_256 3
void SPI2_SetSpeed(u8 SpeedSet)
{
{
SPI2->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz
}else if(SpeedSet==SPI_SPEED_8)//八分频
{
SPI2->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz
}else if(SpeedSet==SPI_SPEED_16)//十六分频
{
SPI2->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
}else //256分频
{
SPI2->CR1|=7<<3;
//Fsck=Fpclk/256=281.25Khz 低速模式
}
SPI2->CR1|=1<<6;
//SPI设备使能
}
u8 SPI_ReadWriteByte(u8 data)
{
while((SPI2->SR&1<<1)==0)//等待发送区空
{
retry++;
if(retry>200)return 0;
}
SPI2->DR=data;
retry=0;
while((SPI2->SR&1<<0)==0)
//等待接收完一个byte
{
retry++;
if(retry>200)return 0;
}
return SPI2->DR;
}
void SPI2_Init()
{
}
void
{
//
//
//
}
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI2_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址
for(i=0;i<5;i++)if(buf[i]!=0XA5)break;
if(i!=5)return 1;//检测24L01错误
return 0; //检测到24L01
}
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
CSN_L();
return(status);
}
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;
}
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
u8 status,u8_ctr;
pBuf[u8_ctr]=SPI_ReadWriteByte(0XFF);//读出数据
}
u8 NRF24L01_Write_Byte(u8 reg, u8 pBuf)
{
u8 status;
SPI_ReadWriteByte(pBuf);
}
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
u8 status,u8_ctr;
SPI_ReadWriteByte(*pBuf++);
}
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
CE_L();
while(GPIOC->IDR&1<<5);
//等待发送完成
sta=NRF24L01_Read_Reg(STATUS);
NRF24L01_Write_Reg(WRITE_REG+STATUS,sta);
//清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX
FIFO寄存器
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
SPI2_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
sta=NRF24L01_Read_Reg(STATUS);
NRF24L01_Write_Reg(WRITE_REG+STATUS,sta);
//清除TX_DS或MAX_RT中断标志
if(sta&RX_OK)//接收到数据
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX
FIFO寄存器
return 0;
}
return 1;//没收到任何数据
}
void RX_Mode(void)
{
CE_L();
}
void TX_Mode(void)
{
CE_L();
CE_H(); //CE为高,10us后启动发送
}
|
|