ningling_21 发表于 2014-10-24 13:35 
就是读写它的寄存器的程序
我又仔细的检查了一遍程序,感觉挺完整的!!!不知道哪里出了问题:
我附上我的程序,希望你能看看!!!万分感谢!!!
- uint8 x=0;
- void main() //主程序
- {
- nrf2401_init();
- delay(10000);
- while(1)
- {
- if(KEY_1==0)
- {
- x=1;
- }while(!KEY_1);
- if(x)
- {
- NRF_Write(buffer1,5);
- while(NRF_CheckACK()); //判断是否有发送完成中断或发送超出最大重发中断
- P36=~P36; //用于直观显示是否检测到中断
- }
- P1=NRFReadReg(R_REGISTER+STATUS); //显示状态寄存器是否为0x2e
- P2=NRFReadReg(R_REGISTER+FIFO_STATUS);
- }
- void nrf2401_init()
- {
- delay(30);//让系统什么都不干 //由系统Debuge session调试得到(delay(30)延时时间大约为1.45ms)
- CE_NRF2401=0;//确保nrf2401在待机模式1,
- CSN=1; //SPI disable
- SCK=0;
- IRQ_NRF2401=1;//中断引脚拉高
- NRFWriteReg(W_REGISTER+EN_AA,0X00); //关闭自动应答
- NRFWriteReg(W_REGISTER+EN_RXADDR,0X00); //关闭接受通道
- NRFWriteReg(W_REGISTER+RF_CH,0X50); //设置射频通道的运行频率 收发频率必须一致
- NRFWriteReg(W_REGISTER+SETUP_RETR,0X00); // 不自动重发
- NRFWriteReg(W_REGISTER+RF_SETUP,0X0d); //2Mbps,发射功率0dB,低噪声放大器
- NRFWriteTxData(W_REGISTER+RX_ADDR_P1,RxAddr,RX_ADDR_WITDH); //写接收端地址,采用通道1作为模块的接受通道(接受设备通道地址1,使用和发送设备相同的地址--定义在另一个工程的收发地址恰好和本工程相反)
- NRFWriteReg(W_REGISTER+RX_PW_P1,RX_ADDR_WITDH); //接收通道1 数据宽度设置
- CE_NRF2401=1;
- delay(30);//保持10us秒以上
- }
- uint8 NRFWriteReg(uint8 RegAddr,uint8 Data) //SPI写指令到NRF24L01
- {
- uint8 BackData;
- CSN=0; //启动时序
- BackData=NRFSPI(RegAddr); //写指令
- NRFSPI(Data); //写数据,从NRF24L01的时序图中可以看出,在SPI写时序的时候,只有些指令的时候有数据返回,同理,读SPI时序也是一样
- CSN=1; //写寄存器结束后,遵循该nrf24l01模块采用的SPI时序CPOL=0,CPHA=0;将信号复位,以免发生错误
- return(BackData);
- }
- uint8 NRFReadReg(uint8 RegAddr) //SPI从NRF24L01读数据
- {
- uint8 BackData;
- CSN=0; //启动时序
- NRFSPI(RegAddr); //写指令
- BackData=NRFSPI(0x00); //写数据,从NRF24L01的时序图中可以看出,在SPI写时序的时候,只有些指令的时候有数据返回,同理,读SPI时序也是一样
- CSN=1; //写寄存器结束后,遵循该nrf24l01模块采用的SPI时序CPOL=0,CPHA=0;将信号复位,以免发生错误
- return(BackData);
- }
- uint8 NRFSPI(uint8 Data) //SPI读写时序
- {
- uint8 i;
- for(i=0;i<8;i++)
- {
- if(Data&0x80) //SPI协议规定数据先读、写高位
- MOSI=1;
- else
- MOSI=0;
- Data<<=1;
- SCK=1; //因为在SPI初始化时已经将SCK拉低,此处可不必再模拟一次时钟上升沿,
- if(MISO)
- Data|=0x01;
- SCK=0; //该nrf24l01模块采用的SPI时序为CPOL=0,CPHA=0;
- }
- return(Data);
- }
- void NRF_Write(uint8* buffer,uint8 length) //NRF24L01写数据到寄存器并发送
- {
- //int8 i=0;
- if(length>TX_DATA_WITDH)
- length=TX_DATA_WITDH;
- CE_NRF2401=0;
- NRFWriteTxData(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+发送地址使能指令+发送地址+地址宽度
- NRFWriteTxData(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
- NRFWriteTxData(W_TX_PAYLOAD,buffer,length);//写入数据
- NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC校验,上电 //发送模式
- CE_NRF2401=1;
- delay(30);//保持10us秒以上
- }
- uint8 NRFWriteTxData(uint8 RegAddr,uint8 *TxData,uint8 DataLen) //写要发送的数据到NRF24L01
- {
- uint8 i,BackData;
- CSN=0;
- BackData=NRFSPI(RegAddr);//写入要写入寄存器的地址
- for(i=0;i<DataLen;i++)
- {
- NRFSPI(*TxData++);
- }
- CSN=1;
- return(BackData);
- }
- uint8 NRF_CheckACK() //NRF检测是否有中断信号产生
- {
- sta=NRFReadReg(R_REGISTER+STATUS); //读取状态寄存器的值
- if(TX_DS||MAX_RT) //发送完成中断或者发送次数过多失败中断
- {
- NRFWriteReg(W_REGISTER+STATUS,NRFReadReg(W_REGISTER+STATUS)|0x30); // 清除TX_DS或MAX_RT中断标志
- CSN=0;
- NRFSPI(FLUSH_TX);//用于清空FIFO
- CSN=1;
- return(0);
- }
- else
- {
- return(1);
- }
- }
|