最近有人过来问2401的调试问题,在这里把调试过程中应该注意的问题简要说明如下:
1.nRF2401是3.3V供电的,电压过低或过高都会对通信造成影响,要么不能完全通信要么断断续续地通信,至于怎么稳压到3.3V,可以采用稳压二级管,可以使用LM317,这几种方法都试用过,都可行。
2.一般的微处理器的I/O口电压为5V,而2401的I/O口电压为3.3V,若直接相连,容易烧坏2401,可以采用串连2K电阻的方法,也可以使用3.3V和5V电平转换芯片如74LVX3245。
3.至于程序部分,一两句话也说不清楚,请仔细阅读nRF2401的使用说明书。下面公布一段2401程序仅供参考,此程序多次修改,久经考验,应该没有问题。
2401.h下面的代码 //说明:nRF2401 CE脚控制收发使能,CS控制片选,均为高电平有效 //===============引脚定义======================= #define nRF2401_CE_PORT PORTD.1// #define nRF2401_CE_DDR DDRD.1// #define nRF2401_PWR_PORT PORTD.0// #define nRF2401_PWR_DDR DDRD.0// #define nRF2401_CS_PORT PORTD.3// #define nRF2401_CS_DDR DDRD.3// #define nRF2401_CLK1_PORT PORTD.5// #define nRF2401_CLK1_DDR DDRD.5// #define nRF2401_DATA1_PORT PORTD.4 #define nRF2401_DATA1_DDR DDRD.4 #define nRF2401_DATA1_PIN PIND.4 #define nRF2401_DR1_PORT PORTD.2// #define nRF2401_DR1_DDR DDRD.2// #define nRF2401_DR1_PIN PIND.2// unsigned char Address[4]={0x00,0x00,0x00,0x99}; //===================配置字定义================================ unsigned char nRF2401_InitData[15]={ //设配置字 //test 8,8, //通道2与通道1数据宽度设置为8位 0,0,0,0,57, //通道2接收地址 0x00,0x00,0x00,0x00,0x99, //通道1接收地址 0x83, //通道1和通道2地址宽度为32位,开CRC,16位,CRC 校验 0x6F, //4F //双频道功能禁用,ShockBurst mode,传输速率1M,晶振频率16M 0x02 //Channel = 2400MHz + RF_CH * 1.0MHz ,发送模式 }; //0:Tx 1:Rx //=========================================================== //===================发送单字节数据============================== void nRF2401_SendByte(unsigned char Data) { unsigned char i; nRF2401_DATA1_DDR = 1; for(i=0;i<8;i++) { if((Data&0x80)!=0) nRF2401_DATA1_PORT=1; else nRF2401_DATA1_PORT=0; delay_us(1); //最小500ns nRF2401_CLK1_PORT=1; delay_us(1);//最小500ns Data<<=1; nRF2401_CLK1_PORT=0; delay_us(1); } } //=========================================================== //==================从nRF2401A数据缓冲区读取数据================== void nRF2401_GetData(unsigned char *DataBuffer) { unsigned char i=0,temp=0; nRF2401_DATA1_DDR = 0;//数据输入 while(nRF2401_DR1_PIN) { for(i=0;i<8;i++) { temp<<=1; nRF2401_CLK1_PORT=1;delay_us(1); temp|=nRF2401_DATA1_PIN; nRF2401_CLK1_PORT=0;delay_us(1); } } *DataBuffer=temp; } //=====================nRF2401A发送/接收方式设置================= //Mode=0:发送方式 Mode=1:接收方式 void nRF2401_SetMode(unsigned char Mode) { nRF2401_PWR_PORT=1;nRF2401_CE_PORT=0;nRF2401_CS_PORT=1;//设置模式 nRF2401_DATA1_DDR = 1; delay_us(10); //最小5us进入配置模式 nRF2401_DATA1_PORT=Mode; nRF2401_CLK1_PORT=1;delay_us(1); nRF2401_CLK1_PORT=0;delay_us(1); //写入最低配置位 nRF2401_PWR_PORT=1;nRF2401_CS_PORT=0;nRF2401_CE_PORT=1; //进入收发模式、 delay_us(300); } //=========================================================== //====================数据发送================================= void nRF2401_SendData(unsigned char *Address,unsigned char DataBuffer) { unsigned char i=4; nRF2401_PWR_PORT=1;nRF2401_CS_PORT=0;nRF2401_CE_PORT=1; //进入收发模式 delay_us(10); while(i--)nRF2401_SendByte(*Address++); //发送地址字节 nRF2401_SendByte(DataBuffer); //发送数据字节 nRF2401_CE_PORT=0; //发射数据 delay_us(300); //等待结束 } //=========================================================== //======================初始化=============================== void nRF2401_Init() { unsigned char i; nRF2401_CLK1_DDR=1; nRF2401_DATA1_DDR=1; nRF2401_CS_DDR = 1; nRF2401_CE_DDR = 1; nRF2401_PWR_DDR = 1; nRF2401_DR1_DDR = 0; nRF2401_DR1_PORT=0; nRF2401_CLK1_PORT=0; nRF2401_DATA1_PORT=0; nRF2401_CE_PORT=0; nRF2401_CS_PORT=0;//空闲模式,低功耗 nRF2401_PWR_PORT=1;//上电 delay_ms(5);//从上电到进入配置模式最大 3ms 的延时 nRF2401_CS_PORT=1;//进入配置模式 delay_us(10); //最小5us for(i=0;i<15;i++)nRF2401_SendByte(nRF2401_InitData[i]); delay_us(10); nRF2401_CS_PORT=0; //低功耗模式 delay_ms(6); } //=========================================================== 现将发送部分和接收部分的程序一并贴上 发送部分: //=======单片机:ATmega16,编译器:CodeVision v1.24========== #include#include #include "2401.h" unsigned char a=0; main() { nRF2401_Init(); nRF2401_SetMode(0);//发送模式 while(1) { nRF2401_SendData(Address,a++); delay_ms(100); } } 接收部分: //=======单片机:ATmega16,编译器:CodeVision v1.24========== //==== 采用的是中断接收方式================================= //Writen by ChenZhou #include #include #include "2401.h" unsigned char a=0; main() { MCUCR=0X03;GICR=0X40;#asm("sei");//启用外部中断INT0,上升沿中断 nRF2401_Init(); nRF2401_SetMode(1);//接收模式 while(1) { //=========在这里显示变量a的数值即可,若为0到225则是正确的 delay_ms(10); } } interrupt [2] void int0(void) { nRF2401_GetData(&a); }
上一篇:边显示滚动汉字边播放音乐的汇编程序
下一篇:AT89s52-LCD12864多页菜单按键选择操作
推荐阅读最新更新时间:2024-03-16 13:06
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况