|
發(fā)送程序(實(shí)驗(yàn)板需要復(fù)位才會(huì)運(yùn)行 不復(fù)位不能正常運(yùn)行 不知道是怎么回事)
/*****************************************
¹¦ÄÜ£ºNRF24L01É䯵ģ¿éÍ·Îļþ
*****************************************/
#ifndef _NRF24L01_H_
#define _NRF24L01_H_
/*******************************************************/
#define TX_ADDR_WITDH 5 //·¢Ë͵ØÖ·¿í¶ÈÉèÖÃΪ5¸ö×Ö½Ú
#define RX_ADDR_WITDH 5 //½ÓÊÕµØÖ·¿í¶ÈÉèÖÃΪ5¸ö×Ö½Ú
#define TX_DATA_WITDH 4//·¢ËÍÊý¾Ý¿í¶È1¸ö×Ö½Ú
#define RX_DATA_WITDH 4//½ÓÊÕÊý¾Ý¿í¶È1¸ö×Ö½Ú
/*******************ÃüÁî¼Ä´æÆ÷***************************/
#define R_REGISTER 0x00//¶ÁÈ¡ÅäÖüĴæÆ÷
#define W_REGISTER 0x20//дÅäÖüĴæÆ÷
#define R_RX_PAYLOAD 0x61//¶ÁÈ¡RXÓÐЧÊý¾Ý
#define W_TX_PAYLOAD 0xa0//дTXÓÐЧÊý¾Ý
#define FLUSH_TX 0xe1//Çå³ýTXFIFO¼Ä´æÆ÷
#define FLUSH_RX 0xe2//Çå³ýRXFIFO¼Ä´æÆ÷
#define REUSE_TX_PL 0xe3//ÖØÐÂʹÓÃÉÏÒ»°üÓÐЧÊý¾Ý
#define NOP 0xff//¿Õ²Ù×÷
/******************¼Ä´æÆ÷µØÖ·****************************/
#define CONFIG 0x00//ÅäÖüĴæÆ÷
#define EN_AA 0x01//ʹÄÜ×Ô¶¯Ó¦´ð
#define EN_RXADDR 0x02//½ÓÊÕͨµÀʹÄÜ0-5¸öͨµÀ
#define SETUP_AW 0x03//ÉèÖÃÊý¾ÝͨµÀµØÖ·¿í¶È3-5
#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//P0ͨµÀÊý¾Ý¿í¶ÈÉèÖÃ
#define RX_PW_P1 0x12//P1ͨµÀÊý¾Ý¿í¶ÈÉèÖÃ
#define RX_PW_P2 0x13//P2ͨµÀÊý¾Ý¿í¶ÈÉèÖÃ
#define RX_PW_P3 0x14//P3ͨµÀÊý¾Ý¿í¶ÈÉèÖÃ
#define RX_PW_P4 0x15//P4ͨµÀÊý¾Ý¿í¶ÈÉèÖÃ
#define RX_PW_P5 0x16//P5ͨµÀÊý¾Ý¿í¶ÈÉèÖÃ
#define FIFO_STATUS 0x17//FIFO״̬¼Ä´æÆ÷
/*******************Ïà¹Øº¯ÊýÉùÃ÷**************************/
unchar NRFACK();
unchar NRFSPI(unchar date);
unchar NRFReadReg(unchar RegAddr);
unchar NRFWriteReg(unchar RegAddr,unchar date);
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen);
unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen);
unchar NRFRevDate(unchar *RevDate);
void NRFSetTxMode(unchar *TxDate);
void NRF24L01Int();
void NRFSetRXMode();
void Set_Mode(unchar b);
unchar CheckACK();
extern unchar bdata sta;
/*********************************************************/
#endif
/*****************************************
¹¦ÄÜ£ºNRF24L01É䯵ģ¿éCÎļþ(½Úµã·¢É䲿·Ö)
*****************************************/
#include"reg52.h"
#include"Allhead.h"
sbit CE=P2^0; //RX/TXģʽѡÔñ¶Ë
sbit CSN=P2^3; //SPIƬѡ¶Ë//¾ÍÊÇSS
sbit IRQ=P2^5; //¿ÉÆÁ±ÎÖж϶Ë
sbit MOSI=P2^4; //SPIÖ÷»úÊä³ö´Ó»úÊäÈë¶Ë
sbit MISO=P2^2; //SPIÖ÷»úÊä³ö´Ó»úÊä³ö¶Ë
sbit SCLK=P2^1; //SPIʱÖÓ¶Ë
unchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//·¢Ë͵ØÖ·
/*****************״̬±êÖ¾*****************************************/
unchar bdata sta; //״̬±êÖ¾
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
/********************LED¼ì²â*************************/
sbit LED=P1^4;
void LEDdelay(unsigned int c) //Îó²î 0us
{
unsigned char a, b;
//--cÒѾ­ÔÚ´«µÝ¹ýÀ´µÄʱºòÒѾ­¸³ÖµÁË£¬ËùÒÔÔÚforÓï¾äµÚÒ»¾ä¾Í²»Óø³ÖµÁË--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
/*****************SPIʱÐòº¯Êý******************************************/
unchar NRFSPI(unchar date)
{
unchar i;
for(i=0;i<8;i++) // Ñ­»·8´Î
{
if(date&0x80)
MOSI=1;//(date&0x80);
else
MOSI=0; // byte×î¸ßλÊä³öµ½MOSI
date<<=1; // µÍÒ»Î»ÒÆÎ»µ½×î¸ßλ
SCLK=1;
if(MISO) // À­¸ßSCK£¬nRF24L01´ÓMOSI¶ÁÈë1λÊý¾Ý£¬Í¬Ê±´ÓMISOÊä³ö1λÊý¾Ý
date|=0x01; // ¶ÁMISOµ½byte×îµÍλ
SCLK=0; // SCKÖõÍ
}
return(date); // ·µ»Ø¶Á³öµÄÒ»×Ö½Ú
}
/**********************NRF24L01³õʼ»¯º¯Êý*******************************/
void NRF24L01Int()
{
Delay(2);//ÈÃϵͳʲô¶¼²»¸É
CE=0; //´ý»úģʽ1
CSN=1;
SCLK=0;
IRQ=1;
}
/*****************SPI¶Á¼Ä´æÆ÷Ò»×Ö½Úº¯Êý*********************************/
unchar NRFReadReg(unchar RegAddr)
{
unchar BackDate;
CSN=0;//Æô¶¯Ê±Ðò
NRFSPI(RegAddr);//д¼Ä´æÆ÷µØÖ·
BackDate=NRFSPI(0x00);//дÈë¶Á¼Ä´æÆ÷Ö¸Áî
CSN=1;
return(BackDate); //·µ»Ø×´Ì¬
}
/*****************SPIд¼Ä´æÆ÷Ò»×Ö½Úº¯Êý*********************************/
unchar NRFWriteReg(unchar RegAddr,unchar date)
{
unchar BackDate;
CSN=0;//Æô¶¯Ê±Ðò
BackDate=NRFSPI(RegAddr);//дÈëµØÖ·
NRFSPI(date);//дÈëÖµ
CSN=1;
return(BackDate);
}
/*****************SPI¶ÁÈ¡RXFIFO¼Ä´æÆ÷µÄÖµ********************************/
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen)
{ //¼Ä´æÆ÷µØÖ·//¶ÁÈ¡Êý¾Ý´æ·Å±äÁ¿//¶ÁÈ¡Êý¾Ý³¤¶È//ÓÃÓÚ½ÓÊÕ
unchar BackDate,i;
CSN=0;//Æô¶¯Ê±Ðò
BackDate=NRFSPI(RegAddr);//дÈëÒª¶ÁÈ¡µÄ¼Ä´æÆ÷µØÖ·
for(i=0;i<DateLen;i++) //¶ÁÈ¡Êý¾Ý
{
RxDate[i]=NRFSPI(0);
}
CSN=1;
return(BackDate);
}
/*****************SPIдÈëTXFIFO¼Ä´æÆ÷µÄÖµ**********************************/
unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen)
{ //¼Ä´æÆ÷µØÖ·//дÈëÊý¾Ý´æ·Å±äÁ¿//¶ÁÈ¡Êý¾Ý³¤¶È//ÓÃÓÚ·¢ËÍ
unchar BackDate,i;
CSN=0;
BackDate=NRFSPI(RegAddr);//дÈëҪдÈë¼Ä´æÆ÷µÄµØÖ·
for(i=0;i<DateLen;i++)//дÈëÊý¾Ý
{
NRFSPI(*TxDate++);
}
CSN=1;
return(BackDate);
}
/*****************NRFÉèÖÃΪ·¢ËÍģʽ²¢·¢ËÍÊý¾Ý******************************/
void NRFSetTxMode(unchar *TxDate)
{//·¢ËÍģʽ
CE=0;
NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//д¼Ä´æÆ÷Ö¸Áî+½ÓÊÕµØÖ·Ê¹ÄÜÖ¸Áî+½ÓÊÕµØÖ·+µØÖ·¿í¶È
NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//ΪÁËÓ¦´ð½ÓÊÕÉ豸£¬½ÓÊÕͨµÀ0µØÖ·ºÍ·¢Ë͵ØÖ·Ïàͬ
NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//дÈëÊý¾Ý
NRFWriteReg(W_REGISTER+EN_AA,0x01); // ʹÄܽÓÊÕͨµÀ0×Ô¶¯Ó¦´ð
NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // ʹÄܽÓÊÕͨµÀ0
NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); // ×Ô¶¯ÖØ·¢ÑÓʱµÈ´ý250us+86us£¬×Ô¶¯ÖØ·¢10´Î
NRFWriteReg(W_REGISTER+RF_CH,0x40); // Ñ¡ÔñÉäÆµÍ¨µÀ0x40
NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // Êý¾Ý´«ÊäÂÊ1Mbps£¬·¢É书ÂÊ0dBm£¬µÍÔëÉù·Å´óÆ÷ÔöÒæ
NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRCʹÄÜ£¬16λCRCУÑ飬Éϵç
CE=1;
Delay(5);//±£³Ö10usÃëÒÔÉÏ
}
/*****************NRFÉèÖÃΪ½ÓÊÕģʽ²¢½ÓÊÕÊý¾Ý******************************/
//Ö÷Òª½ÓÊÕģʽ
void NRFSetRXMode()
{
CE=0;
NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH); // ½ÓÊÕÉ豸½ÓÊÕͨµÀ0ʹÓúͷ¢ËÍÉ豸ÏàͬµÄ·¢Ë͵ØÖ·
NRFWriteReg(W_REGISTER+EN_AA,0x01); // ʹÄܽÓÊÕͨµÀ0×Ô¶¯Ó¦´ð
NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // ʹÄܽÓÊÕͨµÀ0
NRFWriteReg(W_REGISTER+RF_CH,0x40); // Ñ¡ÔñÉäÆµÍ¨µÀ0x40
NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH); // ½ÓÊÕͨµÀ0Ñ¡ÔñºÍ·¢ËÍͨµÀÏàͬÓÐЧÊý¾Ý¿í¶È
NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // Êý¾Ý´«ÊäÂÊ1Mbps£¬·¢É书ÂÊ0dBm£¬µÍÔëÉù·Å´óÆ÷ÔöÒæ
NRFWriteReg(W_REGISTER+CONFIG,0x0f); // CRCʹÄÜ£¬16λCRCУÑ飬Éϵ磬½ÓÊÕģʽ
CE = 1;
Delay(5);//±£³Ö10usÃëÒÔÉÏ
}
/****************************¼ì²âÓ¦´ðÐźÅ******************************/
unchar CheckACK()
{ //ÓÃÓÚ·¢Éä
sta=NRFReadReg(R_REGISTER+STATUS); // ·µ»Ø×´Ì¬¼Ä´æÆ÷
if(TX_DS==1)fffffffffffffffffffffffffffffffffffffffffffffffffffffff//||MAX_RT) //·¢ËÍÍê±ÏÖжÏ
{
LED = 0; //ÖÃP0¿ÚΪµÍµçƽ
LEDdelay(50); //µ÷ÓÃÑÓʱ³ÌÐò£¬ÐÞ¸ÄÀ¨ºÅÀïÃæµÄÖµ¿ÉÒÔµ÷ÕûÑÓʱʱ¼ä
LED= 1; //ÖÃP0¿ÚΪ¸ßµçƽ
LEDdelay(50); // µ÷ÓÃÑÓʱ³ÌÐò
NRFWriteReg(W_REGISTER+STATUS,0xff); // Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
CSN=0;
NRFSPI(FLUSH_TX);//ÓÃÓÚÇå¿ÕFIFO £¡£¡¹Ø¼ü£¡£¡²»È»»á³öÏÖÒâÏë²»µ½µÄºó¹û£¡£¡£¡´ó¼Ò¼Çס£¡£¡
CSN=1;
return(0);
}
else
{
LED = 0; //ÖÃP0¿ÚΪµÍµçƽ
LEDdelay(200); //µ÷ÓÃÑÓʱ³ÌÐò£¬ÐÞ¸ÄÀ¨ºÅÀïÃæµÄÖµ¿ÉÒÔµ÷ÕûÑÓʱʱ¼ä
LED= 1; //ÖÃP0¿ÚΪ¸ßµçƽ
LEDdelay(200); // µ÷ÓÃÑÓʱ³ÌÐò
return(1);
}
}
/******************ÅжÏÊÇ·ñ½ÓÊÕÊÕµ½Êý¾Ý£¬½Óµ½¾Í´ÓRXÈ¡³ö*********************/
//ÓÃÓÚ½ÓÊÕģʽ
unchar NRFRevDate(unchar *RevDate)
{
unchar RevFlags=0;
sta=NRFReadReg(R_REGISTER+STATUS);//·¢ËÍÊý¾Ýºó¶Áȡ״̬¼Ä´æÆ÷
if(RX_DR) // ÅжÏÊÇ·ñ½ÓÊÕµ½Êý¾Ý
{
CE=0; //SPIʹÄÜ
NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);// ´ÓRXFIFO¶ÁÈ¡Êý¾Ý
RevFlags=1; //¶ÁÈ¡Êý¾ÝÍê³É±êÖ¾
}
NRFWriteReg(W_REGISTER+STATUS,0xff); //½ÓÊÕµ½Êý¾ÝºóRX_DR,TX_DS,MAX_PT¶¼ÖøßΪ1£¬Í¨¹ýд1À´Çå³þÖжϱê
return(RevFlags);
}
/*********************Ö÷º¯Êý***************************/
¹¦ÄÜ£ºNRF24L01É䯵ģ¿éCÎļþ(·¢É䲿·Ö)
*****************************************/
#include"reg52.h"
#include"Allhead.h"
#include"intrins.h"
void main()
{
//unchar ReadTempDate0;//,ReadTempDate1;//¶ÁȡζÈ
unchar TxDate0[4];//,TxDate1[4];
// unchar i=0;
delay1(10);
//iicInit(); //I2C×ÜÏß³õʼ»¯
//Set_Mode(0);
while(1)
{
//ADC_PCF8591(0x04);
//if(SystemError == 1) //ÓдíÎó£¬ÖØÐÂÀ´
//{
//iicInit(); //I2C×ÜÏß³õʼ»¯
//ADC_PCF8591(0x04);
//}
//ReadTempDate0=receivebuf[0];
NRF24L01Int();
TxDate0[0]=1;//ReadTempDate0/1000;
TxDate0[1]=2;//ReadTempDate0%1000/100;
TxDate0[2]=3;//ReadTempDate0%100/10;
TxDate0[3]=4;//ReadTempDate0%10;
NRFSetTxMode(TxDate0);//·¢ËÍζÈ
while(CheckACK());
}
} |
|