1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 352535455 于 2015-4-2 15:34 编辑
#include #include #include #define uint unsigned int #define uchar unsigned char ***it led = P1^7; ***it key=P3^0; ***it CSN = P2^0; //SPI片选,为0有效 ***it SCK = P2^1; //SPI时钟 ***it MISO = P2^2; //SPI输出 ***it MOSI = P2^3; //SPI输入 ***it DR = P2^4; //状态输出口4//数据准备好,数字输出 //配置口定义5 6 7 ///////PWR,TRX_CE,TXEN共同决定工作状态/////// ***it PWR = P2^5; //数字输入,工作状态选择 ***it TRX_CE = P2^6; //数字输入,发送或者接收状态 ***it TXEN = P2^7; //------1-发送,0-接收; //RF寄存器配置// unsigned char idata RFConf[11]= { 0x00,//配置命令// 0x6C,//CH_NO,配置频段在433.2MHZ 0x0E,//输出功率为10db,不重发,节电为正常模式 0x44,//地址宽度设置,为4字节 0x03,0x03, //接收发送有效数据长度为3字节 0xE7,0xE7,0xE7,0xE7,//接收地址 0xDE,//CRC充许,16位CRC校验,外部时钟信号使能,16M晶振 }; uchar TxRxBuffer[5]; bit lcdbit; ///////////延时///////////////// void Delay(uint x) { uint i; for(i=0;i } } ////////////用SPI口写数据至NRF905内////////// void SpiWrite(unsigned char b) { unsigned char i=8; while (i--) { Delay(10); SCK=0; MOSI=(bit)(b&0x80); b<<=1 ; Delay(10); SCK=1; Delay(10); SCK=0; } SCK=0; } ///////////////from 905 read data//////////////// unsigned char SpiRead(void) { register unsigned char i=8; unsigned char ddata=0; while (i--) { ddata<<=1 ; SCK=0; _nop_();_nop_(); ddata|=MISO; SCK=1 ; _nop_();_nop_(); } SCK=0; return ddata; } ///////////////接收数据包///////////////// void RxPacket(void) { uchar i; i=0; while(DR) { TxRxBuffer = SpiRead(); i++; } } /* ;写发射数据命令:20H ;读发射数据命令:21H ;写发射地址命令:22H ;读发射地址命令:23H ;读接收数据命令:24H */ void TxPacket(void) { TXEN=1; CSN=0; SpiWrite(0x22);//写发送地址,后面跟4字节地址// SpiWrite(0xE7); SpiWrite(0xE7); SpiWrite(0xE7); SpiWrite(0xE7); CSN=1; _nop_();_nop_(); CSN=0; SpiWrite(0x20);//写发送数据命令,后面跟三字节数据// SpiWrite(0x01); SpiWrite(0x02); SpiWrite(0x03); CSN=1; _nop_();_nop_(); TRX_CE=1;//使能发射模式// Delay(50);//等带发送完成// TRX_CE=0; while(!DR); } ////////////////等待接收数据包/////////////////// uchar temp; void Wait_Rec_Packet(void) { TXEN=0; TRX_CE=1; while(1) { if(DR) { TRX_CE=0;//如果数据准备好,则进入待机模式,以便SPI口操作 CSN=0; SpiWrite(0x24); RxPacket(); CSN=1; temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2]; if(temp==0x06){ led=0;//如果接收的数据正确 } break; } } } ////////////初始化配置寄存器//////////////// void Ini_System(void) { uchar i; //LCD=0; Delay(10000); // LCD=1; // lcdbit=1; CSN=1; SCK=0; PWR=1; TRX_CE=0; TXEN=0; _nop_(); CSN=0; for(i=0;i<11;i++){ SpiWrite(RFConf); } CSN=1; PWR=1; TRX_CE=1; TXEN=0; Delay(1000); } void main(void) { uchar i; Ini_System(); PWR=1; while(1) { if(key==0) { if(key==0) { TxPacket(); led=0; Delay(2000); } } } } 发送端 |
|
|
|
本帖最后由 352535455 于 2015-4-2 15:40 编辑
#include #include #include #define uint unsigned int #define uchar unsigned char ***it led = P1^0; ***it CSN = P2^0; //SPI片选,为0有效 ***it SCK = P2^1; //SPI时钟 ***it MISO = P2^2; //SPI输出 ***it MOSI = P2^3; //SPI输入 ***it DR = P2^4; //状态输出口4//数据准备好,数字输出 //配置口定义5 6 7 ///////PWR,TRX_CE,TXEN共同决定工作状态/////// ***it PWR = P2^5; //数字输入,工作状态选择 ***it TRX_CE = P2^6; //数字输入,发送或者接收状态 ***it TXEN = P2^7; //------1-发送,0-接收; //RF寄存器配置// unsigned char idata RFConf[11]= { 0x00,//配置命令// 0x6C,//CH_NO,配置频段在433.2MHZ 0x0E,//输出功率为10db,不重发,节电为正常模式 0x44,//地址宽度设置,为4字节 0x03,0x03, //接收发送有效数据长度为3字节 0xE7,0xE7,0xE7,0xE7,//接收地址 0xDE,//CRC充许,16位CRC校验,外部时钟信号使能,16M晶振 }; uchar TxRxBuffer[5]; bit lcdbit; ///////////延时///////////////// void Delay(uint x) { uint i; for(i=0;i } } ////////////用SPI口写数据至NRF905内////////// void SpiWrite(unsigned char b) { unsigned char i=8; while (i--) { Delay(10); SCK=0; MOSI=(bit)(b&0x80); b<<=1 ; Delay(10); SCK=1; Delay(10); SCK=0; } SCK=0; } ///////////////from 905 read data//////////////// unsigned char SpiRead(void) { register unsigned char i=8; unsigned char ddata=0; while (i--) { ddata<<=1 ; SCK=0; _nop_();_nop_(); ddata|=MISO; SCK=1 ; _nop_();_nop_(); } SCK=0; return ddata; } ///////////////接收数据包///////////////// void RxPacket(void) { uchar i; i=0; while(DR) { TxRxBuffer = SpiRead(); i++; } } /* ;写发射数据命令:20H ;读发射数据命令:21H ;写发射地址命令:22H ;读发射地址命令:23H ;读接收数据命令:24H */ void TxPacket(void) { TXEN=1; CSN=0; SpiWrite(0x22);//写发送地址,后面跟4字节地址// SpiWrite(0xE7); SpiWrite(0xE7); SpiWrite(0xE7); SpiWrite(0xE7); CSN=1; _nop_();_nop_(); CSN=0; SpiWrite(0x20);//写发送数据命令,后面跟三字节数据// SpiWrite(0x01); SpiWrite(0x02); SpiWrite(0x03); CSN=1; _nop_();_nop_(); TRX_CE=1;//使能发射模式// Delay(50);//等带发送完成// TRX_CE=0; while(!DR); } ////////////////等待接收数据包/////////////////// uchar temp; void Wait_Rec_Packet(void) { TXEN=0; TRX_CE=1; while(1) { if(DR) { TRX_CE=0;//如果数据准备好,则进入待机模式,以便SPI口操作 CSN=0; SpiWrite(0x24); RxPacket(); CSN=1; temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2]; if(temp==0x06){ led=0;//如果接收的数据正确 } break; } } } ////////////初始化配置寄存器//////////////// void Ini_System(void) { uchar i; //LCD=0; Delay(10000); // LCD=1; // lcdbit=1; CSN=1; SCK=0; PWR=1; TRX_CE=0; TXEN=0; _nop_(); CSN=0; for(i=0;i<11;i++){ SpiWrite(RFConf); } CSN=1; PWR=1; TRX_CE=1; TXEN=0; Delay(1000); } void main(void) { // uchar i; Ini_System(); PWR=1; while(1) { Wait_Rec_Packet();//等待接收完成 } } 接收端 |
|
|
|
如果紧挨在一起的时候是可以通信的,我觉得可能程序可能问题不是太大。你用的是905的集成好的模块还是自己做的板子呀?如果是买的模块回来用单片机驱动的话,有可能是你的寄存器配置有问题,从而影响了模块的通信距离。有些模块设计的时候只在某个工作频段表现良好的。所以如果是模块的话,建议你看一下模块的技术手册,上面建议的工作频段是多少哦。希望可以帮到您,,,加油
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
846 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
820 浏览 0 评论
910 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1693 浏览 0 评论
1307 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12076 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 22:45 , Processed in 0.573847 second(s), Total 75, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号