包養網比較為什么用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)至于通訊的協定與數據格局,可以自界說,當然,接受與發送效能可以集一身。
顛末測試,正常。
發佈留言