STM32F103VET6 2.4G通信模塊NRF24L01 GPIO模擬SPI的測試?yán)?/h1>
時(shí)間:2018-07-26 15:00:02
關(guān)鍵字:
2.4g
gpio
nrf24l01
stm32f103vet6
模擬spi
手機(jī)看文章掃描二維碼
隨時(shí)隨地手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
自己畫的一塊基于STM32F103VET6的開發(fā)測試板,留有一個(gè)NRF24L01+的通信接口,之前買了一些NRF24L01+的模塊打算研究一下用上,淘寶上買的比較便宜,可以用于物聯(lián)網(wǎng)方面的無線應(yīng)用吧。
做過NRF905的通信,NRF24L01的也是有些相似。網(wǎng)上教程一大堆,我原理上設(shè)計(jì)為GPIO模擬SPI,因此我找了個(gè)GPIO 模擬SPI通信的例程,改了下,開始出了點(diǎn)問題,后來找到原因并解決,通信正常了。
先說一下問題:
NRF24L01引腳初始化問題,設(shè)置了引腳,但是GPIO初始化時(shí),引腳沒有對應(yīng)上,因此程不跑,串口一直打印 找不到NRF24L01模塊,因?yàn)橛幸粋€(gè)檢測NRF24L01是否存在的函數(shù)。
//上電檢測NRF24L01是否在位
//寫5個(gè)數(shù)據(jù)然后再讀回來進(jìn)行比較,
//相同時(shí)返回值0,表示在位;
//否則返回1,表示不在位.
u8NRF24L01_Check(void)
{
u8buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8buf1[5];
u8i;
NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,buf,5);//寫入5個(gè)字節(jié)的地址.
NRF24L01_Read_Buf(TX_ADDR,buf1,5);//讀出寫入的地址
for(i=0;i<5;i++)
if(buf1[i]!=0XA5)break;
if(i!=5)return1;//NRF24L01不在位
return0;//NRF24L01在位
}
寫進(jìn)去:五個(gè)字節(jié):0xA5,讀出來,全為:0xFF,好像網(wǎng)上也有這樣的問題,其實(shí),是NRF24L01沒有初始化成功的原因。設(shè)置好引腳,初始化GPIO與相應(yīng)的時(shí)鐘后,正常了。
因此注意:void Init_NRF24L01(void) 函數(shù),把GPIO引腳設(shè)置正確。
NRF24L01的驅(qū)動(dòng)程序如下:
NRF24L01.c
#include"NRF24L01.h"
constu8TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//發(fā)送地址
constu8RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址
voidDelay(vu32nCount)
{
for(;nCount!=0;nCount--);
}
//初始化NRF24L01IO口
//CE->PD2,CSN->PD5,SCK->PD3,MOSI->PD6,MISO->PD4,IRQ->PD7
voidInit_NRF24L01(void)
{
//CE->PD2,CSN->PD5,SCK->PD3,MOSI->PD6
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIO的時(shí)鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_3|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
CE_H;//初始化時(shí)先拉高
CSN_H;//初始化時(shí)先拉高
//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讀寫數(shù)據(jù)函數(shù)
u8SPI_ReadWriteByte(u8TxData)
{
u16bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
if(TxData&0x80)
MOSI_H;
else
MOSI_L;
TxData=(TxData<<1);
SCK_H;
Delay(0xff);
if(READ_MISO)
TxData|=0x01;
SCK_L;
Delay(0xff);
}
return(TxData);
}
//上電檢測NRF24L01是否在位
//寫5個(gè)數(shù)據(jù)然后再讀回來進(jìn)行比較,
//相同時(shí)返回值0,表示在位;
//否則返回1,表示不在位.
u8NRF24L01_Check(void)
{
u8buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8buf1[5];
u8i;
NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,buf,5);//寫入5個(gè)字節(jié)的地址.
NRF24L01_Read_Buf(TX_ADDR,buf1,5);//讀出寫入的地址
for(i=0;i<5;i++)
if(buf1[i]!=0XA5)break;
if(i!=5)return1;//NRF24L01不在位
return0;//NRF24L01在位
}
//通過SPI寫寄存器
u8 NRF24L01_Write_Reg(u8 reg_addr,