receive and send.docx
《receive and send.docx》由会员分享,可在线阅读,更多相关《receive and send.docx(21页珍藏版)》请在冰点文库上搜索。
![receive and send.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/c22ce67b-ed74-4434-9f32-1e6565dcdcd2/c22ce67b-ed74-4434-9f32-1e6565dcdcd21.gif)
receiveandsend
//*文件1主程序后边附有文件2为函数程序*//
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineIRQ1PORTC|=BIT(5)
#defineIRQ0PORTC&=~BIT(5)
#defineIRQIDDRC|=BIT(5)//1是输出模式
#defineIRQODDRC&=~BIT(5)//0是输入模式
#defineCE1PORTC|=BIT(0)
#defineCE0PORTC&=~BIT(0)
#defineCEIDDRC|=BIT(0)
#defineCSN1PORTC|=BIT
(1)
#defineCSN0PORTC&=~BIT
(1)
#defineCSNIDDRC|=BIT
(1)
#defineSCK1PORTC|=BIT
(2)
#defineSCK0PORTC&=~BIT
(2)
#defineSCKIDDRC|=BIT
(2)
#defineSO1PORTC|=BIT(4)
#defineSO0PORTC&=~BIT(4)
#defineSOODDRC&=BIT(4)
#defineSI1PORTC|=BIT(3)
#defineSI0PORTC&=~BIT(3)
#defineSIIDDRC|=BIT(3)
///***************************************NRF24L01寄存器指令*******************************************************
#defineREAD_REG0x00//读寄存器指令
#defineWRITE_REG0x20//写寄存器指令
#defineRD_RX_PLOAD0x61//读取接收数据指令
#defineWR_TX_PLOAD0xA0//写待发数据指令
#defineFLUSH_TX0xE1//冲洗发送FIFO指令
#defineFLUSH_RX0xE2//冲洗接收FIFO指令
#defineREUSE_TX_PL0xE3//定义重复装载数据指令
#defineNOP0xFF//保留
///*************************************SPI(nRF24L01)寄存器地址****************************************************
#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#defineEN_AA0x01//自动应答功能设置
#defineEN_RXADDR0x02//可用信道设置
#defineSETUP_AW0x03//收发地址宽度设置
#defineSETUP_RETR0x04//自动重发功能设置
#defineRF_CH0x05//工作频率设置
#defineRF_SETUP0x06//发射速率、功耗功能设置
#defineSTATUS0x07//状态寄存器
#defineOBSERVE_TX0x08//发送监测功能
#defineCD0x09//地址检测
#defineRX_ADDR_P00x0A//频道0接收数据地址
#defineRX_ADDR_P10x0B//频道1接收数据地址
#defineRX_ADDR_P20x0C//频道2接收数据地址
#defineRX_ADDR_P30x0D//频道3接收数据地址
#defineRX_ADDR_P40x0E//频道4接收数据地址
#defineRX_ADDR_P50x0F//频道5接收数据地址
#defineTX_ADDR0x10//发送地址寄存器
#defineRX_PW_P00x11//接收频道0接收数据长度
#defineRX_PW_P10x12//接收频道1接收数据长度
#defineRX_PW_P20x13//接收频道2接收数据长度
#defineRX_PW_P30x14//接收频道3接收数据长度
#defineRX_PW_P40x15//接收频道4接收数据长度
#defineRX_PW_P50x16//接收频道5接收数据长度
#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置
///**************************************************************************************
#defineTX_ADR_WIDTH5
#defineTX_PLOAD_WIDTH5
ucharTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个静态发送地址
ucharRX_ADDRESS[TX_ADR_WIDTH]={0x034,0x43,0x10,0x10,0x01};
ucharRX_BUF[TX_PLOAD_WIDTH];
ucharTX_BUF[TX_PLOAD_WIDTH]={0x0f};
ucharRECEIVE[TX_PLOAD_WIDTH];
ucharflag;
ucharsta;
voiddelay(uintms)
{
uinti,j;
for(i=0;i{
for(j=0;j<1141;j++);
}
}
//初始化
voidinit(void)
{
CEI;
CSNI;
SCKI;
SII;
IRQO;
SOO;
//IRQ=A5,CE=A4,CSN=A3,SCK=A2,MISO=A1,MOSI=A0
CE0;
CSN1;
SCK0;
}
//写/读一字节
ucharSPI_RW(ucharbyte)
{
uchari;
for(i=0;i<8;i++)
{
if((byte&0x80)==1)
SI1;
else
SI0;
byte<<=1;
SCK1;
byte|=SO1;
SCK0;
}
return(byte);
}
//写数据value至reg寄存器
ucharSPI_RW_Reg(ucharreg,ucharvalue)
{
ucharstatus;
CSN0;
status=SPI_RW(reg);
SPI_RW(value);
CSN1;
return(status);
}
//从reg寄存器读一字节
ucharSPI_Read(ucharreg)
{
ucharreg_val;
CSN0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN1;
return(reg_val);
}
//从reg寄存器读出bytes个字节
ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbytes)
{
ucharstatus,i;
CSN0;
status=SPI_RW(reg);
for(i=0;ipBuf[i]=SPI_RW(0);
CSN1;
return(status);
}
//把pBuf缓存中的数据写入到nRF24L01
ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbytes)
{
ucharstatus,i;
CSN0;
status=SPI_RW(reg);
for(i=0;iSPI_RW(pBuf[i]);
CSN1;
return(status);
}
//设置nRF24L01为接收模式,等待接收发送设备的数据包
voidRX_Mode(void)
{
CE0;
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
SPI_RW_Reg(WRITE_REG+RF_CH,40);//选择射频通道0x40
SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//CRC使能,16位CRC校验,上电,接收模式
CE1;
}
//设置nRF24L01为发送模式
voidTX_Mode(uchar*BUF)
{
CE0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//写入发送地址,TX_ADDR是本//机身份地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//为了应答接收设备,接收通//道0地址和发送地址相同
SPI_Write_Buf(WR_TX_PLOAD,BUF,TX_PLOAD_WIDTH);//写数据包到TXFIFO
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x0a);//自动重发延时等待250us+86us,自动重发10次
SPI_RW_Reg(WRITE_REG+RF_CH,40);//选择射频通道0x40
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//CRC使能,16位CRC校验,上电
CE1;
}
//检查接收设备有无接收到数据包
ucharCheck_ACK(ucharclear)
{
while(IRQ1);
sta=SPI_RW(NOP);//返回状态寄存器
if(sta&0x10)
if(clear&0x01)//是否清除TXFIFO,没有清除在复位MAX_RT中断标志后重发
SPI_RW(FLUSH_TX);
SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除TX_DS或MAX_RT中断标志
IRQI;
IRQ1;
if(sta&0x20)
return(0x00);//收到
//PORTE=0x80;
//delay(500);
else
return(0xff);//没收到
//PORTE=0x00;
}
//voidsendmessage(uchardata1)
//{
//TX_BUF[0]=data1;
//TX_Mode(TX_BUF);
//Check_ACK(0x01);
//delay(500);
//RX_Mode();
//}
voidmain(void)
{
init();
RX_Mode();
while
(1)
{
sta=SPI_Read(STATUS);
if(sta&0x40)
{
SPI_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);
flag=1;
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
if(flag)
{
flag=0;
PORTB=RX_BUF[0];
}
}
//ucharmessage,i;
//init();
//RX_Mode();
//while
(1)
//{
//sendmessage(message);
//sta=SPI_Read(STATUS);
//if(sta&0x40)
//{
//SPI_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);
//flag=1;
//}
//SPI_RW_Reg(WRITE_REG+STATUS,sta);
//if(flag)
//{
//flag=0;
//for(i=0;i//{
//RECEIVE[i]=RX_BUF[i];
//}
//delay(500);
//}
//}
}
//*文件1主程序后边附有文件2为函数程序*//
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineIRQ1PORTC|=BIT(5)
#defineIRQ0PORTC&=~BIT(5)
#defineIRQIDDRC|=BIT(5)//1是输出模式
#defineIRQODDRC&=~BIT(5)//0是输入模式
#defineCE1PORTC|=BIT(0)
#defineCE0PORTC&=~BIT(0)
#defineCEIDDRC|=BIT(0)
#defineCSN1PORTC|=BIT
(1)
#defineCSN0PORTC&=~BIT
(1)
#defineCSNIDDRC|=BIT
(1)
#defineSCK1PORTC|=BIT
(2)
#defineSCK0PORTC&=~BIT
(2)
#defineSCKIDDRC|=BIT
(2)
#defineSO1PORTC|=BIT(4)
#defineSO0PORTC&=~BIT(4)
#defineSOODDRC&=BIT(4)
#defineSI1PORTC|=BIT(3)
#defineSI0PORTC&=~BIT(3)
#defineSIIDDRC|=BIT(3)
///***************************************NRF24L01寄存器指令*******************************************************
#defineREAD_REG0x00//读寄存器指令
#defineWRITE_REG0x20//写寄存器指令
#defineRD_RX_PLOAD0x61//读取接收数据指令
#defineWR_TX_PLOAD0xA0//写待发数据指令
#defineFLUSH_TX0xE1//冲洗发送FIFO指令
#defineFLUSH_RX0xE2//冲洗接收FIFO指令
#defineREUSE_TX_PL0xE3//定义重复装载数据指令
#defineNOP0xFF//保留
///*************************************SPI(nRF24L01)寄存器地址****************************************************
#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#defineEN_AA0x01//自动应答功能设置
#defineEN_RXADDR0x02//可用信道设置
#defineSETUP_AW0x03//收发地址宽度设置
#defineSETUP_RETR0x04//自动重发功能设置
#defineRF_CH0x05//工作频率设置
#defineRF_SETUP0x06//发射速率、功耗功能设置
#defineSTATUS0x07//状态寄存器
#defineOBSERVE_TX0x08//发送监测功能
#defineCD0x09//地址检测
#defineRX_ADDR_P00x0A//频道0接收数据地址
#defineRX_ADDR_P10x0B//频道1接收数据地址
#defineRX_ADDR_P20x0C//频道2接收数据地址
#defineRX_ADDR_P30x0D//频道3接收数据地址
#defineRX_ADDR_P40x0E//频道4接收数据地址
#defineRX_ADDR_P50x0F//频道5接收数据地址
#defineTX_ADDR0x10//发送地址寄存器
#defineRX_PW_P00x11//接收频道0接收数据长度
#defineRX_PW_P10x12//接收频道1接收数据长度
#defineRX_PW_P20x13//接收频道2接收数据长度
#defineRX_PW_P30x14//接收频道3接收数据长度
#defineRX_PW_P40x15//接收频道4接收数据长度
#defineRX_PW_P50x16//接收频道5接收数据长度
#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置
///**************************************************************************************
#defineTX_ADR_WIDTH5
#defineTX_PLOAD_WIDTH5
ucharTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个静态发送地址
ucharRX_ADDRESS[TX_ADR_WIDTH]={0x034,0x43,0x10,0x10,0x01};
ucharRX_BUF[TX_PLOAD_WIDTH];
ucharTX_BUF[TX_PLOAD_WIDTH];
ucharRECEIVE[TX_PLOAD_WIDTH];
ucharflag;
ucharsta;
voiddelay(uintms)
{
uinti,j;
for(i=0;i{
for(j=0;j<1141;j++);
}
}
//初始化
voidinit(void)
{
CEI;
CSNI;
SCKI;
SII;
IRQO;
SOO;
//IRQ=A5,CE=A4,CSN=A3,SCK=A2,MISO=A1,MOSI=A0
CE0;
CSN1;
SCK0;
}
//写/读一字节
ucharSPI_RW(ucharbyte)
{
uchari;
for(i=0;i<8;i++)
{
if((byte&0x80)==1)
SI1;
else
SI0;
byte<<=1;
SCK1;
byte|=SO1;
SCK0;
}
return(byte);
}
//写数据value至reg寄存器
ucharSPI_RW_Reg(ucharreg,ucharvalue)
{
ucharstatus;
CSN0;
status=SPI_RW(reg);
SPI_RW(value);
CSN1;
return(status);
}
//从reg寄存器读一字节
ucharSPI_Read(ucharreg)
{
ucharreg_val;
CSN0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN1;
return(reg_val);
}
//从reg寄存器读出bytes个字节
ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbytes)
{
ucharstatus,i;
CSN0;
status=SPI_RW(reg);
for(i=0;ipBuf[i]=SPI_RW(0);
CSN1;
return(status);
}
//把pBuf缓存中的数据写入到nRF24L01
ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbytes)
{
ucharstatus,i;
CSN0;
status=SPI_RW(reg);
for(i=0;iSPI_RW(pBuf[i]);
CSN1;
return(status);
}
//设置nRF24L01为接收模式,等待接收发送设备的数据包
voidRX_Mode(void)
{
CE0;
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
SPI_RW_Reg(WRITE_REG+RF_CH,40);//选择射频通道0x40
SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//接收通道0选择和发送通道相同有效数