3,846
社区成员
发帖
与我相关
我的任务
分享
void nRF24L01_TxPacket( uchar * tx_buf)
{
uchar sta=0;
uchar flag=0;
Low_24L01_CE; //StandBy I模式
Hign_24L01_CSN;
Low_24L01_SCK;
delay_nms(100);
SPI_RW_Reg(WRITE_REG+STATUS,0xff); //STATUS复位
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); //使能P0通道自动应答 此功能禁止后可与24l01通讯
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); //接收地址允许 P0通道接收允许
// SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); //500+86us自动重发15次(文档有问题...)
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); //不自动重发 重发间隔 0us
SPI_RW_Reg(WRITE_REG + RF_CH, 0x00); // 射频通道(工作频率)
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为5字节
// SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 发射功率0dB???
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0e); // 发射功率0dB???
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
delay_nms(20);
Hign_24L01_CE; //置高CE,激发数据发送
_delay_us(200);
Low_24L01_CE;
sta1=SPI_Read(STATUS); // 返回状态寄存器
USART_Transmit(sta1); //操作结果
}
//-----------------------------------------------------------------------------------
// Function : nRF24L01_Init()
//-----------------------------------------------------------------------------------
// Description : 初始化nRF24L01
// Parameter : None
// Return Value : None
// Note : None
// Date : 2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_Init()
{
RF_CE = 0;
RF_CSN = 1;
RF_SCK = 0; // 注:SPI模式不同,初始化不同
RF_IRQ = 1;
SPI_RF_RW_Reg(WRITE_REG + EN_AA, 0x00); // 不使用自动应答
SPI_RF_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能Pipe0
SPI_RF_RW_Reg(WRITE_REG + SETUP_AW, 0x03); // 5字节的地址
SPI_RF_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 禁止重发
SPI_RF_RW_Reg(WRITE_REG + RF_CH, 20); // 设置工作通道频率(收发必须一致)
SPI_RF_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 设置射频寄存器
// 新加初始化:发送接收只设置一次
SPI_RF_RW_Reg(FLUSH_TX, 0x00); // 清空发送缓冲区
SPI_RF_RW_Reg(FLUSH_RX, 0x00); // 清空接收缓冲区
SPI_RF_RW_Reg(WRITE_REG + RX_PW_P0, RTX_WIDTH); // 设置Pipe0接收通道有效数据宽度
SPI_RF_Write_Buf(WRITE_REG + TX_ADDR , TX_Adr, TX_ADR_WIDTH); // 设置发送地址
SPI_RF_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_Adr, RX_ADR_WIDTH); // 设置接收地址
}
//-----------------------------------------------------------------------------------
// Function : nRF24L01_TX_Mode()
//-----------------------------------------------------------------------------------
// Description : 设置发送模式并发送数据
// Parameter : tx_buf - 发送的数据
// Return Value : None
// Note : None
// Date : 2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_TX_Mode_Data(uchr* tx_buf)
{
RF_CE = 0;
SPI_RF_Write_Buf(WR_TX_PLOAD, tx_buf, RTX_WIDTH); // 设置发送数据
SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0e); // 设置发送模式
RF_CE = 1;
Delay_us(13); // 至少延时10us
}
//-----------------------------------------------------------------------------------
// Function : nRF24L01_RX_Mode()
//-----------------------------------------------------------------------------------
// Description : 设置接收模式
// Parameter : None
// Return Value : None
// Note : None
// Date : 2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_RX_Mode()
{
RF_CE = 0;
SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0f); // 设置接收模式
RF_CE = 1;
Delay_us(150); // 至少延时130us
}
这个试试//-----------------------------------------------------------------------------------
// Function : nRF24L01_Init()
//-----------------------------------------------------------------------------------
// Description : 初始化nRF24L01
// Parameter : None
// Return Value : None
// Note : None
// Date : 2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_Init()
{
RF_CE = 0;
RF_CSN = 1;
RF_SCK = 1;
RF_IRQ = 1;
SPI_RF_RW_Reg(WRITE_REG + EN_AA, 0x01); // Pipe0自动应答使能
SPI_RF_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能Pipe0
SPI_RF_RW_Reg(WRITE_REG + SETUP_AW, 0x03); // 5字节的地址
SPI_RF_RW_Reg(WRITE_REG + SETUP_RETR, 0xff); // 4000+86us间隔,16次重发
SPI_RF_RW_Reg(WRITE_REG + RF_CH, 20); // 设置工作通道频率(收发必须一致)
SPI_RF_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 设置射频寄存器
// 新加初始化:发送接收只设置一次
SPI_RF_RW_Reg(FLUSH_TX, 0x00); // 清空发送缓冲区
SPI_RF_RW_Reg(FLUSH_RX, 0x00); // 清空接收缓冲区
SPI_RF_RW_Reg(WRITE_REG + RX_PW_P0, RTX_PLW); // 设置Pipe0接收通道有效数据宽度
}
//-----------------------------------------------------------------------------------
// Function : nRF24L01_TX_Mode()
//-----------------------------------------------------------------------------------
// Description : 设置发送模式并发送数据
// Parameter : tx_buf - 发送的数据
// Return Value : None
// Note : None
// Date : 2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_TX_Mode_Data(uchr* tx_buf)
{
RF_CE = 0;
SPI_RF_Write_Buf(WRITE_REG + TX_ADDR , TX_Adr, RTX_AW); // 设置发送地址
SPI_RF_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_Adr, RTX_AW); // 设置自动应答就收地址(与TX_ADDR必须一致)
SPI_RF_Write_Buf(WR_TX_PLOAD, tx_buf, RTX_PLW); // 设置发送数据
SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0e); // 设置发送模式
RF_CE = 1;
Delay_us(13); // 至少延时10us
}
//-----------------------------------------------------------------------------------
// Function : nRF24L01_RX_Mode()
//-----------------------------------------------------------------------------------
// Description : 设置接收模式
// Parameter : None
// Return Value : None
// Note : None
// Date : 2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_RX_Mode()
{
RF_CE = 0;
SPI_RF_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_Adr, RTX_AW); // 设置接收地址(貌似设置一次就行了)
SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0f); // 设置接收模式
RF_CE = 1;
Delay_us(150); // 至少延时130us
}