NRF24L01LINUX驱动程序SPI驱动MINI2440.docx
《NRF24L01LINUX驱动程序SPI驱动MINI2440.docx》由会员分享,可在线阅读,更多相关《NRF24L01LINUX驱动程序SPI驱动MINI2440.docx(16页珍藏版)》请在冰豆网上搜索。
![NRF24L01LINUX驱动程序SPI驱动MINI2440.docx](https://file1.bdocx.com/fileroot1/2022-12/11/7e808708-ddec-4938-b695-6ab5494b3305/7e808708-ddec-4938-b695-6ab5494b33051.gif)
NRF24L01LINUX驱动程序SPI驱动MINI2440
包括LINUX下驱动程序和应用程序,MINI2440亲测可用
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
unsignedcharTxBuf[32]={0x00};
intmain(void)
{
intfd=-1;
intcount=1;
//fd=open("/dev/nrf24l01",0);
fd=open("/dev/NRF24l01",O_RDWR);
if(fd<0)
{
perror("Can'topen/dev/nrf24l01\n");
exit
(1);
}
printf("open/dev/nrf24l01success\n");
while(count<=5)
{
write(fd,&TxBuf,sizeof(TxBuf));
printf("Sending%dtime\n",count);
usleep(100*1000);
count++;
}
close(fd);
}
//#include//////////////////////////////////////////////
#include
#include
#include
#include
#include
#include
#include
//#include////////////////////////////////////////
#include
#include////////////////////////////////////////////////////
//#include//////////////////////////////////////////////
#include//////////////////////////////////////////////
typedefunsignedintuint16;
typedefunsignedcharuint8;
/*
//PortConfig
#defineCES3C2410_GPF3
#defineCE_OUTPS3C2410_GPF3_OUTP
#defineSCKS3C2410_GPF4
#defineSCK_OUTPS3C2410_GPF4_OUTP
#defineMISOS3C2410_GPG3
#defineMISO_INPS3C2410_GPG3_INP
#defineIRQS3C2410_GPG0
#defineIRQ_OUTPS3C2410_GPG0_OUTP
#defineMOSIS3C2410_GPG5
#defineMOSI_OUTPS3C2410_GPG5_OUTP
#defineCSNS3C2410_GPG6
#defineCSN_OUTPS3C2410_GPG6_OUTP
*/
//PortConfig
//
/*
#defineCSNS3C2410_GPF3
#defineCSN_OUTPS3C2410_GPF3_OUTP
#defineMOSIS3C2410_GPF4
#defineMOSI_OUTPS3C2410_GPF4_OUTP
#defineIRQS3C2410_GPG3
#defineIRQ_INPS3C2410_GPG3_INP
#defineMISOS3C2410_GPG0
#defineMISO_INPS3C2410_GPG0_INP
#defineSCKS3C2410_GPG5
#defineSCK_OUTPS3C2410_GPG5_OUTP
#defineCES3C2410_GPG6
#defineCE_OUTPS3C2410_GPG6_OUTP
*/
#defineCSNS3C2410_GPF(3)
#defineCSN_OUTPS3C2410_GPIO_OUTPUT
#defineMOSIS3C2410_GPF(4)
#defineMOSI_OUTPS3C2410_GPIO_OUTPUT
#defineIRQS3C2410_GPG(3)
#defineIRQ_INPS3C2410_GPIO_OUTPUT
#defineMISOS3C2410_GPG(0)
#defineMISO_INPS3C2410_GPIO_INPUT
#defineSCKS3C2410_GPG(5)
#defineSCK_OUTPS3C2410_GPIO_OUTPUT
#defineCES3C2410_GPG(6)
#defineCE_OUTPS3C2410_GPIO_OUTPUT
#defineDEVICE_NAME"NRF24L01"//Devicename锛宲ath:
/proc/devices
#defineNRF24L01_MAJOR241//Devicenum
#defineTxBufSize32
uint8TxBuf[TxBufSize]={
0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
//NRF24L01Port
#defineCE_OUTs3c2410_gpio_cfgpin(CE,CE_OUTP)
#defineCE_UPs3c2410_gpio_pullup(CE,1)
#defineCE_Ls3c2410_gpio_setpin(CE,0)
#defineCE_Hs3c2410_gpio_setpin(CE,1)
#defineSCK_OUTs3c2410_gpio_cfgpin(SCK,SCK_OUTP)
#defineSCK_UPs3c2410_gpio_pullup(SCK,1)
#defineSCK_Ls3c2410_gpio_setpin(SCK,0)
#defineSCK_Hs3c2410_gpio_setpin(SCK,1)
#defineMISO_INs3c2410_gpio_cfgpin(MISO,MISO_INP)
#defineMISO_UPs3c2410_gpio_pullup(MISO,1)
#defineMISO_STUs3c2410_gpio_getpin(MISO)
#defineIRQ_INs3c2410_gpio_cfgpin(IRQ,IRQ_INP)
#defineIRQ_UPs3c2410_gpio_pullup(IRQ,1)
#defineIRQ_Ls3c2410_gpio_setpin(IRQ,0)
#defineIRQ_Hs3c2410_gpio_setpin(IRQ,1)
#defineMOSI_OUTs3c2410_gpio_cfgpin(MOSI,MOSI_OUTP)
#defineMOSI_UPs3c2410_gpio_pullup(MOSI,1)
#defineMOSI_Ls3c2410_gpio_setpin(MOSI,0)
#defineMOSI_Hs3c2410_gpio_setpin(MOSI,1)
#defineCSN_OUTs3c2410_gpio_cfgpin(CSN,CSN_OUTP)
#defineCSN_UPs3c2410_gpio_pullup(CSN,1)
#defineCSN_Ls3c2410_gpio_setpin(CSN,0)
#defineCSN_Hs3c2410_gpio_setpin(CSN,1)
//NRF24L01
#defineTX_ADR_WIDTH5//5uint8sTXaddresswidth
#defineRX_ADR_WIDTH5//5uint8sRXaddresswidth
#defineTX_PLOAD_WIDTH32//20uint8sTXpayload
#defineRX_PLOAD_WIDTH32//20uint8sTXpayload
uint8constTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//sendaddr
uint8constRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//recvaddr
//NRF24L01Register
#defineREAD_REG0x00//璇诲瘎瀛樺櫒鎸囦护
#defineWRITE_REG0x20//鍐欏瘎瀛樺櫒鎸囦护
#defineRD_RX_PLOAD0x61//璇诲彇鎺ユ敹鏁版嵁鎸囦护
#defineWR_TX_PLOAD0xA0//鍐欏緟鍙戞暟鎹寚浠?
#defineFLUSH_TX0xE1//鍐叉礂鍙戦€?
FIFO鎸囦护
#defineFLUSH_RX0xE2//鍐叉礂鎺ユ敹FIFO鎸囦护
#defineREUSE_TX_PL0xE3//瀹氫箟閲嶅瑁呰浇鏁版嵁鎸囦护
#defineNOP0xFF//淇濈暀
//SPI(nRF24L01)瀵勫瓨鍣ㄥ湴鍧€
#defineCONFIG0x00//閰嶇疆鏀跺彂鐘舵€侊紝CRC鏍¢獙妯″紡浠ュ強鏀跺彂鐘舵€佸搷搴旀柟寮?
#defineEN_AA0x01//鑷姩搴旂瓟鍔熻兘璁剧疆
#defineEN_RXADDR0x02//鍙敤淇¢亾璁剧疆
#defineSETUP_AW0x03//鏀跺彂鍦板潃瀹藉害璁剧疆
#defineSETUP_RETR0x04//鑷姩閲嶅彂鍔熻兘璁剧疆
#defineRF_CH0x05//宸ヤ綔棰戠巼璁剧疆
#defineRF_SETUP0x06//鍙戝皠閫熺巼銆佸姛鑰楀姛鑳借缃?
#defineSTATUS0x07//鐘舵€佸瘎瀛樺櫒
#defineOBSERVE_TX0x08//鍙戦€佺洃娴嬪姛鑳?
#defineCD0x09//鍦板潃妫€娴?
#defineRX_ADDR_P00x0A//棰戦亾0鎺ユ敹鏁版嵁鍦板潃
#defineRX_ADDR_P10x0B//棰戦亾1鎺ユ敹鏁版嵁鍦板潃
#defineRX_ADDR_P20x0C//棰戦亾2鎺ユ敹鏁版嵁鍦板潃
#defineRX_ADDR_P30x0D//棰戦亾3鎺ユ敹鏁版嵁鍦板潃
#defineRX_ADDR_P40x0E//棰戦亾4鎺ユ敹鏁版嵁鍦板潃
#defineRX_ADDR_P50x0F//棰戦亾5鎺ユ敹鏁版嵁鍦板潃
#defineTX_ADDR0x10//鍙戦€佸湴鍧€瀵勫瓨鍣?
#defineRX_PW_P00x11//鎺ユ敹棰戦亾0鎺ユ敹鏁版嵁闀垮害
#defineRX_PW_P10x12//鎺ユ敹棰戦亾0鎺ユ敹鏁版嵁闀垮害
#defineRX_PW_P20x13//鎺ユ敹棰戦亾0鎺ユ敹鏁版嵁闀垮害
#defineRX_PW_P30x14//鎺ユ敹棰戦亾0鎺ユ敹鏁版嵁闀垮害
#defineRX_PW_P40x15//鎺ユ敹棰戦亾0鎺ユ敹鏁版嵁闀垮害
#defineRX_PW_P50x16//鎺ユ敹棰戦亾0鎺ユ敹鏁版嵁闀垮害
#defineFIFO_STATUS0x17//FIFO鏍堝叆鏍堝嚭鐘舵€佸瘎瀛樺櫒璁剧疆
uint8init_NRF24L01(void);
uint8SPI_RW(uint8tmp);
uint8SPI_Read(uint8reg);
voidSetRX_Mode(void);
uint8SPI_RW_Reg(uint8reg,uint8value);
uint8SPI_Read_Buf(uint8reg,uint8*pBuf,uint8uchars);
uint8SPI_Write_Buf(uint8reg,constuint8*pBuf,uint8uchars);
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);
voidnRF24L01_TxPacket(unsignedchar*tx_buf);
//鍏ㄥ眬鍙橀噺
uint8opencount=0;
//
uint8sta;//StatusSymbol
#defineRX_DR6
#defineTX_DS5
#defineMAX_RT4
uint8init_NRF24L01(void)
{
/*
CE_UP;
SCK_UP;
MISO_UP;
IRQ_UP;
MOSI_UP;
CSN_UP;
*/
MISO_UP;
CE_OUT;
CSN_OUT;
SCK_OUT;
MOSI_OUT;
MISO_IN;
IRQ_IN;
udelay(500);
CE_L;//chipenable
ndelay(60);
CSN_H;//Spidisable
ndelay(60);
SCK_L;//Spiclocklineinithigh
ndelay(60);
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//writesendaddr
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//writerecvaddr
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//棰戦亾0鑷姩ACK搴旂瓟鍏佽
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//鍏佽鎺ユ敹鍦板潃鍙湁棰戦亾0锛屽鏋滈渶瑕佸棰戦亾鍙互鍙傝€働age21
SPI_RW_Reg(WRITE_REG+RF_CH,0);//璁剧疆淇¢亾宸ヤ綔涓?
.4GHZ锛屾敹鍙戝繀椤讳竴鑷?
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//璁剧疆鎺ユ敹鏁版嵁闀垮害锛屾湰娆¤缃负32瀛楄妭
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//璁剧疆鍙戝皠閫熺巼涓?
MHZ锛屽彂灏勫姛鐜囦负鏈€澶у€?
dB
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ鏀跺彂瀹屾垚涓柇鍝嶅簲锛?
6浣岰RC锛屼富鎺ユ敹
mdelay(1000);
nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
printk("test1\n");
mdelay(1000);
/*
nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
printk("test2\n");
mdelay(1000);
nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
printk("test3\n");
mdelay(1000);
nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
printk("test4\n");
mdelay(1000);
*/
return
(1);
}
//鍑芥暟锛歶int8SPI_RW(uint8tmp)
//鍔熻兘锛歂RF24L01鐨凷PI鍐欐椂搴弔mp
uint8SPI_RW(uint8tmp)
{
uint8bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit
{
if(tmp&0x80)//output'tmp',MSBtoMOSI
MOSI_H;
else
MOSI_L;
tmp<<=1;//shiftnextbitintoMSB..
SCK_H;//SetSCKhigh..
ndelay(60);
tmp|=MISO_STU;//capturecurrentMISObit
SCK_L;//..thensetSCKlowagain
ndelay(60);
}
return(tmp);//returnreadtmp
}
//鍑芥暟锛歶int8SPI_Read(uint8reg)
//鍔熻兘锛歂RF24L01鐨凷PI鏃跺簭
uint8SPI_Read(uint8reg)
{
uint8reg_val;
CSN_L;//CSNlow,initializeSPIcommunication...
ndelay(60);
SPI_RW(reg);//Selectregistertoreadfrom..
reg_val=SPI_RW(0);//..thenreadregistervalue
CSN_H;//CSNhigh,terminateSPIcommunication
ndelay(60);
return(reg_val);//returnregistervalue
}
//鍔熻兘锛歂RF24L01璇诲啓瀵勫瓨鍣ㄥ嚱鏁?
uint8SPI_RW_Reg(uint8reg,uint8value)
{
uint8status;
CSN_L;//CSNlow,initSPItransaction
ndelay(60);
status=SPI_RW(reg);//selectregister
SPI_RW(value);//..andwritevaluetoit..
CSN_H;//CSNhighagain
ndelay(60);
return(status);//returnnRF24L01statusuint8
}
//鍑芥暟锛歶int8SPI_Read_Buf(uint8reg,uint8*pBuf,uint8uchars)
//鍔熻兘:
鐢ㄤ簬璇绘暟鎹紝reg锛氫负瀵勫瓨鍣ㄥ湴鍧€锛宲Buf锛氫负寰呰鍑烘暟鎹湴鍧€锛寀chars锛氳鍑烘暟鎹殑涓暟
uint8SPI_Read_Buf(uint8reg,uint8*pBuf,uint8uchars)
{
uint8status,uint8_ctr;
CSN_L;//SetCSNlow,initSPItranaction
ndelay(60);
status=SPI_RW(reg);//Selectregistertowritetoandreadstatusuint8
for(uint8_ctr=0;uint8_ctr{
pBuf[uint8_ctr]=SPI_RW(0);//
ndelay(20);
}
CSN_H;
ndelay(60);
return(status);//returnnRF24L01statusuint8
}
//鍑芥暟锛歶int8SPI_Write_Buf(uint8reg,uint8*pBuf,uint8uchars)
//鍔熻兘:
鐢ㄤ簬鍐欐暟鎹細涓哄瘎瀛樺櫒鍦板潃锛宲Buf锛氫负寰呭啓鍏ユ暟鎹湴鍧€锛寀chars锛氬啓鍏ユ暟鎹殑涓暟
uint8SPI_Write_Buf(uint8reg,constuint8*pBuf,uint8uchars)
{
uint8status,uint8_ctr;
CSN_L;//SPI浣胯兘
ndelay(60);
status=SPI_RW(reg);
for(uint8_ctr=0;uint8_ctr{
SPI_RW(*pBuf++);
ndelay(20);
}
CSN_H;//鍏抽棴SPI
ndelay(60);
return(status);//
}
//鍑芥暟锛歷oidSetRX_Mode(void)
//鍔熻兘锛氭暟鎹帴鏀堕厤缃?
voidSetRX_Mode(void)
{
CE_L;
ndelay(60);
//SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ鏀跺彂瀹屾垚涓柇鍝嶅簲锛?
6浣岰RC锛屼富鎺ユ敹
//udelay
(1);
CE_H;
udelay(130);