久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 45855|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

NRF24l01無(wú)線模塊調(diào)試心得!STM32_SPI驅(qū)動(dòng)NRF24L01+

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82083 發(fā)表于 2015-6-9 02:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
經(jīng)過(guò)兩日的調(diào)試nRF24L01終于調(diào)試成功。耐心,細(xì)心。有想法。資料。數(shù)據(jù)手冊(cè)。總就會(huì)成功。


   下面是調(diào)試的基本方法:           
   
24L01是收發(fā)雙方都需要編程的器件,這就對(duì)調(diào)試方法產(chǎn)生了一定的要求,如果兩塊一起調(diào),那么通訊不成功,根本不知道是發(fā)的問(wèn)題還是收的問(wèn)題,不好意思的說(shuō),我當(dāng)時(shí)也是沒(méi)理清調(diào)試思路才浪費(fèi)了一天時(shí)間看著模塊干瞪眼。并且燒壞了兩個(gè)模塊。(還好這個(gè)模塊可以》。。。。。)。

所以正確的調(diào)試方法應(yīng)該是先調(diào)試發(fā)送方,能保證發(fā)送正確,再去調(diào)接收,這樣就可以有針對(duì)性的解決問(wèn)題。
至于怎么去調(diào)發(fā)送方,先說(shuō)下發(fā)送方的工作流程:

??配置寄存器使芯片工作于發(fā)送模式后拉高CE端至少10us
??讀狀態(tài)寄存器STATUS
??判斷是否是發(fā)送完成標(biāo)志位置位
??清標(biāo)志
??清數(shù)據(jù)緩沖

網(wǎng)上的程序我也看過(guò),大多都是成品,發(fā)送方發(fā)送-等應(yīng)答-(自動(dòng)重發(fā))-觸發(fā)中斷?墒沁@樣的流程就已經(jīng)把接收方給牽涉進(jìn)來(lái)了,就是說(shuō)一定要接收方正確收到數(shù)據(jù)并且回送應(yīng)答信號(hào)之后發(fā)送方才能觸發(fā)中斷,結(jié)束一次完整的發(fā)送?墒沁@跟我們的初衷不相符,我們想單獨(dú)調(diào)試發(fā)送,完全拋開(kāi)接收,這樣就要去配置一些參數(shù)來(lái)取消自動(dòng)應(yīng)答,取消自動(dòng)重發(fā),讓發(fā)送方達(dá)到發(fā)出數(shù)據(jù)就算成功的目的。
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);        // 失能通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);    // 失能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);  // 失能自動(dòng)重發(fā)
1有了以上這三個(gè)配置,發(fā)送方的流程就變成了發(fā)送-觸發(fā)中斷。這樣就拋開(kāi)了接收方,可以專心去調(diào)試發(fā)送,可是怎么樣才知道發(fā)送是否成功呢,要用到另外兩個(gè)寄存器,STATUS和FIFO_STATUS。


這樣就很清晰了,我們可以通過(guò)讀取STATUS的值來(lái)判斷是哪個(gè)事件觸發(fā)了中斷,寄存器4、5、6位分別對(duì)應(yīng)自動(dòng)重發(fā)完成中斷,數(shù)據(jù)發(fā)送完成中斷,數(shù)據(jù)接收完成中斷。也就是說(shuō),在之前的配置下,如果數(shù)據(jù)成功發(fā)送,那么STATUS的值應(yīng)該為0x2e。這樣就可以作為一個(gè)檢測(cè)標(biāo)準(zhǔn),另外一個(gè)標(biāo)準(zhǔn)可以看FIFO_STATUS寄存器,第5位的描述:發(fā)送緩沖器滿標(biāo)志,1為滿,0為有可用空間;第4位的描述:發(fā)送緩沖器空標(biāo)志,1為空,0為有數(shù)據(jù);同樣可以看到接收緩沖器的對(duì)應(yīng)標(biāo)志。這樣在數(shù)據(jù)發(fā)送成功后,發(fā)送寄存器當(dāng)然應(yīng)該是空的,接收緩沖因?yàn)樵谥耙呀?jīng)失能,所以也應(yīng)該是空,也就是說(shuō)成功發(fā)送之后的FIFO_STATUS寄存器值應(yīng)該是0x11。
有了這兩個(gè)檢測(cè)標(biāo)準(zhǔn),我們即使不用接收方也可以確定發(fā)送方是否成功發(fā)送。當(dāng)發(fā)送方調(diào)試成功之后,在程序里讓它一直發(fā)送,然后我們就可以去調(diào)試接收方,思路是一樣的,同樣說(shuō)下接收方工作流程先。

??配置寄存器使芯片工作于接收模式后拉高CE端至少130us
??讀狀態(tài)寄存器STATUS
??判斷是否是接收完成標(biāo)志位置位
??清標(biāo)志
??讀取數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)
??清數(shù)據(jù)緩沖

然后在初始化配置寄存器的時(shí)候要和發(fā)送方保持一致,比較重要的是要失能自動(dòng)應(yīng)答,使能通道0接收:
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);        // 失能通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    // 接收要使能接收通道0
這樣就可以了,接收方就可以進(jìn)入接收模式去接收數(shù)據(jù)了,這次的調(diào)試就會(huì)靈活一些,因?yàn)槭墙邮諗?shù)據(jù),可以在接收方添加一個(gè)顯示設(shè)備把數(shù)據(jù)直觀的顯示出來(lái),去對(duì)照看是否正確,當(dāng)然還可以使用和發(fā)送方一樣的方法:觀察STATUS和FIFO_STATUS的值,對(duì)照寄存器描述,接收正確時(shí)STATUS的值應(yīng)該是0x40,對(duì)于FIFO_STATUS的情況就多了些,因?yàn)閿?shù)據(jù)寬度的不同也會(huì)造成寄存器的值不一樣,24L01最大支持32字節(jié)寬度,就是說(shuō)一次通訊最多可以傳輸32個(gè)字節(jié)的數(shù)據(jù),在這種情況下,接收成功讀數(shù)據(jù)之前寄存器值應(yīng)該為0x12,讀數(shù)據(jù)之后就會(huì)變成0x11;如果數(shù)據(jù)寬度定義的小于32字節(jié),那么接收成功讀數(shù)據(jù)之前寄存器值應(yīng)該為0x10,讀數(shù)據(jù)之后就會(huì)變成0x11。這個(gè)看起來(lái)挺復(fù)雜,其實(shí)很清晰,大家可以試著分析下,對(duì)照數(shù)據(jù)手冊(cè)分析每個(gè)位的狀態(tài)就可以得到結(jié)果。

好了,到這里對(duì)nRF24L01的調(diào)試基本上就算通了,但是要明白這些只是調(diào)試方法,最終的產(chǎn)品如果不加上應(yīng)答和重發(fā)的話那么數(shù)據(jù)的穩(wěn)定性是很難保證的,所以在基本的通訊建立之后就要把發(fā)送的配置改為:
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       //使能接收通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);  // 自動(dòng)重發(fā)10次,間隔500us
接收方的配置也要更改:
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);        // 失能通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    // 接收要使能接收通道0

這樣發(fā)送和接收就進(jìn)入了一個(gè)標(biāo)準(zhǔn)狀態(tài),發(fā)送-等應(yīng)答-(自動(dòng)重發(fā))-觸發(fā)中斷;接收-應(yīng)答-觸發(fā)中斷,一切按部就班,程序里加上自己的應(yīng)用部分就能實(shí)現(xiàn)很多功能了。




其實(shí)自己摸索單片機(jī)已經(jīng)有一年了,但沒(méi)在網(wǎng)上寫(xiě)過(guò)筆記,終于覺(jué)得既然整天都在各種網(wǎng)站找資料,也看人家的博客,自己也寫(xiě)寫(xiě)筆記,一方面給自己看,一方面作為分享和供批評(píng)。
STM32這塊片子接觸也有半年了,還沒(méi)真正做自己的作品,這陣子和一個(gè)朋友想做一下一個(gè)基于STM32的小作品,要用到無(wú)線控制,決定用NRF24L01+這片芯片,主要也是這片常用,簡(jiǎn)單,也便宜。
   一個(gè)小插曲是在淘寶上淘模塊的時(shí)候發(fā)現(xiàn),相當(dāng)多的店子都寫(xiě)明了是Si24R91(其實(shí)是應(yīng)該是Si24R1,那個(gè)好像是不存在的)這一代替芯片,其實(shí)看了手冊(cè),單單從功能上,Si24R1是提升了一些,屬于向下兼容NRF24L01,但是不解的是淘寶發(fā)回來(lái)的芯片上印的卻是NRF24L01,通過(guò)比對(duì)調(diào)試寄存器的內(nèi)容確實(shí)是NRF24L01(這才讓我不解,商家搞什么名堂)。
   STM32F103VET6有倆SPI接口,選擇用SPI1來(lái)驅(qū)動(dòng)NRF24L01.
    1.配置STM32的SPI1接口:
      1)開(kāi)啟GPIOA,AFIO時(shí)鐘
      2)配置GPIOA對(duì)應(yīng)Pin為SPI1的MISO,MOSI,CLK,NSS(SPI1的NSS已經(jīng)為他用,故用PA1軟件控制NRF24L01的CSN),CE(NRF24L01使能端口),IRQ--NRF24L01的中斷信號(hào)
     3)配置SPI模式
    2.仔細(xì)讀手冊(cè)(重點(diǎn)是時(shí)序和寄存器)
    3.編寫(xiě)用SPI1控制NRF的函數(shù)數(shù)個(gè)
   4.用以上的函數(shù)編寫(xiě)功能函數(shù)
   OK!但這是說(shuō)的。真正做起來(lái)的時(shí)候飽受打擊。串口轉(zhuǎn)USB線壞了,無(wú)奈只能LCD屏來(lái)顯示調(diào)試信息,增大了代碼負(fù)擔(dān)。后來(lái)J-Link有壞了,差點(diǎn)放棄,好在重寫(xiě)了固件還能復(fù)活。
   1)2)步的代碼:
void SPI1_Config(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);               //使能SPI1時(shí)鐘
   
   
     //  PA5--CLK PA7--MOSI 復(fù)用推挽輸入
   GPIO_InitTypeDef GPIO_InitStructure;
     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5|GPIO_Pin_7;
     GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;
     GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
     //PA6--MISO  輸入浮空
   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;
     GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
     GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;
     GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);


   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  
     GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

SPI1_CE_LOW();
   SPI1_NRF_CSN_HIGH();//拉高CSN失能片選
   
   
   SPI_InitTypeDefSPI_InitStructure;                                 //聲明用來(lái)初始化的結(jié)構(gòu)體
     SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;//全雙工
     SPI_InitStructure.SPI_Mode =SPI_Mode_Master;                    //主模式
     SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;                 //一次傳輸8位
     SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low;                       //空閑電平低電平
     SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;                     //第一個(gè)上升沿采樣
     SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;                        //NSS管理為軟件件模式
     SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;//波特率預(yù)分頻8  9MHz
     SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;      //數(shù)據(jù)傳輸?shù)臀辉谇?br />      SPI_InitStructure.SPI_CRCPolynomial =7;                          //CRC校驗(yàn)方式
   SPI_Init(SPI1,&SPI_InitStructure);                                 //初始化
   
   //SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Set);
   
  
   SPI_Cmd(SPI1, ENABLE); //使能SPI1
}//SPI1_Config()

   *操作NRF24L01寄存器的時(shí)候要在待機(jī)模式,CE=0的情況下,沒(méi)發(fā)一個(gè)命令或數(shù)據(jù),都會(huì)返回SPI一個(gè)字節(jié),此字節(jié)是STAUS狀態(tài)寄存器的內(nèi)容,所以寫(xiě)命令的函數(shù)要發(fā)后,讀回一字節(jié),不然,發(fā)完命令,讀數(shù)據(jù)的時(shí)候會(huì)出錯(cuò)。下面就是SPI寫(xiě)1 BYTE的函數(shù)。

u8 SPI_RW_Byte(SPI_TypeDef* SPIx,unsigned char Byte)
{
     while( SPI_I2S_GetFlagStatus(SPIx,SPI_I2S_FLAG_TXE) == RESET); //查發(fā)送緩沖器是否為空,空即可以發(fā)送
     SPI_I2S_SendData(SPIx,Byte);   //庫(kù)函數(shù):發(fā)送一個(gè)字節(jié)
     //當(dāng)SPI接收緩沖器為空時(shí)等待
      while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) ==RESET);
   returnSPI_I2S_ReceiveData(SPIx);
}//SPI_RW_Byte()

  
   *下面一個(gè)是發(fā)寫(xiě)命令+指定字節(jié)數(shù)的數(shù)據(jù)的函數(shù)

u8 SPI_NRF_Write(SPI_TypeDef* SPIx,char CMD,unsigned char*WBuff,unsigned char ByteNUM)
{
unsigned chari,status;
SPI1_CE_LOW();
SPI1_NRF_CSN_LOW();//使能片選

status=SPI_RW_Byte( SPIx , CMD);
for(i=0;i
{
    SPI_RW_Byte( SPIx,*WBuff++);
   //printf("寫(xiě)入第%d個(gè)數(shù)據(jù)\r\n",ByteNUM);   
}
SPI1_NRF_CSN_HIGH();//
return status;
}//SPI_NRF_Write()

    *發(fā)讀命令+指定字節(jié)數(shù)的數(shù)據(jù)的函數(shù)

u8 SPI_NRF_Read(SPI_TypeDef* SPIx,char CMD,unsigned char*RBuff,unsigned char ByteNUM)
{
unsigned char i,status ;
  
SPI1_CE_LOW();
SPI1_NRF_CSN_LOW();
status=SPI_RW_Byte( SPIx , CMD);
for(i=0;i< ByteNUM ;i++)
{   
    RBuff=SPI_RW_Byte(SPIx,NOP);         // 取接收緩沖器,一個(gè)字節(jié)
   //printf("讀出第%d個(gè)數(shù)據(jù)\r\n",ByteNUM);   
   LCD_Num_6x12_O(100,20*(i+1),RBuff,WHITE);  
}
  

SPI1_NRF_CSN_HIGH();
return status;
}//SPI_NRF_Read()


下面是NRF24L01兩種模式TX RX的配置

void SPI_NRF_MOD_TX(void)
{
    u8TX_Array[5];
u8_TX_RX_ADDR_[5]={0xB3,0xB4,0xB5,0xB6,0x05};
  
SPI1_CE_LOW();//CE=0待機(jī)模式
  TX_Array[0]=0x03;//設(shè)置地址寬度11--5字節(jié) 10--4字節(jié) 01-3字節(jié) 00--不合法
SPI_NRF_Write(SPI1,W_REGISTER+SETUP_AW,TX_Array,1);
  TX_Array[0]=0xf3;//建立自動(dòng)重發(fā)間隔‘1111‘--等待4000+86us  15次
SPI_NRF_Write(SPI1,W_REGISTER+SETUP_RETR,TX_Array,1);
  TX_Array[0]=0x02;//射頻通道 X0000010
SPI_NRF_Write(SPI1,W_REGISTER+RF_CH,TX_Array,1);
  TX_Array[0]=0x0f;//射頻參數(shù)寄存器 00001111 2Mbps 發(fā)射功率 00-18dBm 01-12dBm 10-6dBm 11-0dBm 1--低噪聲放大器增益
SPI_NRF_Write(SPI1,W_REGISTER+RF_SETUP,TX_Array,1);
  TX_Array[0]=0x3f;//xx11 11110-5接收通道允許
SPI_NRF_Write(SPI1,W_REGISTER+EN_RXADDR,TX_Array,1);
  TX_Array[0]=0x3f;//xx11 11110-5通道允許自動(dòng)應(yīng)答
SPI_NRF_Write(SPI1,W_REGISTER+EN_AA,TX_Array,1);
   

SPI_NRF_Write(SPI1,W_REGISTER+TX_ADDR,_TX_RX_ADDR_,5);//寫(xiě)入接收發(fā)送數(shù)據(jù)的地址,這個(gè)地址是接收端收件的憑證
SPI_NRF_Write(SPI1,W_REGISTER+RX_ADDR_P0,_TX_RX_ADDR_,5);//寫(xiě)入接收發(fā)送數(shù)據(jù)的地址,這個(gè)地址是接收端收件的憑證


TX_Array[0]=0x0e;//中斷全開(kāi) 發(fā)送模式 PRIM_RX=0PWR_UP=1
SPI_NRF_Write(SPI1,W_REGISTER+CONFIG,TX_Array,1);

TX_Array[0]=0xfe;//1111 xxxx STATUS寄存器寫(xiě)‘1’清除所有標(biāo)志
SPI_NRF_Write(SPI1,W_REGISTER+STATUS,TX_Array,1);

SPI1_CE_HIGH();//CE=1使能發(fā)射模式
Delay_us(100);//CE拉高需要一定的延時(shí)才能進(jìn)行發(fā)送 延時(shí)之后即可通過(guò)SPI接口發(fā)送TX_PLD

}

void SPI_NRF_MOD_RX(void)
{
    u8TX_Array[5];
u8_TX_RX_ADDR_[5]={0xB3,0xB4,0xB5,0xB6,0x05};

SPI1_CE_LOW();//CE=0待機(jī)模式
  TX_Array[0]=0x03;//允許接收通道00000011
SPI_NRF_Write(SPI1,W_REGISTER+EN_RXADDR,TX_Array,1);
  TX_Array[0]=0x03;//設(shè)置地址寬度11--5字節(jié) 10--4字節(jié) 01-3字節(jié) 00--不合法
SPI_NRF_Write(SPI1,W_REGISTER+SETUP_AW,TX_Array,1);
  TX_Array[0]=0x20;//射頻通道 X0000010
SPI_NRF_Write(SPI1,W_REGISTER+RF_CH,TX_Array,1);
  TX_Array[0]=0x0f;//射頻參數(shù)寄存器 00001111 2Mbps 發(fā)射功率 00-18dBm 01-12dBm 10-6dBm 11-0dBm 1--低噪聲放大器增益
SPI_NRF_Write(SPI1,W_REGISTER+RF_SETUP,TX_Array,1);
  TX_Array[0]=0x3f;//xx11 11110-5通道允許自動(dòng)應(yīng)答
SPI_NRF_Write(SPI1,W_REGISTER+EN_AA,TX_Array,1);
  TX_Array[0]=0x04;//xx11 1111數(shù)據(jù)通道0 有效數(shù)據(jù)寬度 (1-32)字節(jié)
SPI_NRF_Write(SPI1,W_REGISTER+RX_PW_P0,TX_Array,1);
  TX_Array[0]=0xfe;//1111 xxxxSTATUS寄存器 寫(xiě)‘1’清除所有標(biāo)志
SPI_NRF_Write(SPI1,W_REGISTER+STATUS,TX_Array,1);

SPI_NRF_Write(SPI1,W_REGISTER+TX_ADDR,_TX_RX_ADDR_,5);//寫(xiě)入接收發(fā)送數(shù)據(jù)的地址,這個(gè)地址是接收端收件的憑證
SPI_NRF_Write(SPI1,W_REGISTER+RX_ADDR_P0,_TX_RX_ADDR_,5);//寫(xiě)入接收發(fā)送數(shù)據(jù)的地址,這個(gè)地址是接收端收件的憑證



TX_Array[0]=0x0f;//接收模式 PRIM_RX=1 PWR_UP=1允許接收終端
SPI_NRF_Write(SPI1,W_REGISTER+CONFIG,TX_Array,1);

SPI1_CE_HIGH();//CE=1使能發(fā)射模式
Delay_us(100);//CE拉高需要一定的延時(shí)才能進(jìn)行發(fā)送 延時(shí)之后即可通過(guò)SPI接口發(fā)送TX_PLD
//輪詢中斷24L01中斷的到來(lái) NRF_Read_IRQ()
}


下面是兩種模式的測(cè)試


ErrorStatus SPI_NRF_TX_DATAS(u8* TBuff,u8 ByteNUM)
{
   u8 Status[1];
do{
  SPI1_CE_LOW();//拉低待機(jī)
   SPI_NRF_Write(SPI1,W_TX_PAYLOAD,TBuff,ByteNUM);//發(fā)送TBuff數(shù)組
  SPI1_CE_HIGH();//拉低待機(jī)
  }while(NRF_Read_IRQ()!=0);//中斷產(chǎn)生時(shí),IRQ引腳低電平
SPI_NRF_Write(SPI1, FLUSH_TX,TBuff,0);
SPI1_CE_LOW();//拉低待機(jī)
Delay_us(100);
SPI_NRF_Read(SPI1,R_REGISTER+STATUS,Status,1);//讀取Status
LCD_Num_6x12_O(200,20,Status[0],WHITE);
if(Status[0]&0x10)
{
  Status[0]&=0x10;
  SPI_NRF_Write(SPI1,W_REGISTER+STATUS,Status,1);//
  LCD_Str_6x12_O_P(220 , 10 ,"TxError!", WHITE);//重發(fā)超時(shí) 發(fā)送失敗
  return ERROR;
}
else
{
  Status[0]&=0x20;
  SPI_NRF_Write(SPI1,W_REGISTER+STATUS,Status,1);//
  LCD_Str_6x12_O_P(240 , 10 ,"TxSuccess", WHITE);//發(fā)送成功
  return SUCCESS;
}
}


ErrorStatus SPI_NRF_RX_DATAS(u8* RBuff)
{
   ErrorStatusRX_Status=SUCCESS;
    u8Status[1];
while(NRF_Read_IRQ()!=0);//中斷產(chǎn)生時(shí),IRQ引腳低電平
SPI1_CE_LOW();//拉低待機(jī),才能操作寄存器
Delay_us(100);
SPI_NRF_Read(SPI1,R_REGISTER+STATUS,Status,1);//讀取Status
switch(Status[0]&0x0e)
{
case 0x0e: RX_Status=ERROR;break; //RX_FIFO 空
default :LCD_Str_6x12_O_P(200 , 10 ,"RxSuccess!", WHITE);//RX_FIFO非空
    break;

}

SPI_NRF_Read(SPI1,R_RX_PAYLOAD,RBuff,4);//讀RX_FIFO
SPI_NRF_Write(SPI1,W_REGISTER+STATUS,Status,1);//處理狀態(tài)寄存器標(biāo)志
return RX_Status;
}


特別要注意的是在發(fā)射模式的時(shí)候,應(yīng)該先拉低CE,先在TX FIFO里寫(xiě)入要發(fā)射的數(shù)據(jù),再拉高CE真正發(fā)射。



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:53728 發(fā)表于 2016-3-21 21:51 | 只看該作者
很好,寫(xiě)的挺好的
回復(fù)

使用道具 舉報(bào)

板凳
ID:140769 發(fā)表于 2017-3-9 21:30 | 只看該作者
樓主寫(xiě)的不錯(cuò),贊!
回復(fù)

使用道具 舉報(bào)

地板
ID:169508 發(fā)表于 2017-3-9 22:00 | 只看該作者
...我的模塊接收距離賊JB近,感覺(jué)像買了假模塊
回復(fù)

使用道具 舉報(bào)

5#
ID:134810 發(fā)表于 2017-9-29 12:46 | 只看該作者
調(diào)通了。又是百度,有事看別人的程序,有事學(xué)spi,又是看寄存器,唉。終于搞起了
回復(fù)

使用道具 舉報(bào)

6#
ID:364163 發(fā)表于 2018-7-3 16:51 | 只看該作者
492324317 發(fā)表于 2017-3-9 22:00
...我的模塊接收距離賊JB近,感覺(jué)像買了假模塊

針對(duì)距離短這一塊有可能是設(shè)置沒(méi)有設(shè)置好。我這邊有一個(gè)SI24R1通訊距離是150-200米的呢。
回復(fù)

使用道具 舉報(bào)

7#
ID:295704 發(fā)表于 2018-11-1 19:08 | 只看該作者
  樓主寫(xiě)的真好
回復(fù)

使用道具 舉報(bào)

8#
ID:428879 發(fā)表于 2018-12-4 15:50 來(lái)自手機(jī) | 只看該作者
statue一直是ff,換到其它寄存器也是ff這是為什么
回復(fù)

使用道具 舉報(bào)

9#
ID:301896 發(fā)表于 2018-12-5 09:21 | 只看該作者
說(shuō)的太好了,可惜沒(méi)看懂。。
回復(fù)

使用道具 舉報(bào)

10#
ID:459268 發(fā)表于 2019-1-1 13:26 | 只看該作者
STM32F411CE+OV2640+NRF24L01+,有沒(méi)有時(shí)間,幫助開(kāi)發(fā)者這個(gè)項(xiàng)目,有償服務(wù)
回復(fù)

使用道具 舉報(bào)

11#
ID:184706 發(fā)表于 2019-1-23 13:32 | 只看該作者
無(wú)有源碼?
回復(fù)

使用道具 舉報(bào)

12#
ID:478236 發(fā)表于 2019-3-12 15:34 | 只看該作者
有點(diǎn)錯(cuò)別字,寫(xiě)得不錯(cuò),哈哈
回復(fù)

使用道具 舉報(bào)

13#
ID:499653 發(fā)表于 2019-4-12 14:17 | 只看該作者
想問(wèn)一下各位怎樣實(shí)現(xiàn)32單片機(jī)與PC端通過(guò)NRf2401無(wú)線傳輸?nrf轉(zhuǎn)usb模塊買了但是不會(huì)用呀
回復(fù)

使用道具 舉報(bào)

14#
ID:363849 發(fā)表于 2019-6-29 22:36 | 只看該作者
博主能不能貼一下源碼,急需
回復(fù)

使用道具 舉報(bào)

15#
ID:380498 發(fā)表于 2019-7-2 11:13 | 只看該作者
對(duì)24L01深惡痛絕啊,那東西太難用了,做產(chǎn)品的時(shí)候幺蛾子不斷,樓主的文章不錯(cuò)
回復(fù)

使用道具 舉報(bào)

16#
ID:689081 發(fā)表于 2020-2-9 16:50 | 只看該作者
宏定義能發(fā)一下嗎
回復(fù)

使用道具 舉報(bào)

17#
ID:691457 發(fā)表于 2020-2-9 18:35 | 只看該作者
樓主的文章不錯(cuò)
回復(fù)

使用道具 舉報(bào)

18#
ID:156302 發(fā)表于 2020-2-10 11:40 | 只看該作者
剛好在做這個(gè), 學(xué)習(xí)一下,感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 九九视频在线观看 | 日日操夜夜操天天操 | 中文字幕在线观看一区 | 欧美成年视频 | 999热精品 | 嫩呦国产一区二区三区av | 精品1区2区 | 一区中文字幕 | 在线播放国产一区二区三区 | 亚洲一区二区视频在线观看 | 色婷婷一区 | 天天色天天| 精品一区久久 | 日韩在线视频观看 | 欧美亚洲国产一区二区三区 | 黄色中文字幕 | 日韩一区二区三区在线 | 国产精品99久久久久久久vr | 午夜男人视频 | 欧美专区日韩 | 国产一区不卡 | 久久久69 | 色网在线播放 | 一级做a | 欧美三级成人理伦 | 91av免费版| 三级国产三级在线 | 国产激情精品一区二区三区 | 欧美日韩一区在线 | 亚洲一区 | 色中文在线 | 午夜tv免费观看 | 日韩一区不卡 | 97久久久久久 | 麻豆国产精品777777在线 | 欧美一区二区三区视频 | 性国产丰满麻豆videosex | 人人爽日日躁夜夜躁尤物 | 国产成人jvid在线播放 | 成人深夜福利网站 |