|
楼主 |
发表于 2014-3-23 14:11:22
|
显示全部楼层
#include <reg52.h>
#include <intrins.h>
sbit MOSI=P3^4;
sbit MISO=P3^3;
sbit IRQ=P3^2;
sbit SCK=P3^5;
sbit CSN=P3^6;
sbit CE=P3^7;
void usart()
{TMOD = 0x20; // ???1???8???????, ???????
TH1=(unsigned char)(256 - (11059200 / (32L * 12L * 9600)));
TL1=(unsigned char)(256 - (11059200 / (32L * 12L * 9600))); // ???0???
SCON = 0x50;
PCON = 0x00;
TR1 = 1;
IE = 0x00; // ??????
}
#include <reg52.h>
#include <intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#define TX_ADDR_WITDH 5//?????????5???
#define RX_ADDR_WITDH 5//?????????5???
#define TX_DATA_WITDH 8//
#define RX_DATA_WITDH 8
#define R_REGISTER 0x00 // ????
#define W_REGISTER 0x20 // ????
#define R_RX_PLOAD 0x61 // ?RX FIFO????,1-32??,???????,?????,???????
#define W_TX_PLOAD 0xA0 // ?TX FIFO????,1-32??,??????0??,???????
#define FLUSH_TX 0xE1 // ??TX FIFO???,???????
#define FLUSH_RX 0xE2 // ??RX FIFO???,???????
#define REUSE_TX_PL 0xE3 // ???????????,?CE?????,???????????
#define NOP 0xFF // ???,??????????
#define CONFIG 0x00 // ?????
#define EN_AA 0x01 // “????”????
#define EN_RX_ADDR 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 // ????0???????
#define RX_ADDR_P1 0x0B // ????1???????
#define RX_ADDR_P2 0x0C // ????2???????
#define RX_ADDR_P3 0x0D // ????3???????
#define RX_ADDR_P4 0x0E // ????4???????
#define RX_ADDR_P5 0x0F // ????5???????
#define TX_ADDR 0x10 // ???????
#define RX_PW_P0 0x11 // ????0???????????
#define RX_PW_P1 0x12 // ????1???????????
#define RX_PW_P2 0x13 // ????2???????????
#define RX_PW_P3 0x14 // ????3???????????
#define RX_PW_P4 0x15 // ????4???????????
#define RX_PW_P5 0x16 // ????5???????????
#define FIFO_STATUS 0x17 // FIFO?????
//*********************************************************************************
uchar sta; // ????
#define RX_DR (sta & 0x40) // ????????
#define TX_DS (sta & 0x20) // ????????
#define MAX_RT (sta & 0x10) // ????????
sbit LED=P2^4;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
uchar RX_Buffer[RX_DATA_WITDH];
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
//nRF24L01???
void nRF24L01_Init(void)
{
CE=0;//?????
CSN=1;
SCK=0;
IRQ=1;
}
//SPI????
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)//???8???8???
{
if(byte&0x80)//????????1
MOSI=1;//?NRF24L01?1
else //???0
MOSI=0;
byte<<=1;//????????
SCK=1;//SCK??,??????,????????
if(MISO)
byte|=0x01;
SCK=0;//SCK??
}
return byte;//???????
}
//SPI?????????
//reg:?????
//value:???(?)
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;//????
CSN=0;//SPI??
status=SPI_RW(reg);//???????,??????
SPI_RW(value);//?????
CSN=1;//
return status;//????
}
//SPI????
uchar SPI_R_byte(uchar reg)
{
uchar reg_value;
CSN=0;//SPI??
SPI_RW(reg);//????
reg_value=SPI_RW(0);//???????
CSN=1;
return reg_value;//??????
}
//SPI??RXFIFO?????
//reg:?????
//Dat_Buffer:????????
//DLen:????
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI??
status=SPI_RW(reg);//???????,????
for(i=0;i<Dlen;i++)
{
Dat_Buffer=SPI_RW(0);//????
}
CSN=1;
return status;
}
//SPI?TXFIFO???????
//reg:???????
//TX_Dat_Buffer:?????????
//Dlen:????
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI??,????
status=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer);//????
}
CSN=1;
return status;
}
//??????
void nRF24L01_Set_TX_Mode(uchar *TX_Data)
{
CE=0;//??(????????????????????)
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//??????+??????+????
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);//??????????,????0?????????
SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);//???????+????+??????
SPI_W_Reg(W_REGISTER+EN_AA,0x01);//????0????
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//??????0
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);//??????250US+86US,??10?
SPI_W_Reg(W_REGISTER+RF_CH,0);//2.4GHZ
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//1Mbps??,????:0DBM,????????
SPI_W_Reg(W_REGISTER+CONFIG,0x0e);//????,??,16?CRC??,CRC??
CE=1;//????
_delay_ms(5);//CE?????????10US??
}
//??????
uchar Check_Ack(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS);//??????
if(TX_DS||MAX_RT)//??TX_DS?MAX_RT?1,????????TX_FIFO?????
{
SBUF=0xaa;
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_TX);//??????????????,?????
CSN=1;
return 0;
}
else{
//SBUF=0xbb;
return 1;
}
}
void main(void)
{
uchar i;
P0=0xff;//???IO?
P1=0xff;
P2=0xff;
P3=0xff;
_delay_us(100);
usart();
nRF24L01_Init();//NRF24L01???
while(1)
{
for(i=0;i<TX_DATA_WITDH-1;i++)//??7???
{
nRF24L01_Set_TX_Mode(&TX_Buffer);//????
while(Check_Ack());//??????
LED=0;
_delay_us(5000);
LED=1;
}
}
}
|
|