完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
很简单,就是一端发送一个数据,另外一端接收送给P0。但是没任何放反应
发送端: #include #include"api.h" #define uchar unsigned char /***************************************************/ #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 //#define LED P2 //***it k1=P0^0; uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址 uchar RX_BUF[TX_PLOAD_WIDTH];//RX_BUF[4] uchar TX_BUF[TX_PLOAD_WIDTH]; uchar flag; uchar DATA = 0xaa; uchar bdata sta; //bdata,可位寻址的变量 ***it RX_DR = sta^6; ***it TX_DS = sta^5; ***it MAX_RT = sta^4; void init_io(void) //初始化IO { CE = 0; // 待机 CSN = 1; // SPI禁止 SCK = 0; // SPI时钟置低 IRQ = 1; // 中断复位 // LED = 0xff; // 关闭指示灯 } void delay_ms(uchar x) //延时xms函数 { uchar i, j; i = 0; for(i=0; i j = 250; while(--j); j = 250; while(--j); } } uchar SPI_RW(uchar byte) //SPI写一个字节,同时返回状态字 { uchar i; for(i=0; i<8; i++) // 循环8次 { MOSI = (byte & 0x80); // byte最高位输出到MOSI(主输出从输入) byte <<= 1; // 低一位移位到最高位 SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; // 读MISO到byte最低位 SCK = 0; // SCK置低 } return(byte); // 返回读出的一字节 } uchar SPI_Read(uchar reg) //从寄存器读一字节 { uchar reg_val; CSN = 0; // CSN置低,开始传输数据 SPI_RW(reg); // 选择寄存器 reg_val = SPI_RW(0); // 然后从该寄存器读数据 CSN = 1; // CSN拉高,结束数据传输 return(reg_val); // 返回寄存器数据 } uchar SPI_RW_Reg(uchar reg, uchar value) //写value到寄存器 { uchar status; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字(写一字节reg到nrf24l01和返回reg一字节到nrf24l01) SPI_RW(value); // 然后写数据到该寄存器 CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) //把数组里的数发送到nrf24l01 { uchar status, i; CSN = 0; // CSN置低,开始传输数据,片选线,为低时开始工作 status = SPI_RW(reg); // 选择寄存器,同时返回状态字,将字节reg写入nrf24l01同时读出一个字节赋给status for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } //uchar Check_ACK(bit clear) //检查接收设备有没有收到数据 //{ // while(IRQ); // sta = SPI_RW(NOP); // 返回状态寄存器 // if(MAX_RT) // if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发 // SPI_RW(FLUSH_TX); // SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志 // IRQ = 1; // if(TX_DS) // return(0x00); // else // return(0xff); //} uchar CheckACK() { //用于发射 sta=SPI_Read(READ_REG+STATUS); // 返回状态寄存器 if(TX_DS||MAX_RT) //发送完毕中断 { SPI_RW_Reg(WRITE_REG+STATUS,0xff); // 清除TX_DS或MAX_RT中断标志 CSN=0; SPI_RW(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!! CSN=1; return(1); } else return(0); } void TX_Mode(uchar * BUF) //发送模式,参数为要发送的数据 { CE = 0;//模式控制线,在低的情况下协同CONFLIG寄存器共同决定NRF24L01的状态 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO 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,0x40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 CE = 1; delay_ms(50); } //void RX_Mode(void) //接收模式,等待发送设备的数据包 //{ // CE = 0; //// (0x20+0x0a,数组[5],5), ///*写rx节点的地址RX_ADDR_P0*/SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址(0x00+0x0a) //// (0x20+0x01,0x01) ///*使能AUTO ACKEN_AA*/SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 ////(0x20+ ///*使能PIPE0EN_RXADDR*/SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 ///*选择通信频率RF_CH*/SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 ///*选择通道0 有效数据宽度Rx_Pw_P0*/SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 ///*配置发射参数RF_SETUP*/SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 ///*配置24l01的基本参数以及切换工作模式CONFIG*/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 // CE = 1; // 拉高CE启动接收设备 //} //void keyscan() //按键扫描函数 //{ // init_io(); // if(k1==0) // { // delay_ms(5); // if(k1==0) // { // TX_BUF[0] = DATA; // 数据送到缓存 // TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据 // P0=DATA; // 数据送到LED显示 // Check_ACK(1); // 等待发送完毕,清除TX FIFO // delay_ms(250); // delay_ms(250); // P0= 0xff; // 关闭LED //// RX_Mode(); // 设置为接收模式 //// while(!(P3 & 0x01)); //// DATA <<= 1; //// if(!DATA) //// DATA = 0x01; // } // } //} void main() { init_io(); // keyscan(); TX_BUF[0] = DATA; // 数据送到缓存 TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据 // P0=DATA; // 数据送到LED显示 // CheckACK(); // 等待发送完毕,清除TX FIFO delay_ms(250); delay_ms(250); // RX_Mode(); // DATA <<= 1; // if(!DATA) // DATA = 0x01; // P0= 0xff; while(CheckACK()); while(1); } 接收端: #include #include"api.h" #define uchar unsigned char #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址 uchar RX_BUF[TX_PLOAD_WIDTH];//RX_BUF[4] uchar TX_BUF[TX_PLOAD_WIDTH]; uchar flag; uchar bdata sta;//bdata,可位寻址的变量 ***it RX_DR = sta^6; ***it TX_DS = sta^5; ***it MAX_RT = sta^4; void init_io(void) //初始化IO { CE = 0; // 待机 CSN = 1; // SPI禁止 SCK = 0; // SPI时钟置低 IRQ = 1; // 中断复位 // P0 = 0xff; // 关闭指示灯 } void delay_ms(uchar x) //延时函数 { uchar i, j; i = 0; for(i=0; i j = 250; while(--j); j = 250; while(--j); } } uchar SPI_RW(uchar byte) //SPI写函数 { uchar i; for(i=0; i<8; i++) // 循环8次 { MOSI = (byte & 0x80); // byte最高位输出到MOSI(主输出从输入) byte <<= 1; // 低一位移位到最高位 SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; // 读MISO到byte最低位 SCK = 0; // SCK置低 } return(byte); // 返回读出的一字节 } uchar SPI_RW_Reg(uchar reg, uchar value) //写value到寄存器 { uchar status; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字(写一字节reg到nrf24l01和返回reg一字节到nrf24l01) SPI_RW(value); // 然后写数据到该寄存器 CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } uchar SPI_Read(uchar reg) //从寄存器读一字节 { uchar reg_val; CSN = 0; // CSN置低,开始传输数据 SPI_RW(reg); // 选择寄存器 reg_val = SPI_RW(0); // 然后从该寄存器读数据 CSN = 1; // CSN拉高,结束数据传输 return(reg_val); // 返回寄存器数据 } uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)//读取接收通道数据 { uchar status, i; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); //将reg输出,同时输入给status,选择寄存器,同时返回状态字 for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN = 0; // CSN置低,开始传输数据,片选线,为低时开始工作 status = SPI_RW(reg); // 选择寄存器,同时返回状态字,将字节reg写入nrf24l01同时读出一个字节赋给status for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } void RX_Mode(void) //接收模式,等待发送设备的数据包 { CE = 0; // (0x20+0x0a,数组[5],5), /*写rx节点的地址RX_ADDR_P0*/SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址(0x00+0x0a) // (0x20+0x01,0x01) /*使能AUTO ACKEN_AA*/SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 //(0x20+ /*使能PIPE0EN_RXADDR*/SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 /*选择通信频率RF_CH*/SPI_RW_Reg(WRITE_REG + RF_CH,0x40); // 选择射频通道0x40 /*选择通道0 有效数据宽度Rx_Pw_P0*/SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 /*配置发射参数RF_SETUP*/SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 /*配置24l01的基本参数以及切换工作模式CONFIG*/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 CE = 1; delay_ms(50); // 拉高CE启动接收设备 } void main(void) { init_io();// 初始化IO RX_Mode(); // 设置为接收模式 P0=0x00; while(1) { // P0= RX_BUF[0]; sta = SPI_Read(STATUS); //读取status寄存器的值,从寄存器读一个字节,参数为寄存器地址 读状态寄存器(uchar bdata sta,bdata为可位寻址的变量) if(RX_DR)// 判断是否接受到数据(rx_dr=sta^6;) { //(rx_payload地址,rx_buf[4],4,读出的数据放入rx_buf[]中 SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);//从RXFIFO读出数据(从寄存器读出bytes个字节,通常用来读取接收通道,数据或接收/发送地址) flag = 1; // P0 = 0x0f; } SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除RX_DS中断标志 if(flag) // 接受完成 { flag = 0;// 清标志 P0= RX_BUF[0];//数据送到LED显示(指第一个字节??) delay_ms(250); delay_ms(250); // P0=0x0f; // while(1); } } } |
|
相关推荐
2个回答
|
|
留个邮箱 回去我发给你代码
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12037 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 06:53 , Processed in 0.512429 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号