




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、nRF24L01無線通信模塊使用手冊一、模塊簡介該射頻模塊集成了NORDIC公司生產(chǎn)的無線射頻芯片nRF24L01:1 .支持2.4GHz的全球開放ISM頻段,最大發(fā)射功率為0dBm2 .2Mbps,傳輸速率高3 .功耗低,等待模式時電流消耗僅22uA4 .多頻點(125個),滿足多點通信及跳頻通信需求5 .在空曠場地,有效通信距離:25m(外置天線)、10m(PCB天線)6 .工作原理簡介:發(fā)射數(shù)據(jù)時,首先將nRF24L01配置為發(fā)射模式,接著把地址TX_ADDR和數(shù)據(jù)TX_PLD按照時序由SPI口寫入nRF24L01緩存區(qū),TX_PLD必須在CSN為低時連續(xù)寫入,而TX_ADDR在發(fā)射時寫
2、入一次即可,然后CE置為高電平并保持至少10延遲130ds后發(fā)射數(shù)據(jù);若自動應答開啟,那么nRF24L01在發(fā)射數(shù)據(jù)后立即進入接收模式,接收應答信號。如果收到應答,則認為此次通信成功,TX_DS置高,同時TX_PLD從發(fā)送堆棧中清除;若未收到應答,則自動重新發(fā)射該數(shù)據(jù)(自動重發(fā)已開啟),若重發(fā)次數(shù)(ARC_CNT)達到上限,MAX_RT置高,TX_PLD不會被1#除;MAX_RT或TX_DS置高時,使IRQ變低,以便通知MCU。最后發(fā)射成功時,若CE為低,則nRF24L01進入待機模式1;若發(fā)送堆棧中有數(shù)據(jù)且CE為高,則進入下一次發(fā)射;若發(fā)送堆棧中無數(shù)據(jù)且CE為高,則進入待機模式2。接收數(shù)據(jù)時
3、,首先將nRF24L01配置為接收模式,接著延遲130ds進入接收狀態(tài)等待數(shù)據(jù)的到來。當接收方檢測到有效的地址和CRC時,就將數(shù)據(jù)包存儲在接收堆棧中,同時中斷標志位RX_DR置高,IRQ變低,以便通知MCU去取數(shù)據(jù)。若此時自動應答開啟,接收方則同時進入發(fā)射狀態(tài)回傳應答信號。最后接收成功時,若CE變低,則nRF24L01進入空閑模式1。二、模塊電氣特性參數(shù)數(shù)值單位供電電壓5V最大發(fā)射功率0dBm最大數(shù)據(jù)傳輸率2Mbps電流消耗(發(fā)射模式,0dBm)11.3mA電流消耗(接收模式,2Mbps)12.3mA電流消耗(掉電模式)900nA溫度范圍-40+85C三、模塊引腳說明管腳符號功能力向1GND電
4、源地2IRQ中斷輸出O3MISOSPI輸出O4MOSISPI輸入I5SCKSPI時鐘I6NC空7NC空8CSN芯片片選信號I9CE工作模式選擇I10+5V電源四、模塊與AT89S52單片機接口電路VCCP1.0P1.1CNCNP1.2P1.3P1.4P3.2GNDAT89S52MCU模塊U1-+5VCECSNCNCNSCKMOSIMISOIRQGNDNrf24L01通訊模塊注:上圖為示意連接,可根據(jù)自己實際需求進行更改;使用AT89S52MCU模塊時,請將Nrf24L01通訊模塊每個端口(MOSI、SCK、CSN和CE)接4.7K的排阻上拉到VCC增強其驅動能力(如下圖:)。若使用其它單片機與
5、Nrf24L01通訊模塊相連時請串聯(lián)2K電阻。五、工作模式控制工作模式由CE和PWR_UP、PRIM_RX兩寄存器共同控制:模式PWR_UPPRIM_RXCEFIFO寄存器狀態(tài)接收模式1111-發(fā)射模式1011數(shù)據(jù)存儲在FIFO寄存器中,發(fā)射所有數(shù)據(jù)發(fā)射模式10g12數(shù)據(jù)存儲在FIFO寄存器中,發(fā)射一個數(shù)據(jù)待機模式II101TXFIFO為空待機*II式Id1-0一無正在傳輸?shù)臄?shù)據(jù)掉電模式0-注1:進入此模式后,只要CSN置高,在FIFO中的數(shù)據(jù)就會立即發(fā)射出去,直到所有數(shù)據(jù)數(shù)據(jù)發(fā)射完畢,之后進入待機模式II。注2:正常的發(fā)射模式,CE端的高電平應至少保持10us。24L01將發(fā)射一個數(shù)據(jù)包,之
6、后進入待機模式I。六、數(shù)據(jù)和控制接口通過以下六個引腳,可實現(xiàn)模塊的所有功能:IRQ(低電平有效,中斷輸出)CE(高電平有效,發(fā)射或接收模式控制)CSN(SPI信號)SCK(SPI信號)MOSI(SPI信號)MISO(SPI信號)通過SPI接口,可激活在數(shù)據(jù)寄存器FIFO中的數(shù)據(jù);或者通過SPI命令(1個字節(jié)長度)訪問寄存器。在待機或掉電模式下,單片機通過SPI接口配置模塊;在發(fā)射或接收模式下,單片機通過SPI接口接收或發(fā)射數(shù)據(jù)。1. SPI指令所有的SPI指令均在當CSN由低到高開始跳變時執(zhí)行;從MOSI寫命令的同時,MISO實時返回24L01的狀態(tài)值;SPI指令由命令字節(jié)和數(shù)據(jù)字節(jié)兩部分組成
7、。SPI命令字節(jié)表指令名稱指令格式(二進制)字節(jié)數(shù)操作說明R_REGISTER000AAAAA15讀奇存命。AAAAA表小奇存命地址。W_REGISTER001AAAAA15與口存命。AAAAA表小口存命地址)只能在掉電或待機模式下操作。R_RX_PAYLOAD01100001132在接收模式下讀132字節(jié)RX有效斷氣。從字節(jié)0開始,數(shù)據(jù)讀完后,F(xiàn)IFO寄存器清空。W_TX_PAYLOAD10100000132在發(fā)射模式下寫131字節(jié)IX有效數(shù)據(jù)。從字節(jié)0開始。FLUSH_TX111000010在發(fā)射模式下,清空TXFIFO寄存器。FLUSH_RX111000100在接收模式下,清空RXFIF
8、O寄存器。在傳輸應答信號時不應執(zhí)行此操作,否則不能傳輸完整的應答信號。REUSE_TX_PL111000110應用于發(fā)射端。重新使用上一次發(fā)射的有效數(shù)據(jù),當CE=1時,數(shù)據(jù)將不斷重新發(fā)射。在發(fā)射數(shù)據(jù)包過程中,應禁止數(shù)據(jù)包重用功能。NOP111111110空操作。可用于讀狀態(tài)寄存器。2. SPI時序SPI讀寫時序見下面兩圖。在寫寄存器之前,一定要進入待機模式或掉電模式。其中,CnSPI指令位;Sn狀態(tài)寄存器位;Dn數(shù)據(jù)位(低字節(jié)在前,高字節(jié)在后;每個字節(jié)中高位在前)CSN$醵rLruirLnn_rL_rLnRrLn_rLrm_nrLrLrLrLrLTLrLMOSIe?£4CJ£
9、;4如n曰助.MISO9fmB33!RM#KE4RX8G型WRfW0>UCMQIS'k»SPI讀時序CSN-、/,sck_TLrLrLrLruiRrLJiRruwmrLrLrLrLrLrLrLrLrLJQSICT0GC4C3crClcvM0Qi3?»nHBUIfKSPI寫時序七、寄存器內(nèi)容及說明地址(十六進制)寄存器位復位值說明00CONFIG配置寄存器Reserved70R/W默認為0MASK_RX_DR60R/W可屏蔽中斷RX_RD1:中斷產(chǎn)生時對IRQ沒影響0:RX_RD中斷產(chǎn)生時,IRQ引腳為低MASK_TX_DS50R/W可屏蔽中斷TX_RD1:中斷
10、產(chǎn)生時對IRQ沒影響0:TX_RD中斷產(chǎn)生時,IRQ引腳為低MASK_MAX_RT40R/W可屏蔽中斷MAX_RT1:中斷產(chǎn)生時對IRQ沒影響0:MAX_RT中斷產(chǎn)生時,IRQ引腳為低EN_CRC31R/WCRC使能。如果EN_AA中任位為高,則EN_CRC為iWj。CRCO20R/WCRC校驗值:0:1字節(jié)1:2字節(jié)PWR_UP10R/W0:掉電1:上電PRIM_RX00R/W0:發(fā)射模式1:接收模式01EN_AAEnhancedShockBurst?使能“自動應答”功能Reserved7:600R/W默認為00ENAA_P551R/W數(shù)據(jù)通道5自動應答使能位ENAA_P441R/W數(shù)據(jù)通道
11、4自動應答使能位ENAA_P331R/W數(shù)據(jù)通道3自動應答使能位ENAA_P221R/W數(shù)據(jù)通道2自動應答使能位ENAA_P111R/W數(shù)據(jù)通道1自動應答使能位ENAA_P001R/W數(shù)據(jù)通道0自動應答使能位02EN_RXADDR接收地址允許Reserved7:600R/W默認為00ERX_P550R/W數(shù)據(jù)通道5接收數(shù)據(jù)使能位ERX_P440R/W數(shù)據(jù)通道4接收數(shù)據(jù)使能位ERX_P330R/W數(shù)據(jù)通道3接收數(shù)據(jù)使能位ERX_P220R/W數(shù)據(jù)通道2接收數(shù)據(jù)使能位ERX_P111R/W數(shù)據(jù)通道1接收數(shù)據(jù)使能位ERX_P001R/W數(shù)據(jù)通道0接收數(shù)據(jù)使能位03SETUP_AW設置地址寬度(所有數(shù)
12、據(jù)通道)Reserved7:2000000R/W默認為00000AW1:011R/W接收/發(fā)射地址寬度:00:無效01:3字節(jié)10: 4字節(jié)11: 5字節(jié)04SETUPRETR自動重發(fā)ARD7:40000R/W自動重發(fā)延時時間:0000:250us0001:500us1111:4000usARC3:00011R/W自動重發(fā)“數(shù):0000:禁止自動重發(fā)0001:自動重發(fā)1次1111:自動重發(fā)15次05RF_CH射頻通道Reserved70R/W默認為0RF_CH6:00000010R/W設置工作通道頻率06RF_SETUP射頻寄存器Reserved7:5000R/W默認為000PLL_LOCK4
13、0R/W鎖相環(huán)使能,測試下使用RF_DR31R/W數(shù)據(jù)傳輸率:0:1Mbps1:2MbpsRF_PWR2:111R/W發(fā)射功率:00:-18dBm01:-12dBm10: -6dBm11: 0dBmLNA_HCURR01R/W低噪聲放大器增益07STATUS狀態(tài)寄存器Reserved70R/W默認值為0RX_DR60R/W接收數(shù)據(jù)中斷位。當收到有效數(shù)據(jù)包后置1。寫1'清除中斷TX_DS50R/W發(fā)送數(shù)據(jù)中斷。如果工作在自動應答模式下,只后當接收到應答信號后置1。寫1'清除中斷MAX_RT40R/W重發(fā)次數(shù)溢出中斷。寫1'清除中斷。如果MAX_RT中斷產(chǎn)生,則必須清除后才
14、能繼續(xù)通訊RX_P_NO3:1111R接收數(shù)據(jù)通道號:000-101:數(shù)據(jù)通道號110:未使用111:RXFIFO寄存器為空TX_FULL00RTXFIFO寄存器滿標志位08OBSERVETX發(fā)送檢測寄存器PLOS_CNT7:40R數(shù)據(jù)包丟失計數(shù)器。當寫RF_CH寄存器時,此寄存器復位。當丟失15個數(shù)據(jù)包后,此寄存器重啟。ARC_CNT3:00R重發(fā)計數(shù)器。當發(fā)送新數(shù)據(jù)包時,此寄存器復位。09CD載波檢測Reserved7:1000000RCD00R0ARX_ADDR_P039:0E7E7E7E7E7R/W數(shù)據(jù)通道0接收地址。最大長度為5個字節(jié)。0BRX_ADDR_P139:0C2C2C2C2
15、C2R/W數(shù)據(jù)通道1接收地址。最大長度為5個字節(jié)。0CRX_ADDR_P27:0C3R/W數(shù)據(jù)通道2接收地址。最低字節(jié)可設置,高字節(jié)必須與RX_ADDR_P139:8相等0DRX_ADDR_P37:0C4R/W數(shù)據(jù)通道3接收地址。最低字節(jié)可設置,高字節(jié)必須與RX_ADDR_P139:8相等0ERX_ADDR_P47:0C5R/W數(shù)據(jù)通道4接收地址。最低字節(jié)可設置,高字節(jié)必須與RX_ADDR_P139:8相等0FRX_ADDR_P57:0C6R/W數(shù)據(jù)通道5接收地址。最低字節(jié)可設置,高字節(jié)必須與RX_ADDR_P139:8相等10TX_ADDR39:0E7E7E7E7E7R/W發(fā)送地址。在Sho
16、ckBurstTM模式,設置RX_ADDR_P0與此地址相等來接收應答信號11RX_PW_P0Reserved7:600R/W默認為00RX_PW_P05:00R/W數(shù)據(jù)通道0接收數(shù)據(jù)有效寬度:0:無效1:1個字節(jié)32:32個字節(jié)12RX_PW_P1Reserved7:600R/W默認為00RX_PW_P15:00R/W數(shù)據(jù)通道1接收數(shù)據(jù)有效寬度:0:無效1:1個字節(jié)32:32個字節(jié)13RXPWP2Reserved7:600R/W默認為00RX_PW_P25:00R/W數(shù)據(jù)通道2接收數(shù)據(jù)有效寬度:0:無效1:1個字節(jié)32:32個字節(jié)14RX_PW_P3Reserved7:600R/W默認為00
17、RX_PW_P35:00R/W數(shù)據(jù)通道3接收數(shù)據(jù)有效寬度:0:無效1:1個字節(jié)32:32個字節(jié)15RX_PW_P4Reserved7:600R/W默認為00RX_PW_P45:00R/W數(shù)據(jù)通道4接收數(shù)據(jù)有效寬度:0:無效1:1個字節(jié)32:32個字節(jié)16RX_PW_P5Reserved7:600R/W默認為00RX_PW_P55:00R/W數(shù)據(jù)通道5接收數(shù)據(jù)有效寬度:0:無效1:1個字節(jié)32:32個字節(jié)17FIFO_STATUSFIFO狀態(tài)寄存器Reserved70R/W默認為0TX_REUSE60R若TX_REUSE=1,則當CE置高時,不斷發(fā)送上一數(shù)據(jù)包。TX_REUSE通過SPI指令RE
18、USE_TX_PL設置;通過W_TX_PALOAD或FLUSH_TX復位TX_FULL50RTX_FIFO寄存器滿標志1:寄存器滿0:寄存器未滿,有口用空間TX_EMPTY41RTX_FIFO寄存器空標志1:寄存器空0:寄存器非空Reserved3:200R/W默認為00RX_FULL10RRXFIFO寄存器滿標志1:寄存器滿0:寄存器未滿,有口用空間RX_EMPTY01RRXFIFO寄存器空標志1:寄存器空0:寄存器非空N/ATX_PLD255:0XWN/ARX_PLD255:0XR八、模塊編程控制1.ShockBurstTM發(fā)射模式設置通過寫TXPLDPRIM_RX為低。SPI接口,將接收
19、節(jié)點地址(TX_ADDR)和有效數(shù)據(jù)(TX_PLD)寫入模塊,時,CSN必須一直置低。置CE為高,啟動發(fā)射。CE高電平持續(xù)時間至少為10us。ShockBurstTM發(fā)射模式:系統(tǒng)上電啟動內(nèi)部16MHz時鐘數(shù)據(jù)打包數(shù)據(jù)發(fā)射若啟動了自動應答模式(ENAA_P0=1),則模塊立即進入接收模式(NO_ACK已設置)。如果接收到應答信號,則表示發(fā)射成功,TX_DS置高且TXFIFO中的有效數(shù)據(jù)被移出;如果沒有接收到應答信號,則自動重發(fā)(自動重發(fā)已設置);如果自動重發(fā)次數(shù)超過最大值(ARC),MAX_RT置高,在TXFIFO中的數(shù)據(jù)不被移出。當MAX_RT和TX_DS置高時,IRQ激活。只有重新寫狀態(tài)寄
20、存器(STATUS)才能關閉IRQ。如果重發(fā)次數(shù)達到最大后,仍沒有接收到應答信號,在MAX_RT中斷清除之前,不會再發(fā)射數(shù)據(jù)。PLOS_CNT計數(shù)器會增加,每當有一個MAX_RT中斷產(chǎn)生。如果CE置低,則系統(tǒng)進行待機模式I,否則發(fā)送TXFIFO寄存器中的下一個數(shù)據(jù)包。當TXFIFO中的數(shù)據(jù)發(fā)射完,CE仍為高時,系統(tǒng)進入待機模式II。在待機模式II下,CE置低,則進入待機模式I。2ShockBurstTM接收模式設置PRIM_RX為高,配置接收數(shù)據(jù)通道(EN_RXADDR)、自動應答寄存器(EN_AA)和有效數(shù)據(jù)寬度寄存器(RX_PW_PX)。置CE為高,啟動接收模式。130us后,模塊檢測空中
21、信號,接收到有效的數(shù)據(jù)包后(地址匹配、CRC檢驗正確),數(shù)據(jù)儲存在RXFIFO中,RX_DR置高。如果啟動了自動應答功能,則發(fā)送應答信號。 MCU置CE為低,進入先機模式I。 MCU可通過SPI接口將數(shù)據(jù)讀出模塊準備好進入發(fā)射模式或接收模式或待機模式。九、RF通道頻率2.400GHz到RF通道頻率指的是nRF24L01所使用的中心頻率,該頻率范圍從2.525GHz,以1MHz區(qū)分一個頻點,故有125個頻點可使用。由參數(shù)RF_CH確定,公式為:Fo=2400+RF_CH(MHz)十、示例程序接收模塊與發(fā)射模塊大部分程序代碼相同,如下:1. SPI命令和寄存器配置頭文件API.h(根據(jù)第六、七兩點
22、編寫)#ifndef_BYTE_DEF_#define_BYTE_DEF_typedefunsignedcharBYTE;#endif/SPI命令#defineREAD_REG0x00/讀第0個寄存器#defineWRITE_REG0x20/寫第0個寄存器#defineRD_RX_PLOAD0x61/在接收模式下使用,讀有效數(shù)據(jù)#defineWR_TX_PLOAD0xA0/在發(fā)送模式下使用,寫有效數(shù)據(jù)#defineFLUSH_TX0xE1在發(fā)送模式下使用,清TXFIFO寄存器#defineFLUSH_RX0xE2在接收模式下使用,清RXFIFO寄存器#defineREUSE_TX_PL0xE3
23、發(fā)送方使用,重復發(fā)送最后的數(shù)據(jù)#defineNOP0xFF空操作用于讀狀態(tài)寄存器STATUS的值/nRF24L01寄存器地址#defineCONFIG0x00/配置寄存器,8bit#defineEN_AA0x01自動應答設置寄存器,8bit#defineEN_RXADDR0x02接收地址設置寄存器,8bit#defineSETUP_AW0x03地址寬度設置寄存器,8bit#defineSETUP_RETR0x04/自動重復發(fā)送設置寄存器,8bit#defineRF_CH0x05/RF通道寄存器,8bit#defineRF_SETUP0x06/RF設置寄存器,8bit#defineSTATUS0
24、x07/狀態(tài)寄存器,8bit#defineOBSERVE_TX0x08發(fā)送觀測寄存器,8bit#defineCD0x09載波檢測寄存器,8bit,#defineRX_ADDR_P00x0A接收地址數(shù)據(jù)通道0,40bit#defineRX_ADDR_P10x0B#defineRX_ADDR_P20x0C#defineRX_ADDR_P30x0D#defineRX_ADDR_P40x0E#defineRX_ADDR_P50x0F#defineTX_ADDR0x10發(fā)送地址.發(fā)送方使用,40bit#defineRX_PW_P00x11/通道0接收的有效數(shù)據(jù)字節(jié)長度(1-32字節(jié)),8bit#defi
25、neRX_PW_P10x12#defineRX_PW_P20x13#defineRX_PW_F30x14#defineRX_PW_F40x15#defineRX_PW_F50x16#defineFIFO_STATUS0x17/FIFO狀態(tài)寄存器,8bit2. SPI操作頭文件(與單片機的接口設置在此頭文件中)#defineucharunsignedchar#defineTXADRWIDTH5地址長度為5個字節(jié)#defineTXPLOADWIDTH20/數(shù)據(jù)長度為20個字節(jié)ucharconstTX_ADDRESSTX_ADR_WIDTH=0xE7,0xE7,0xE7,0xE7,0xE7;ucha
26、rflag;標志位inttest12;#defineCEP0_0芯片使能:ChipEnable#defineCSNP0_1片選信號:ChipSelectNot#defineSCKP1_2串行時鐘信號:SerialClock#defineMOSIP0_3主發(fā)從收:Maste門nSlaveOut#defineMISOP0_4主收從發(fā):MasterOutSlaveIn#defineIRQP3_2中斷查詢:InterruptRequestucharbdatasta;sbitRX_DR=staA6;sbitTX_DS=staA5;sbitMAX_RT=staA4;接收緩沖區(qū)rx_bufTX_PLOAD_
27、WIDTH;charucharSPI_RW(ucharbyte)/寫一個字節(jié)到nRF24L01,并返回止匕時nRF24L01的狀態(tài)及數(shù)據(jù)ucharbit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr+)先寫字節(jié)的高位,再寫低位MOSI=(byte&0x80);byte=(byte<<1);SCK=1;/MOSI取byte最高位/byte左移一位/SCK從高到低時開始寫入byte|=MISO;/獲取MISO位從MOSI寫命令的同時,MISO返回nRF24L01的狀態(tài)及數(shù)據(jù)SCK=0;return(byte);ucharSPI_RW_Reg(BY
28、TEreg,BYTEvalue)/將字節(jié)value寫入寄存器regucharstatus;CSN=0;status=SPI_RW(reg);/CSN為0時才能進行SPI讀寫/選擇寄存器regSPI_RW(value);寫字節(jié)value到該寄存器CSN=1;/終止SPI讀寫return(status);BYTEreg_val;CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);BYTESPI_Read(BYTEreg)/讀寄存器reg狀態(tài)字/CSN為0時,才能進行SPI讀寫/選擇寄存器reg寫0,什么操作也不進行,僅僅為了讀寄存器狀
29、態(tài)/終止SPI讀寫ucharSPI_Read_Buf(BYTEreg,BYTE*pBuf,BYTEbytes)從寄存器reg讀出數(shù)據(jù),典型應用是讀RX數(shù)據(jù)或RX/TXF地址ucharstatus,byte_ctr;CSN=0;/CSN為0時,才能進行SPI讀寫status=SPI_RW(reg);/選擇寄存器reg并返回其狀態(tài)字for(byte_ctr=0;byte_ctr<bytes;byte_ctr+)pBufbyte_ctr=SPI_RW(0);/從寄存器讀數(shù)據(jù)CSN=1;/終止SPI讀寫return(status);/返回狀態(tài)值ucharSPI_Write_Buf(BYTEreg
30、,BYTE*pBuf,BYTEbytes)/將數(shù)據(jù)寫入寄存器,如TX數(shù)據(jù),RX/TX地址等.ucharstatus,byte_ctr;CSN=0;/CSN為0時,才能進行SPI讀寫status=SPI_RW(reg);/選擇寄存器reg并返回其狀態(tài)字for(byte_ctr=0;byte_ctr<bytes;byte_ctr+)SPI_RW(*pBuf+);寫數(shù)據(jù)到寄存器CSN=1;/終止SPI讀寫return(status);/返回狀態(tài)值接收模式初始化:設置RX地址,RX數(shù)據(jù)寬度,RF通道,速率,低噪聲放大器增益/設置完之后,將CE置高,準備好接收數(shù)據(jù)voidRX_Mode(void)
31、SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);/寫TX_Address至UnRF24L01SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);/自動重發(fā)延時:500us+86us;重發(fā)次數(shù):10次SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);將地址TX_ADDRESS寫入寄存器0的數(shù)據(jù)通道0SPI_RW_Reg(WRITE_REG+EN_A
32、A,0x01);/ENAA_P0=1,數(shù)據(jù)通道0自動應答SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);/ERX_P0=1,使能SPI_RW_Reg(WRITE_REG+RF_CH,40);/40個通信頻段SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);/數(shù)據(jù)通道0的RX數(shù)據(jù)長度為TX_PLOAD_WIDTH,要與發(fā)送的一致SPI_RW_Reg(WRITE_REG+RF_SETUP,0x0F);速率為2Mbps,發(fā)送功率為0dBm,低噪聲放大器增益為1SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);/PR
33、IM_RX=1,接收方;PWR_UP=1;CRC檢驗字為2字節(jié);發(fā)送模式初始化:設置發(fā)送地址,設置發(fā)送的數(shù)據(jù),設置接收方地址,RF通道,速率等,與接收類似voidTX_Mode(void)SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);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_Write
34、_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);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,0x0f);顯示狀態(tài)寄存器的值/0x01/0x01/0x03,5個字節(jié)/0x1a/0x28/0x0f/0x14voidshow_status(void)test0=SPI_Read(
35、EN_AA);test1=SPI_Read(EN_RXADDR);test2=SPI_Read(SETUP_AW);test3=SPI_Read(SETUP_RETR);test4=SPI_Read(RF_CH);test5=SPI_Read(RF_SETUP);test6=SPI_Read(RX_ADDR_P2);test7=SPI_Read(RX_ADDR_P3);test8=SPI_Read(RX_ADDR_P4);test9=SPI_Read(RX_ADDR_P5);test10=SPI_Read(RX_PW_P0);test11=SPI_Read(STATUS);voidinit_i
36、o(void)CE=0;CSN=1;SCK=0;voidInituart(void)/設置串口工作模式TMOD|=0x20;TL1=0xfd;TH1=0xfd;SCON=0x50;TR1=1;TI=1;voidinit_int0(void)外部中斷設置EA=1;ES=1;EX0=1;voiddelay_ms(unsignedintx)unsignedinti,j;/待機/SPI禁止讀寫/定時器1工作在方式2,8位自動重裝模式波特率為9600/模式1,8位數(shù)據(jù)啟動定時器1允許全局中斷開串行口中斷允許外部中斷0毫秒級延時i=0;for(i=0;i<x;i+)j=108;while(j-);3
37、.發(fā)送模塊主函數(shù)(向接收模塊發(fā)射數(shù)據(jù)“abcdefg",中斷方式)voidmain(void)inti;init_io();/IO端口設置Inituart();串口設置init_int0();/外部中斷0設置for(i=0;i<7;i+)待發(fā)的數(shù)據(jù)tx_buf,發(fā)送的數(shù)據(jù)為"abcdefg"七個字母tx_bufi='a'+i;while(1)CE=0;/Standby-1模式TX_Mode();發(fā)送設置CE=1;啟動發(fā)送模式delay_ms(20);CE=0;/Standby-1模式delay_ms(1000);中斷函數(shù)/如果RX_DR=1,
38、則讀取數(shù)據(jù),之后清除標志位;/如果TX_DS或MAX_RT為1,則僅清除中斷標志位voidISR_int0(void)interrupt0sta=SPI_Read(STATUS);讀狀態(tài)寄存器STATUSif(RX_DR)如接收到數(shù)據(jù),則中斷SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);讀取接收的數(shù)據(jù)flag=1;標志位置高if(MAX_RT)/重發(fā)中斷達到最大數(shù)SPI_RW_Reg(FLUSH_TX,0);清除TXFIFO寄存器SPI_RW_Reg(WRITE_REG+STATUS,sta);清除RX_DR,TX_DS和MAX_RT中斷標志位
39、4.接收模塊主函數(shù)(接收并在串口輸出,同時輸出狀態(tài)寄存器的值,使用查詢方式)voidmain(void)inti;init_io();/IO端口設置Inituart();串口設置init_int0();/外部中斷0設置CE=0;/Standby-1模式RX_Mode();設置接收模式CE=1;準備接收數(shù)據(jù)while(1)sta=SPI_Read(STATUS);if(RX_DR)接收到數(shù)據(jù)SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);讀取接收的數(shù)據(jù)for(i=0;i<7;i+)printf("%c",rx_bufi);
40、/通過串口發(fā)送接收到的數(shù)據(jù)printf("n");show_status();/B出狀態(tài)寄存器的值,可不用此操作for(i=0;i<12;i+)printf("%x",testi);printf("n");delay_ms(10);重發(fā)中斷達到最大數(shù)清除TXFIFO寄存器清除RX_DR,TX_DS和MAX_RT中斷標志位if(MAX_RT)SPI_RW_Reg(FLUSH_TX,0);SPI_RW_Reg(WRITE_REG+STATUS,sta);最近項目基本都做完了,閑著沒事了,過來整理下博客,分享下自己的程序!這是幾個月前
41、調(diào)通的程序,4L01無線收發(fā)芯片,mcu用的是msp430f2274!該程序花費了我大量心血!算是我學起單片機來攻克的第一塊芯片吧!注釋相當詳細!#include<msp430x22x4.h>#defineuintunsignedint#defineucharunsignedchar/nRF24L01的數(shù)據(jù)寬度,地址寬度,以及數(shù)據(jù)定義# defineTX_ADR_WIDTH4# defineRX_PLOAD_WIDTH4# defineTX_PLOAD_WIDTH4ucharTX_ADDRESS=0xe7,0xe7,0xe7,0xe7;uchardata4="zhou&q
42、uot;ucharrx_buf4;/引腳定義2274#defineCSN_HIGHP3OUT|=BIT1/P3.1控制SPI使能#defineCSN_LOWP3OUT&=BIT1#defineCE_HIGHP3OUT|=BIT2/P3.2控制芯片發(fā)射使能#defineCE_LOWP3OUT&=BIT2#defineIRQP3IN&BIT3/讀取P3.3的值*/*模擬SPI方式*/#defineMOSI_HIGHP3OUT|=BIT4#defineMOSI_LOWP3OUT&=BIT4#defineMISOP3IN&BIT5#defineSCK_HIGHP
43、3OUT|=BIT0#defineSCK_LOWP3OUT&=BIT0/24L01寄存器地址#defineCONFIG0X00/配置寄存器地址#defineEN_AA0X01/自動應答寄存器地址#defineEN_RXADDR0X02/接收地址使能#defineSETUP_AW0X03/設置地址寬度#defineSETUP_RETR0X04/建立自動重發(fā)#defineRF_CH0X05/射頻通道#defineRF_SETUP0X06/射頻寄存器#defineSTATUS0X07/狀態(tài)寄存器#defineOBSERVE_TX0X08/發(fā)送檢測寄存器#defineCD0X09/載波檢測#d
44、efineRX_ADDR_P00X0A/數(shù)據(jù)通道0接收地址#defineRX_ADDR_P10X0B#defineRX_ADDR_P20X0C#defineRX_ADDR_P30X0D#defineRX_ADDR_P40X0E#defineRX_ADDR_P50X0F#defineTX_ADDR0X10/發(fā)送地址寄存器地址#defineRX_PW_P00X11/接收地址通道0有效數(shù)據(jù)寬度#defineRX_PW_P10X12#defineRX_PW_P20X13#defineRX_PW_P30X14#defineRX_PW_P40X15#defineRXPWP50X16# defineFIFO
45、_STATUS0X17/FIFO狀態(tài)寄存器/SPI命令字# defineREAD_REG0X00/讀寄存器命令# defineWRITE_REG0X20/寫寄存器命令# defineRD_RX_PLOAD0X61/讀有效數(shù)據(jù)命令# defineWR_TX_PLOAD0XA0/寫有效數(shù)據(jù)命令# defineFLUSH_TX0XE1/清除TX_FIFO應用于發(fā)射模式# defineFLUSH_RX0XE2/清除RX_FIFO應用于接收模式# defineREUSE_TX_PL0XE3/重新使用上一包有效數(shù)據(jù)# defineNOP0XFF/空操作指令/延時子函數(shù)usvoiddelay_us(uint
46、i)while(i-)_NOP();/*/SPI初始化程序2274voidSPI_INIT()UCA0CTL0|=UCMSB+UCMST+UCSYNC;/3-pin,8-bitSPImasterUCA0CTL1|=UCSSEL_1;/ACLKUCA0BR0|=0x03;/波特率9600UCA0BR1=0;UCA0MCTL=0X91;UCA0CTL1&=UCSWRST;P3SEL|=BIT0+BIT4+BIT5;/正宗SPI寫一字節(jié)數(shù)據(jù)到24L01,同時返回一個自己的數(shù)據(jù)2274ucharSPI_RW(ucharbyte)while(!(IFG2&UCA0TXIFG);UCA0T
47、XBUF=byte;delay_us(200);returnUCA0RXBUF;*/模擬SPI方式ucharSPI_RW(ucharbyte)ucharbit_ctr;uchara,b;for(bit_ctr=0;bit_ctr<8;bit_ctr+)a=(byte&0x80);if(a!=0)MOSI_HIGH;elseMOSI_LOW;byte=(byte<<1);SCK_HIGH;b="P3IN"&BIT5;if(b!=0)byte+=1;else;SCK_LOW;returnbyte;/向寄存器寫一字節(jié)的數(shù)據(jù),同時返回狀態(tài)字ucha
48、rSPI_RW_Reg(ucharreg,ucharvalue)ucharstatus;CSN_LOW;status="SPI"_RW(reg);SPI_RW(value);CSN_HIGH;return(status);/向寄存器讀出一字節(jié)的數(shù)據(jù)ucharSPI_Read(ucharreg)ucharbyte;CSN_LOW;SPI_RW(reg);byte="SPI"_RW(0x00);/寫入一個0x00,讀出數(shù)據(jù)CSN_HIGH;returnbyte;/讀出bytes字節(jié)的數(shù)據(jù)ucharSPI_Read_Buf(ucharreg,uchar*pBu
49、f,ucharbytes)ucharstatus,byte_ctr;CSN_LOW;status="SPI"_RW(reg);/選擇寄存器,并返回狀態(tài)for(byte_ctr=0;byte_ctr<bytes;byte_ctr+)pBufbyte_ctr=SPI_RW(0);CSN_HIGH;return(status);/寫入bytes字節(jié)的數(shù)據(jù)ucharSPI_RW_Buf(ucharreg,uchar*pBuf,ucharbytes)ucharstatus,byte_ctr;CSN_LOW;status="SPI"_RW(reg);for(byte_ctr=0;byte_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025建筑外墻涂料施工合同2
- 2025商業(yè)店鋪買賣合同協(xié)議范本
- 2025天津全日制用工勞動合同
- 《評估你的品德》課件
- 洛陽師范學院《高等混凝土結構理論及應用》2023-2024學年第二學期期末試卷
- 天津石油職業(yè)技術學院《中古文學經(jīng)典鑒賞》2023-2024學年第一學期期末試卷
- 伊春職業(yè)學院《建筑空間設計》2023-2024學年第二學期期末試卷
- 天津和平區(qū)天津市雙菱中學2025屆初三下學期語文試題模擬試題含解析
- 臺州職業(yè)技術學院《動物分子生物技術》2023-2024學年第二學期期末試卷
- 沈陽化工大學《嶺南文化》2023-2024學年第一學期期末試卷
- 企業(yè)危險源辨識與風險評估降低風險措施清單
- 天鵝藝術漆施工方案
- 腦卒中患者口腔健康素養(yǎng)的研究進展
- 2025至2030年中國煤氣渣數(shù)據(jù)監(jiān)測研究報告
- 小學STEM教育中的創(chuàng)新實驗室建設
- 月嫂資格證考試單選題100道及答案
- 川劇 身段知到智慧樹章節(jié)測試課后答案2024年秋四川藝術職業(yè)學院
- 【公開課】跨學科實踐:制作簡易桿秤(課件)-人教版八年級物理下冊
- 2025年保密知識試題庫附參考答案(精練)
- 2024年12月7日浙江省機關單位遴選筆試真題及解析(A卷)
- 2024年公司政工專業(yè)技術工作總結范例(3篇)
評論
0/150
提交評論