為什么用GPIO往聊包養心得模仿NRF24L01通訊其法式卻一向不跑呢

作者:

分類:

包養網比較為什么用GPIO往模仿NRF24L01通訊其法式卻一向不跑呢?NRF24L01的驅動法式該如何往完成呢?

• 無線NRF24L01采用的是模仿SPI通訊,可是數據接受值一向不是無線NRF24L01外部界說的發送掉敗,請問這是為什么?2815
• 如何經由過程STM32F103C8T6模仿SPI往完成NRF24L01通訊模塊呢1435
• 為什么NRF24L01接受端更換新的資料法式或許按復位鍵后其通信就無法正常運轉呢952
     本身畫的一塊基于STM32F103VET6的開闢測試板,留有一個NRF24L01+包養網評價的通訊接口,之前買了一些NRF24L01+的模塊預計研討一下用上,淘寶上買的比擬廉價,可以用于物聯網方面的無線利用吧。
       做過NRF905的通訊,NRF24L01的也是有些類似。網上教程一年夜堆,我道理上design為GPIO模仿SPI,是以我找了個GPIO 模仿SPI通訊的例程,改了下,開端出了點題目,后來找到緣由并處理,通訊正常了。
先說一下題目:
     NRF24L01引腳初始化題目,設置了引腳,可是GPIO初始化時,引腳沒有對應上,是以程不跑,串口一向打印 找不到NRF24L01模塊,由於有一個檢測N包養故事RF24L01能否存在的函數。

//上電檢測NRF24L01能否在位
//寫5個數據然后再讀回來停止比擬,
//雷同時前往值0,表現在位;
//不然前往1,表現不在位.       
u8 NRF24L01_Check(void)
{
        u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
        長期包養u8 buf1[5];
        u8 i;         
        NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,buf,5);//寫進5個字節的地址.       
   包養網單次     NRF24L01_Read_Buf(TX_ADDR,buf1,5);         //讀出包養網dcard寫進的地址       
        for(i=0;i!=0XA5) break;                                         
        if(i!=5) return 1;                      //NRF24L01不在位
               
        return 0;                                     //NRF24L01在位
}             
     
     寫出來:五個字節:0xA5,讀出來,全為:0xFF,似乎網上也有如許的題目,實在,是NRF24L01沒有初始化勝利的緣由。設置好引腳,初始化GPIO與響應的時鐘后,正常了。
是以留意:void Init_NRF24L01(void) 函數,把GPIO引腳設置對的。
     NRF24L01的驅動法式如下:
NRF24L01.c
#include “NRF24L01.h”

const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接受地址                                         

void Delay(vu32 nCount)
{
 for(; nCount != 0; nCount–);
}

//初始化NRF24L01IO口
//CE->PD2,CSN->PD5,SCK->PD3,MOSI->PD6,MISO->PD4,IRQ->PD7
void Init_NRF24L01(void)
{
        //CE->PD2,CSN->PD5,SCK->PD3,MOSI->PD6
        GPIO_InitTypeDef GPIO_InitStructure;                       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 包養平台       //使能GPIO 的時鐘
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_5|GPIO_包養網VIPPin_3|GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //推挽輸入
        GPIO_包養網單次InitStructure.GPI包養dcardO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        CE_H;       //初始化時先拉高
 CSN_H;                                        //初始化時先拉高
       
        //MISO->PD4,IRQ->PD7
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //上拉輸出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
               
        IRQ_H;                                                                              //IRQ置高
        CE_L;                     //使能NRF24L01
        CSN_H;             //SPI片拔取消
}

//模仿SPI讀寫數據函數
u8 SPI_ReadWriteByte(u8 TxData)                           
{               
        u16 bit_ctr;
          for(bit_ctr=0;bit_ctr!=0XA5) break;                                         
        if(i!=5) return 1;                      //NRF24L01不在位
               
        return 0;                                     //NRF24L01在位
}     包養違法        
//經由過程SPI寫存放器
u8 NRF24L01_Write_Reg(u8 reg_addr,包養網心得u8 data)
{
        u8 status;       
    CSN_L;             //使能SPI傳輸
        status =SPI_ReadWriteByte(reg_addr); //發送存放器號
        SPI_ReadWriteByte(data);         //寫進存放器的值
        CSN_H;             //制止SPI傳輸         
        return(status);                            //前往狀況值
}
//讀取SPI存放器值 ,regaddr:要讀的存放器
u8 NRF24L01_Read_Reg(u8 reg_addr)
{
        u8 reg_val;         
        CSN_L;            //使能SPI傳輸               
        SPI_ReadWriteByte(reg_ad包養犯法嗎dr);   //發送存放器號
        reg_val=SPI_ReadWriteByte(0);//讀取存放器內在的事務

        CSN_H;            //制止SPI傳輸                 
        return(reg_val);           //前往狀況值
}       
//在指定地位讀出指定長度的數據
//*pBuf:數據指針
//前往值,此次讀到的狀況存放器值
u8 NRF24L01_Read_Buf(u8 reg_addr,u8 *pBuf,u8 data_len)
{
        u8 status,i;           
        CSN包養女人_L;               //使能SPI傳輸
        status=SPI_ReadWriteByte(reg_addr);   //發送存放器值(地位),并讀取狀況值           
        for(i=0;i=SPI_ReadWriteByte(0);//讀出數據

        CSN_H;               //封閉SPI傳輸
        return status;                 //前往讀到的狀況值
}
//在指定地位寫指定長度的數據
//*pBuf:數據指針
//前往值,此次讀到的狀況存放器值
u8 NRF24L01_Write_Buf(u8 reg_addr, u8 *pBuf, u8 data_len)
{
        u8 status,包養價格i;         
        CSN_L;                         //使能SPI傳輸
        status = SPI_ReadWriteByte(reg_addr);            //發送存包養價格放器值(地位),并讀取狀況值
        for(i=0; i
NRF24L01頭文件:
#ifndef _NRF24L01_H
#define _NRF24L01_H

#include “stm32f10x.h”

/****************************************************************************************************/
//NRF24L01存放器操縱號令
#define SPI_READ_REG    0x00 //讀設置裝備擺設存放器,低5位為存放器地址
#define SPI_WRITE_REG   0x20 //寫設置裝備擺設存放器,低5位為存放器地址
#define RD_RX_PLOAD   0x61 //讀RX有用數據,1~32字節
#define WR_TX_PLOAD   0xA0 //寫TX有用數據,1~32字節
#define FLUSH_TX     0xE1 //肅清TX FIFO存放器.發射形式下用
#define FLUSH_RX     0xE2 //肅清RX FIFO存放器.接受形式下用
#define REUSE_TX_PL   0xE3 //從頭應用上一包數據,CE為高,數據包被不竭發送.
#define NOP          0xFF //空操縱,可以用來讀狀況存放器       

//SPI(NRF24L01)存放器地址
#define CONFIG        0x00 //設置裝備擺設存放器地址;bit0:1接受形式,0發射形式;bit1:電選擇;bit2:CRC形式;bit3:CRC使能;
                     //bit4:中止MAX_RT(到達最年夜重發次數中止)使能;bit5:中止TX_DS使能;bit6:中止RX_DR使能
#define EN_AA       0x01 //使能主動包養情婦應對效能 bit0~5,對應通道0~5
#define EN_RXADDR      0x02 //接受地址答應,bit0~5,對應通道0~5
#define SETUP_AW     0x03 //設置地址寬度(一切數據通道):bit1,0:00,3字節;01,4字節;02,5字節;
#define SETUP_R兩人都站起來後,裴毅忽然開口:“媽媽,我有話要告訴你寶貝。”ETR     0x04 //樹立主動重發;bit3:0,主動重發計數器;bit7:4,主動重發延時 250*x+86us
#define RF_CH       0x05 //RF通道,bit6:0,任務通道頻率;
#define RF_SETUP     0x06 //RF存放器;bit3:傳輸速度(0:1Mbps,1:2Mbps);bit2:1,發射功率;bit0:低噪聲縮小器增益
#define STATUS        0x07 //狀況存放器;bit0:TX FIFO滿標志;bit3:1,接受數據通道號(最年夜:6);bit4,到達最屢次重發
                     //bit5:數據發送完成中止;bit6:接受數據中止;
#define MAX_TX         0x10 //到達包養dcard最年夜發送次數中止
#define TX_OK              0x20 //TX發送完成中止
#define RX_OK           0x40 //接受到數據中止

#define OBSERVE_TX     0x08 //發送檢測存放器,bit7:4,數據包喪失計數器;bit3:0,重發計數器
#define CD         0x09 //載波檢測存放器,bit0,載波檢測;
#define RX_ADDR_P0     0x0A //數據通道0接受地址,最年夜長度5個字節,低字節在前
#define RX_ADDR_P1     0x0B //數據通道1接受地址,最年夜長度5個字節,低字節在前
#define RX_ADD包養網pptR_P2     0x0C //數據通道2接受地址,最低字節可設置,高字節,必需同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3     0x0D //數據通道3接受地址,最低字節可設置,高字節,必需同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4     0x0E //數據通道4接受地址,最低字節可設置,高字節,必需同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5     0x0F //數據通道5接受地址,她起身穿上外套。最低字節可設置,高字節,必需同RX_ADDR_P1[39:8]相等;
#define TX_ADDR       0x10 //發送地址(低字節在前),ShockBurstTM形式下,RX_ADDR_P0與此地址相等
#define RX_PW_P0     0x11 //接受數據通道0有用數據寬度(1~32字節),設置為0則不符合法令
#d包養一個月efine RX_PW_P1     0x12 //接受數據通道1有用數據寬度(1~32字節),設置為0則不符合法令
#define RX_PW_P2     0x13 //接受數據通道2有用數據寬度(1~32字節),設置為0則不符合法令
#define RX_PW_P3     0x14 //接受數據通道3有用數據寬度(1~32字節),設置為0則不符合法令
#define RX_PW_P4     0x15 //接受數據通道4有用數據寬度(1~32字節),設置為0則不符合法令
#define RX_PW_P5     0x16 //接受數據通道5有用數據寬度(1~32字節),設置為0則不符合法令
#defin包養網車馬費e FIFO_STATUS   0x17 //FIFO狀況存放器;bit0,RX FIFO存放器空標志;bit1,RX FIFO滿標志;bit2,3,保存
                     //bit4,TX FIFO空標志;bit5,TX FIFO滿標志;bit6,1,輪迴發奉上一數據包.0,不輪迴;
/**********************************************************************************************************/
//NRF2401片選電子訊號
#define                 CE_L     GPIO_ResetBits(GPIOD, GPIO_Pin_2)
#define                 CE_H     GPIO_SetBits(GPIOD, GPIO_Pin_2)

//SPI片選電子訊號       
#define                 CSN_L   GPIO_ResetBits(GPIOD, GPIO_Pin_5)
#define                 CSN_H   GPIO_SetBits(GPI包養站長OD, GPIO_Pin_5)

//SPI時鐘
#define                 SCK_L        GPIO_ResetBits(包養管道GPIOD , GPIO_Pin_3)
#define                 SCK_H        GPIO_SetBits(GPIOD , GPIO_Pin_3)

//SPI輸入
#define                 MOSI_L        GPIO_ResetBits(GPIOD , GPIO_Pin_6)
#define                 MOSI_H        GPIO_SetBits(GPIOD , GPIO_Pin_6)

//SPI輸出
#define                 READ_MISO        GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_4)
   
//IRQ中止腳
#define                 IRQ_L          GPIO_ResetBits(GPIOD,GPIO_Pin_7)
#defi包養俱樂部ne                 IRQ_H          GPIO_SetBits(GPIOD,GPIO_Pin_7)

#define                 READ_IRQ    GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)

//NRF24L01發送接受數據寬度界說
#define TX_ADR_WIDTH    5              //5字節的地址寬度
#define RX_ADR_WIDTH    5              //5字節的地址寬度
#define TX_PLOAD_WIDTH 32             //20字節的用戶數據寬度
#define RX_PLOAD_WIDTH 32             //20字節的用戶數據寬度
                                                                                   

void Init_NRF24L01(void);             //NRF24l01初始化
u8 SPI_ReadWriteByte(u8 TxData) ;                                               //模仿SPI通信函數
void RX_Mode(void);                 //設置裝備擺設為接受形式
void TX_Mode(void);                 //設置裝備擺設為發送形式
u8 NRF24L01_Write_Buf(u8 regaddr, u8 *pBuf, u8 datalen); //寫數據區
u8 NRF24L01_Read_Buf(u8 regaddr, u8 *pBuf, u8 datalen); //讀數據區                 
u8 NRF24L01_Read_Reg(u8 regaddr);                           //讀存放器
u8 NRF24L01_Write_Reg(u8 regaddr, u8 data);         //寫存放器
u8 NRF24L01_Check(void);                       //檢討NRF24L01能否在位
u8 NRF24L01_TxPacket(u8 *txbuf);                  //發送一個包的數據
u8 NRF24L01_RxPacket(u8 *rxbuf);                  //接受一個包的數據

void Delay(vu32 nCount);
#endif
接受真個main函數:
/********************     (C包養網評價) COPYRIGHT 2017     **************************
* 文件名 :main.c
* 描寫    :NRF24L01+ 的 接受 測試法式 
* 試驗平臺:STM32F103VET6
* 庫版本 :ST3.5.0
* 編寫每日天期:2017六桌的客人,一半是裴奕認識的經商朋友,另一半是住在半山腰的鄰居。雖然住戶不多,但三個座位上都坐滿了每個人和他們-04-17
* 修正每日天期:2017-04-17
* 作者    :
* 2017-04-17
* (1)NRF24L01+ 接受數據 測試正常!
**********************************************************************************/
包養平台
#include “usart1.h”
#include “led.h”
#include “tim2.h”
#include “NRF24L01.h”
#include “SysTick.h”

/*
* 函數名:main
* 描寫 : “主機”的主函數
* 輸出 :無
* 輸入 : 無
*/

int main(void)
{       
        uint8_t tmp_buf[6];

        SysTick_Init();
        USART1_Config(115200);                                                /* 初始化USART1 */
        LED_GPIO_Config();                                                        /* 運轉LED初始化 */
        TIM2_Config();                                                                                 /* 按時器TIM2初始化 */       
        Init_NRF24L01();
        printf(“STM32F103VET6 NRF24L01 RECV Test!rn”);
        printf(“2017-04-17rn”);
        if(NRF24L01_Check())
        {
                printf(“NRF24L01 is Not work!rn”);
        }
        RX_Mode();                        //只收不發

        while(1)
        {
                if(NRF24L01_RxPacket(tmp_buf)==0)                //接受到數據
                {
 包養意思                       printf(“rn RECV Data is:%srn”,tmp_buf);
                        LED1(ON);
                        Delay_ms(100);
                }
                LED1(OFF);
        }
}
/******************* (C) COPYRIGHT 2017 *****END OF FILE************/

發送真個main函數:
/********************     (C) COPYRIGHT 2017     **************************
* 文件名 :main.c
* 描寫    :NRF24L01+ 發送數據測試法式
* 試驗平臺:S包養意思TM32F103VET6
* 庫版本 :ST3.5.0
* 編寫每日天期:2017-04-17
* 修正每日天期:2017-04-17
* 作者    :
* 2017-04-1包養金額7
* (1)NRF24L01+ 發送數據 測試正常!
****************************************************************************包養俱樂部******/

#include “usart1.h”
#include “led.h”
#include “tim2.h”
#include “NRF24L01.h”
#include “SysTick.h”

/*
* 函數名:main
* 描寫 : “主機”的主函數
* 輸出 :無
* 輸入 : 無
*/

int main(void)
{       
        uint8_t tmp_buf[6] = {0x31,0x32,0x33,0x34,0x35,0x36};

        SysTick_Init();
        USART1_Config(115200);                                                /* 初始化USART1 */
        LED_GPIO_Config();                                                        /* 運轉LED初始化 */
        TIM2_Config();                                                                                 /* 按時器TIM2初始化 */       
        Init_NRF24L01();
        printf(“STM32F103VET6 NRF24L01 SEND Test!rn”);
        printf(“2017-04-17rn”);
        if(NRF24L01_Check())
        {
                printf(“NRF24L01 is Not work!rn”);
        }
        TX_Mode();                //只發不收

        while(1)
        {
                if(NRF24L01_TxPacket(tmp_buf)==TX_OK)                // 判定能否發送完成
                {
                        printf(“Send Data:%srn”,tmp_buf)包養俱樂部;
                        LED1(ON);
                        Delay_ms(500);
                        LED1(OFF);
                }                       
                else                                                                          //發送掉敗
                {                                                                                         
                      雖然有心理準備,但她知道,如果嫁給了這樣一個錯誤的家庭,她的生活會遇到很多困難和困難,甚至會為難和難堪,但她從  printf(“請斷定接受端能否正常!rn”);
                        Delay_ms(500);         
                }
        }
}
/*********包養價格ptt********** (C) COPYRIGHT 2017 *****END OF FILE************/

測試的方式:
(1)需求兩個開闢板來測試,一個用于接受,另一個用于發送。
(2)重要看接受能否正常,正常的話,LED燈會亮一下,并且串口打印收到的數據。
(3)至于通訊的協定與數據格局,可以自界說,當然,接受與發送效能可以集一身。
    顛末測試,正常。


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *