receive and send.docx

上传人:b****1 文档编号:274060 上传时间:2023-04-28 格式:DOCX 页数:21 大小:19.10KB
下载 相关 举报
receive and send.docx_第1页
第1页 / 共21页
receive and send.docx_第2页
第2页 / 共21页
receive and send.docx_第3页
第3页 / 共21页
receive and send.docx_第4页
第4页 / 共21页
receive and send.docx_第5页
第5页 / 共21页
receive and send.docx_第6页
第6页 / 共21页
receive and send.docx_第7页
第7页 / 共21页
receive and send.docx_第8页
第8页 / 共21页
receive and send.docx_第9页
第9页 / 共21页
receive and send.docx_第10页
第10页 / 共21页
receive and send.docx_第11页
第11页 / 共21页
receive and send.docx_第12页
第12页 / 共21页
receive and send.docx_第13页
第13页 / 共21页
receive and send.docx_第14页
第14页 / 共21页
receive and send.docx_第15页
第15页 / 共21页
receive and send.docx_第16页
第16页 / 共21页
receive and send.docx_第17页
第17页 / 共21页
receive and send.docx_第18页
第18页 / 共21页
receive and send.docx_第19页
第19页 / 共21页
receive and send.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

receive and send.docx

《receive and send.docx》由会员分享,可在线阅读,更多相关《receive and send.docx(21页珍藏版)》请在冰点文库上搜索。

receive and send.docx

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;i

pBuf[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;i

SPI_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;i

pBuf[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;i

SPI_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选择和发送通道相同有效数

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2