1. 程式人生 > >NRF24L01驅動程式

NRF24L01驅動程式

********************************************************************************
*                         NRF24L01驅動模組         
*
* 文      件:NRF24L01.c
* 函式及功能:1)
*             2)
* 作      者:XX
* 日      期:2016年9月20日
********************************************************************************
*/

#include "include.h"

sbit CSN = P0^0;
sbit CE = P0^1;
sbit MOSI = P0^2;
sbit MISO = P0^3;
sbit SCK = P0^3;

unsigned char const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};	//接收地址
unsigned char const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};	//本地地址

					
/*
********************************************************************************
* 函式名稱:unsigned char SPI_RW(unsigned char byte)    
*
* 功    能:寫時序
*
* 呼叫清單:無
*
* 參    數:byte
*
* 返 回 值:byte
*
* 注    意:1) 
*           2) 
********************************************************************************
*/
unsigned char SPI_RW(unsigned char byte)
{
    unsigned char bit_ctr;

	for(bit_ctr = 0; bit_ctr < 8; bit_ctr++)
    {
	    MOSI = (0x80 & byte);
        byte <<= 1;
        SCK = 1;
		byte |= MISO;
		SCK = 0;      
	}	

	return (byte);
}

/*
********************************************************************************
* 函式名稱:unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)    
*
* 功    能:設定暫存器的值
*
* 呼叫清單:1)unsigned char SPI_RW(unsigned char byte)
*
* 參    數:reg, value
*
* 返 回 值:status
*
* 注    意:1) 
*           2) 
********************************************************************************
*/
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
{
   unsigned char status;

   CSN = 0;
   status = SPI_RW(reg);
   SPI_RW(value);
   CSN = 1;

   return (status);
}

/*
********************************************************************************
* 函式名稱:unsigned char SPI_Read(unsigned char reg)
*
* 功    能:讀取暫存器中的值
*
* 呼叫清單:1)unsigned char SPI_RW(unsigned char byte)
*
* 參    數:reg
*
* 返 回 值:reg_val
*
* 注    意:1) 
*           2) 
********************************************************************************
*/
unsigned char SPI_Read(unsigned char reg)
{
    unsigned char reg_val;

	CSN = 0;
	SPI_RW(reg);
	reg_val = SPI_RW(0);
	CSN = 1;

	return (reg_val);
}

/*
********************************************************************************
* 函式名稱:unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
*
* 功    能:在接收時讀取FIFO緩衝區中的值
*
* 呼叫清單:1)unsigned char SPI_RW(unsigned char byte)
*
* 參    數:reg, *pBuf, bytes
*
* 返 回 值:status
*
* 注    意:1) 
*           2) 
********************************************************************************
*/
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
    unsigned char status;
	unsigned char byte_ctr;

	CSN = 0;
	status = SPI_RW(reg);
	for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
	{
	    pBuf[byte_ctr] = SPI_RW(0);
	}
    CSN = 1;

	return (status);
}


/*
********************************************************************************
* 函式名稱:unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
*
* 功    能: 把數組裡的數放到發射FIFO緩衝區中去
*
* 呼叫清單:1)unsigned char SPI_RW(unsigned char byte)
*
* 參    數:reg, *pBuf, bytes
*
* 返 回 值:status
*
* 注    意:1) 
*           2) 
********************************************************************************
*/
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
    unsigned char status;
	unsigned char byte_ctr;

	CSN = 0;
	status = SPI_RW(reg);
	Delay_Us(10);
	for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
	{
	    SPI_RW(*pBuf++);
	}
    CSN = 1;

	return (status);
}

/*
********************************************************************************
* 函式名稱:void RX_Mode(void)
*
* 功    能:設定NRF24L01為接收方式
*
* 呼叫清單:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
*			2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
* 參    數:無
*
* 返 回 值:無
*
* 注    意:1) 							 
*           2) 
********************************************************************************
*/
void RX_Mode(void)
{
    CE = 0;
	SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
	SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
	SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
	SPI_RW_Reg(WRITE_REG + RF_CH, 40);
	SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
	SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
    CE = 1;
}

/*
********************************************************************************
* 函式名稱:void TX_Mode(void)
*
* 功    能:設定NRF24L01為發射方式
*
* 呼叫清單:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
*			2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
* 參    數:無
*
* 返 回 值:無
*
* 注    意:1) 							 
*           2) 
********************************************************************************
*/
void TX_Mode(void)
{
    CE = 0;
	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 + RX_PW_P0, RX_PLOAD_WIDTH); //設定接收資料長度,本次設定為4位元組

	SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
	SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
	SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);
	SPI_RW_Reg(WRITE_REG + RF_CH, 40);
	SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
    CE = 1;
}