一下是我自己写的一段程序:
/*================================================== nRF2401 设置配置寄存器时序 =====================================================*/ //用于ByteRead 和 ByteWrite 函数
bdata uchar DATA_BUF; uchar ByteRead(void) //2401读数据函数 { uchar i;
for (i=0;i<8;i++) { DATA_BUF=DATA_BUF<<1;
DATA=1; //51系列读数据前先写1 DATA_BUF|=DATA; CLK1=1; CLK1=0; }
return DATA_BUF; }
void ByteWrite(uchar send) //2401写数据函数 { uchar i; uchar DATA_BUF;
DATA_BUF=send; for (i=0;i<8;i++) { if ((DATA_BUF&0x80)==0x80) //总是发送最高位 DATA=1; else { DATA=0; } CLK1=0; CLK1=1; DATA_BUF=DATA_BUF<<1; CLK1=0; } }
/* <2401 配置寄存器的写入方式>*/ void Config2401(void) { unsigned int i; uchar variablel; PWR_UP=1; //上电 CS=0; CE=0;
Delayms(1000);//进入配置方式需要延时
CS=1; //使RF2401 进入配置方式 Delayms(1);
CLK1=0;
for(i=0;i<18;i++) { variablel=nRF2401_Conf; ByteWrite(variablel); }
Delayms(1); CS=0; //CS 置低使配置有效 Delayms(1); }
void SetTxMode(void) //设置成发射模式 { //设置为配置模式 PWR_UP=1; CS=1; CE=0;
Delayms(1);
//配置寄存器0 字节RXEN 设置为0:发送模式 DATA=0;
CLK1=0; CLK1=1; CLK1=0;
//设置为Activemodes(Tx) CS=0; CE=1; Delayms(1); }
void SetRxMode(void) //设置成接收模式 { //设置为配置模式 PWR_UP = 1; CS=1; CE=0;
Delayms(1); //配置寄存器0 字节RXEN 设置为1:接收模式 DATA =1;
CLK1=0; CLK1=1; CLK1=0;
//设置为Activemodes(Rx) CS=0; CE=1; Delayms(1); }
//接收方通道硬件地址 uchar TxAddress[]={0x11,0x22,0x33,0x44,0x55};
//发射/接收数据 uchar TxBuf[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07} ; uchar RxBuf[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} ; //nRF2401 数据发送函数 void nRF2401_TxPacket(void) { uchar i; uchar variable2;
CS=0; CE=1;
_nop_(); _nop_();
for(i=0;i<5;i++) //写入接收地址(按字节对齐) { variable2=TxAddress; ByteWrite(variable2); } for(i=0;i<16;i++) //写入需要发送的数据(按字节对齐) { variable2=TxBuf; ByteWrite(variable2); }
CE=0; //CE 置低使发送有效 Delayms(1); } /*----------------------------------------------------------------*/
void nRF2401_RxPacket(void) //数据接收函数 { uchar i;
for (i=0; i<16; i++) { RxBuf = ByteRead(); } } /*****************主函数********************/ void main() { uchar k; P1=0x00; Delayms(100); //等待外部器件上电 LCD_Init(); //LCD初始化 Mcu_init(); Delayms(10); //************************************************************ Config2401(); // 必须执行的配置操作 Delayms(3); SetRxMode(); // 设置RF2401 为接收模式
while(1) {while(DR1==0); nRF2401_RxPacket(); LCD_Pos(0x40); for(i=0;i<16;i++) {LCD_WriteData(RxBuf) ; Delayms(10);} }
我想问下 1、我在查2401中文资料时说是 最高的3个配置位属于测试保留区,不用配置,但后来的英文资料又有如下说明: D121 D120 0 0 Open TX/Closed RX 0 1 Open TX/Open RX 1 0 Closed TX/Closed RX 1 1 Closed TX/Open RX
在实际的使用时 121 120 位按照默认配置0x1c时收不到数据 而改为 0x1d 时就可以收到数据。 但我看大家发的程序都没有去配置121 120位,这是为什么呢? 谢谢! 2、我先打开接收端,再开发射端,就一直收不到数据。但反过来先开发射,在开接受就能立刻收到数据。也是不得其解。 谢谢 我是刚进入电子行业的一名毕业大学生,还望各位大虾多多提携! 谢谢了! |