⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf24l01.c

📁 我写的atmega16驱动的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 + -