说明一点:
nRF24l01的操作函数:
byte SPI_RW(unsigned char Byte)
{
byte i;
for(i=0;i<8;i++)
{
if(Byte&0x80)
{
digitalWrite(_MOSI, 1);
}
else
{
digitalWrite(_MOSI, 0);
}
digitalWrite(_SCK, 1);
Byte <<= 1;
if(digitalRead(_MISO) == 1)
{
Byte |= 1;
}
digitalWrite(_SCK, 0);
}
return(Byte);
}
/**************************************************/
byte SPI_RW_Reg(unsigned char reg, unsigned char value)
{
byte status;
digitalWrite(CSN, 0);
status = SPI_RW(reg);
SPI_RW(value);
digitalWrite(CSN, 1);
return(status);
}
/**************************************************/
byte SPI_Read(unsigned char reg)
{
byte reg_val;
digitalWrite(CSN, 0);
SPI_RW(reg);
reg_val = SPI_RW(0);
digitalWrite(CSN, 1);
return(reg_val);
}
/**************************************************/
byte SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
byte status,i;
digitalWrite(CSN, 0);
status = SPI_RW(reg);
for(i=0;i<bytes;i++)
{
pBuf[i] = SPI_RW(0);
}
digitalWrite(CSN, 1);
return(status);
}
/**************************************************/
byte SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
byte status,i;
digitalWrite(CSN, 0);
status = SPI_RW(reg);
for(i=0;i<bytes; i++)
{
SPI_RW(*pBuf++);
}
digitalWrite(CSN, 1);
return(status);
}
以上为设备的信息接收和发送函数。
但是应该如何使用呢?
我们引入一个封装的函数:
/********发送信息(无线发出的的)****************************************/
void TX_DATA()
{
byte status;
status=SPI_Read(STATUS);
if(status&TX_DS)
{
SPI_RW_Reg(FLUSH_TX,0);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
}
if(status&MAX_RT)
{
SPI_RW_Reg(FLUSH_TX,0);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
}
SPI_RW_Reg(WRITE_REG+STATUS,status);
delay(20);
}
/******************接收消息(无线传递过来的)******************************/
void RX_DATA()
{
byte status;
status = SPI_Read(STATUS);
if(status&RX_DR)
{
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);
SPI_RW_Reg(FLUSH_RX,0);
}
SPI_RW_Reg(WRITE_REG+STATUS,status);
}
如何封装为我们自己直接用的呢?
byte rxBuf[32];/*我也不知道为啥是32,反正32是够大了,毕竟是个协议而已,据说最大可扩展到256,刚接触这个,不了解*/
byte txBuf[32];
void loop()
{
//------开始接收消息-----------------------
RX_DATA();/*执行完这句之后,数据就放进了rxBuf中,然后你就会问我,它咋放进去的?我会告诉你:去检查RX_DATA() 函数,里面有一句话:SPI_Read_Buf(RD_RX_PLOAD, rxBuf, TX_PLOAD_WIDTH);就这样子放进去了,注意 rxBuf一定是全部变量啊!!! */
delay(500);//等待500微秒
//------然后我们开始发送-------------------
txBuf[1] = 11;
txBuf[2] = 22;
txBuf[3] = 33;
txBuf[0] = 3;/*因为我要发送的数据总量是3个,所以在第0位,写上3,你的数据是4个就写4*/
TX_DATA();/*执行完这个,你的消息就出去了~~~别问为啥,和RX_DATA的原理一样,因为一句话:在TX_DATA中:PI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);*/
delay(500);//等待500微秒
}
so。。。到这里,你就可以随心所欲的干你想干的事了。附带一个下配置:
//****************************************************
#define READ_REG 0x00
#define WRITE_REG 0x20
#define RD_RX_PLOAD 0x61
#define WR_TX_PLOAD 0xA0
#define FLUSH_TX 0xE1
#define FLUSH_RX 0xE2
#define REUSE_TX_PL 0xE3
#define NOP 0xFF
//***************************************************
#define RX_DR 0x40
#define TX_DS 0x20
#define MAX_RT 0x10
//***************************************************
#define CONFIG 0x00
#define EN_AA 0x01
#define EN_RXADDR 0x02
#define SETUP_AW 0x03
#define SETUP_RETR 0x04
#define RF_CH 0x05
#define RF_SETUP 0x06
#define STATUS 0x07
#define OBSERVE_TX 0x08
#define CD 0x09
#define RX_ADDR_P0 0x0A
#define RX_ADDR_P1 0x0B
#define RX_ADDR_P2 0x0C
#define RX_ADDR_P3 0x0D
#define RX_ADDR_P4 0x0E
#define RX_ADDR_P5 0x0F
#define TX_ADDR 0x10
#define RX_PW_P0 0x11
#define RX_PW_P1 0x12
#define RX_PW_P2 0x13
#define RX_PW_P3 0x14
#define RX_PW_P4 0x15
#define RX_PW_P5 0x16
#define FIFO_STATUS 0x17
//-----引脚配置--------------
#define IRQ 8
#define CE 9
#define CSN 10
#define _SCK 13
#define _MOSI 11
#define _MISO 12
我就知道引脚是啥,别的不了解。。另请高明吧!