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);
}
}
|