📄 nrf24l01.c
字号:
//--------------------------------------------------------
//把nrfTxBuf中No个数据通过SPI总线发送出去
//--------------------------------------------------------
void SPI_SendData(uchar *nrfTxBuf, uchar *nrfRxBuf, uchar No)
{
uchar i;
_ClrNRF_SS;
bSpiTxing=dTrue;
for ( i = 0; i < No; i++ )
{
SPDR = nrfTxBuf[i];
while ((SPSR & 0x80) == 0) WDR();
nrfRxBuf[i] = SPDR; /* Flush the RxFIFO */
}
_SetNRF_SS;
bSpiTxing=dFalse;
}
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//把nrfTxDataBuf[1]到nrfTxDataBuf[length]数据发送出去
//--------------------------------------------------------
void nRF_SendData(unsigned char Length)
{
nrfTxBuf[0] = dRegister_Config+dCom_Write;
nrfTxBuf[1] = 0x0e;
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxDataBuf[0]=dCom_WriteData;
SPI_SendData(nrfTxDataBuf, nrfRxBuf, Length);
nrfTxBuf[0] = dRegister_Status+dCom_Write; // STATUS:状态寄存器
nrfTxBuf[1] = 0x70; // 清空各中断
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
_TurnOffLed1;
_SetNRF_CE;
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_ClrNRF_CE;
}
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//初始化模块
//--------------------------------------------------------
void nrf24l01_init()
{
// UINT i;
bBusy = dTrue;
// _SetNRF_CE; // 空闲模式,不进行数据传输
/*
nrfTxBuf[0] = 0x20; // CONFIG:PRx, CRC 2byte,power up
nrfTxBuf[1] = 0x0f;
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
如果在这里写00寄存器,读出来发现不是0x0f,而是上电默认值0x08.
RoomNum=EEPROMread(RoomAddress_User);
EEPROMwrite(FloorAddress_UserBAK2,FloorNum);
*/
nrfTxBuf[0] = 0x21; // EN_AA
nrfTxBuf[1] = EEPROMread(UserConfigAddress+1);//0x0f;//0x01; // 通道0自动应答
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x22; // EN_RXADDR:激活接收地址
nrfTxBuf[1] = EEPROMread(UserConfigAddress+2);//0x01; // 使能接收通道0
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x23; // SETUP_AW:设置地址宽度
nrfTxBuf[1] = EEPROMread(UserConfigAddress+3);//0x03; // 5byte地址宽度
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x24; // SETUP_RETR
nrfTxBuf[1] = EEPROMread(UserConfigAddress+4);//0x0a; // 重发10次,重发延时250+86us
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x25; // RF_CH:射频频道
nrfTxBuf[1] = EEPROMread(UserConfigAddress+5);//0x40; // 频点2
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x26; // RF_SETUP:射频设置寄存器
// nrfTxBuf[1] = 0x09; // 2Mbps, 0-18 dBm,Setup LNA gain
nrfTxBuf[1] = EEPROMread(UserConfigAddress+6);//0x07; // 1Mbps, 0 dBm,Setup LNA gain
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x27; // STATUS:状态寄存器
nrfTxBuf[1] = EEPROMread(UserConfigAddress+7);//0x70; // 清空各中断
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x2A; // RX_ADDR_P0:接收数据通道0的地址40位
nrfTxBuf[1] = EEPROMread(RxPipe0Addr+0);//0x01;// 接收数据通道0的地址LSB
nrfTxBuf[2] = EEPROMread(RxPipe0Addr+1);//0x02;
nrfTxBuf[3] = EEPROMread(RxPipe0Addr+2);//0x03;
nrfTxBuf[4] = EEPROMread(RxPipe0Addr+3);//0x04;
nrfTxBuf[5] = EEPROMread(RxPipe0Addr+4);//0x05; // 接收数据通道0的地址MSB
SPI_SendData(nrfTxBuf, nrfRxBuf, 6);
nrfTxBuf[0] = 0x2B; // RX_ADDR_P1:接收数据通道1的地址40位
nrfTxBuf[1] = EEPROMread(RxPipe1Addr+0);//0x01;// 接收数据通道0的地址LSB
nrfTxBuf[2] = EEPROMread(RxPipe1Addr+1);//0x02;
nrfTxBuf[3] = EEPROMread(RxPipe1Addr+2);//0x03;
nrfTxBuf[4] = EEPROMread(RxPipe1Addr+3);//0x04;
nrfTxBuf[5] = EEPROMread(RxPipe1Addr+4);//0x05; // 接收数据通道0的地址MSB
SPI_SendData(nrfTxBuf, nrfRxBuf, 6);
nrfTxBuf[0] = 0x2C; //
nrfTxBuf[1] = EEPROMread(UserConfigAddress+0x0c);
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x2D;
nrfTxBuf[1] = EEPROMread(UserConfigAddress+0x0d);
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x2E;
nrfTxBuf[1] = EEPROMread(UserConfigAddress+0x0e);
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x2F;
nrfTxBuf[1] = EEPROMread(UserConfigAddress+0x0f);
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x30; // TX_ADDR:发送数据通道地址,40位
nrfTxBuf[1] = EEPROMread(TxPipeAddr+0);//0x01; // 接收数据通道0的地址LSB
nrfTxBuf[2] = EEPROMread(TxPipeAddr+1);//0x02;
nrfTxBuf[3] = EEPROMread(TxPipeAddr+2);//0x03;
nrfTxBuf[4] = EEPROMread(TxPipeAddr+3);//0x04;
nrfTxBuf[5] = EEPROMread(TxPipeAddr+4);//0x05; // 接收数据通道0的地址MSB
SPI_SendData(nrfTxBuf, nrfRxBuf, 6);
nrfTxBuf[0] = 0x31; // RX_PW_P0 :接收数据通道0的有效载荷字节数
nrfTxBuf[1] = EEPROMread(UserConfigAddress+0x11);//0x20; // 32byte
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = 0x20; // CONFIG:PRx, CRC 2byte,power up
nrfTxBuf[1] = EEPROMread(UserConfigAddress+0);//0x0f;
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
_TurnOnLed1;
nrfTxBuf[0] = dCom_ClrTxFIFO;//0xe1; // 清空发送FIFO
SPI_SendData(nrfTxBuf, nrfRxBuf, 1);
nrfTxBuf[0] = dCom_ClrRxFIFO;//0xe2; // 清空接受FIFO
SPI_SendData(nrfTxBuf, nrfRxBuf, 1);
bBusy = dFalse;
}
//--------------------------------------------------------
//配置为接受模式
//--------------------------------------------------------
void SetRxMode(void)
{
bBusy = dTrue;
nrfTxBuf[0] = dRegister_Config + dCom_Write; // CONFIG:PRX, CRC 2byte,power up
nrfTxBuf[1] = 0x0f;
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = dCom_ClrTxFIFO; // 清空接受FIFO
SPI_SendData(nrfTxBuf, nrfRxBuf, 1);
_SetNRF_CE; // active
_NOP();_NOP();_NOP();
_TurnOnLed1;
bBusy = dFalse;
}
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//配置为发送模式
//--------------------------------------------------------
void SetTxMode(void)
{
bBusy = dTrue;
nrfTxBuf[0] = dRegister_Config + dCom_Write; // CONFIG:PTX, CRC 2byte,power up
nrfTxBuf[1] = 0x0e;
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
nrfTxBuf[0] = dCom_ClrTxFIFO;
SPI_SendData(nrfTxBuf, nrfRxBuf, 1);
_TurnOffLed1;
bBusy = dFalse;
}
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//发送32byte数据
//--------------------------------------------------------
void SendTest(void)//uchar *s, uchar No)
{
uchar i;
nrfTxBuf[0] = dCom_ClrTxFIFO;
SPI_SendData(nrfTxBuf, nrfRxBuf, 1);
for(i=1; i<33; i++)
{
nrfTxDataBuf[i] = i; // No<32byte
}
nRF_SendData(0x21);
}
//--------------------------------------------------------
//读出0x00-0x17寄存器的内容并通过串口发送到PC
//--------------------------------------------------------
void ReadRegisters(void)
{
unsigned char i,j,k;
uchar *pt;
bBusy = dTrue;
// _ClrNRF_SS;
pt=&ComTxBuf[0];
k=0;
for(i=0;i<0x0a;i++)
{
nrfTxBuf[0] = i; // EN_RXADDR:激活接收地址
nrfTxBuf[1] = 0x00; // 使能接收通道0
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
*pt++ = i;
k++;
// for(j=1;j<2;j++)
// {
// *pt++ = nrfRxBuf[j];
// k++;
// }
*pt++ = nrfRxBuf[1];
k++;
}
for(i=0x0a;i<0x0c;i++)
{
nrfTxBuf[0] = i; // EN_RXADDR:激活接收地址
nrfTxBuf[1] = 0x00; // 使能接收通道0
nrfTxBuf[2] = 0x00; // 使能接收通道0
nrfTxBuf[3] = 0x00; // 使能接收通道0
nrfTxBuf[4] = 0x00; // 使能接收通道0
nrfTxBuf[5] = 0x00; // 使能接收通道0
SPI_SendData(nrfTxBuf, nrfRxBuf, 6);
*pt++ = i;
k++;
for(j=1;j<6;j++)
{
*pt++ = nrfRxBuf[j];
k++;
}
}
for(i=0x0c;i<0x10;i++)
{
nrfTxBuf[0] = i; // EN_RXADDR:激活接收地址
nrfTxBuf[1] = 0x00; // 使能接收通道0
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
*pt++ = i;
k++;
/*
for(j=1;j<2;j++)
{
*pt++ = nrfRxBuf[j];
k++;
}
*/
*pt++ = nrfRxBuf[1];
k++;
}
nrfTxBuf[0] = 0x10; // EN_RXADDR:激活接收地址
nrfTxBuf[1] = 0x00; // 使能接收通道0
nrfTxBuf[2] = 0x00; // 使能接收通道0
nrfTxBuf[3] = 0x00; // 使能接收通道0
nrfTxBuf[4] = 0x00; // 使能接收通道0
nrfTxBuf[5] = 0x00; // 使能接收通道0
SPI_SendData(nrfTxBuf, nrfRxBuf, 6);
*pt++ = 0x10;
k++;
for(j=1;j<6;j++)
{
*pt++ = nrfRxBuf[j];
k++;
}
for(i=0x11;i<0x18;i++)
{
nrfTxBuf[0] = i; // EN_RXADDR:激活接收地址
nrfTxBuf[1] = 0x00; // 使能接收通道0
SPI_SendData(nrfTxBuf, nrfRxBuf, 2);
*pt++ = i;
k++;
/*
for(j=1;j<2;j++)
{
*pt++ = nrfRxBuf[j];
k++;
}
*/
*pt++ = nrfRxBuf[1];
k++;
}
ComTxCount=k;
PtComTx=&ComTxBuf[0];
UDR=k;
while(ComTxCount>0) WDR();
bBusy = dFalse;
}
//--------------------------------------------------------
//读出下一个寄存器的内容并通过串口发送到PC
//--------------------------------------------------------
void ReadNextRegister(void)
{
unsigned char j;
bBusy = dTrue;
// _ClrNRF_SS;
nrfTxBuf[1] = 0x00; // 使能接收通道0
nrfTxBuf[2] = 0x00; // 使能接收通道0
nrfTxBuf[3] = 0x00; // 使能接收通道0
nrfTxBuf[4] = 0x00; // 使能接收通道0
nrfTxBuf[5] = 0x00; // 使能接收通道0
nrfTxBuf[0] = RegisterNum; // EN_RXADDR:激活接收地址
j=2;
if((RegisterNum == 0x0a)||(RegisterNum == 0x0b)||(RegisterNum == 0x10))
{
j=6;
}
SPI_SendData(nrfTxBuf, &ComTxBuf[0], j);
ComTxCount=j-1;
PtComTx=&ComTxBuf[0];
ComTxBuf[0]=RegisterNum;
UDR=*PtComTx++;
while(ComTxCount>0) WDR();
RegisterNum++;
if(RegisterNum>0x17)
RegisterNum=0;
bBusy = dFalse;
}
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//读出上一个寄存器的内容并通过串口发送到PC
//--------------------------------------------------------
void ReadLastRegister(void)
{
unsigned char j;
bBusy = dTrue;
// _ClrNRF_SS;
nrfTxBuf[1] = 0x00; // 使能接收通道0
nrfTxBuf[2] = 0x00; // 使能接收通道0
nrfTxBuf[3] = 0x00; // 使能接收通道0
nrfTxBuf[4] = 0x00; // 使能接收通道0
nrfTxBuf[5] = 0x00; // 使能接收通道0
nrfTxBuf[0] = RegisterNum; // EN_RXADDR:激活接收地址
j=2;
if((RegisterNum == 0x0a)||(RegisterNum == 0x0b)||(RegisterNum == 0x10))
{
j=6;
}
SPI_SendData(nrfTxBuf, &ComTxBuf[0], j);
ComTxCount=j-1;
PtComTx=&ComTxBuf[0];
ComTxBuf[0]=RegisterNum;
UDR=*PtComTx++;
while(ComTxCount>0) WDR();
if(RegisterNum==0)
RegisterNum=0x17;
else
RegisterNum--;
bBusy = dFalse;
}
//--------------------------------------------------------
//--------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -