OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9294|回复: 34

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第三十七章 无线通信实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-26 22:40:12 | 显示全部楼层 |阅读模式

第三十七章  无线通信实验      

ALIENTKE战舰STM32开发板带有一个2.4G无线模块(NRF24L01模块)通信接口,采用8脚插针方式与开发板连接。本章我们将以NRF24L01模块为例向大家介绍如何在ALIENTEK战舰STM32开发板上实现无线通信。在本章中,我们将使用两块战舰STM32开发板,一块用于发送收据,另外一块用于接收,从而实现无线数据传输。本章分为如下几个部分:

37.1 NRF24L01无线模块简介

37.2 硬件设计

37.3 软件设计

37.4 下载验证

37.1 NRF24L01无线模块简介

NRF24L01无线模块,采用的芯片是NRF24L01,该芯片的主要特点如下:

12.4G全球开放的ISM频段,免许可证使用。

2)最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。

3125个可选的频道,满足多点通信和调频通信的需要。

4)内置CRC检错和点对多点的通信地址控制。

5)低工作电压(1.9~3.6V)。

6)可设置自动应答,确保数据可靠传输。

该芯片通过SPI与外部MCU通信,最大的SPI速度可以达到10Mhz。本章我们用到的模块是深圳云佳科技生产的NRF24L01,该模块已经被很多公司大量使用,成熟度和稳定性都是相当不错的。该模块的外形和引脚图如图37.1.1所示:

37.1.1 NRF24L01无线模块外观引脚图

模块VCC脚的电压范围为1.9~3.6V,建议不要超过3.6V,否则可能烧坏模块,一般用3.3V电压比较合适。除了VCCGND脚,其他引脚都可以和5V单片机的IO口直连,正是因为其兼容5V单片机的IO,故使用上具有很大优势。

关于NRF24L01的详细介绍,请参考NRF24L01的技术手册。

37.2 硬件设计 

本章实验功能简介:开机的时候先检测NRF24L01模块是否存在,在检测到NRF24L01模块之后,根据KEY0KEY1的设置来决定模块的工作模式,在设定好工作模式之后,就会不停的发送/接收数据,同样用DS0来指示程序正在运行。

所要用到的硬件资源如下:

1)  指示灯DS0 

2)  KEY0KEY1按键

3) TFTLCD模块

4)  NRF24L01模块

NRF24L01模块属于外部模块,这里我们仅介绍开发板上NRF24L01模块接口和STM32的连接情况,他们的连接关系如图37.2.1所示:

37.2.1 NRF24L01模块接口与STM32连接原理图

       这里NRF24L01也是使用的SPI2,和W25Q64以及SD卡等共用一个SPI接口,所以在使用的时候,他们分时复用SPI2。本章我们需要把SD卡和W25Q64的片选信号置高,以防止这两个器件对NRF24L01的通信造成干扰。

由于无线通信实验是双向的,所以至少要有两个模块同时能工作,这里我们使用2ALIENTEK战舰STM32开发板来向大家演示。

37.3 软件设计

打开上一章的工程,首先在HARDWARE文件夹下新建一个NRF24L01的文件夹。然后新建一个24l01.c24l01.h的文件保存在NRF24L01文件夹下,并将这个文件夹加入头文件包含路径。

       打开24l01.c文件,输入如下代码:

#include "24l01.h"

#include "lcd.h"

#include "delay.h"

#include "spi.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}; //发送地址

//初始化24L01IO

void NRF24L01_Init(void)

{

    RCC->APB2ENR|=1<<3;     //使能PORTB时钟        

    RCC->APB2ENR|=1<<5;     //使能PORTD时钟

    RCC->APB2ENR|=1<<8;     //使能PORTG时钟

    //这里pb12pd2拉高,是为了防止互相影响 .

    //因为他们共用一个SPI.    

    GPIOB->CRH&=0XFFF0FFFF;

    GPIOB->CRH|=0X00030000; //PB12 推挽         

    GPIOB->ODR|=1<<12;      //PB12上拉 防止W25X的干扰                

    GPIOD->CRL&=0XFFFFF0FF;

    GPIOD->CRL|=0X00000300; //PD2 推挽     

    GPIOD->ODR|=1<<2;       //PD2上拉   禁止SD卡的干扰

 

    GPIOG->CRL&=0X00FFFFFF;

    GPIOG->CRL|=0X33000000; //PG6 7 推挽        

    GPIOG->CRH&=0XFFFFFFF0;

    GPIOG->CRH|=0X00000008; //PG8 输入     

    GPIOG->ODR|=7<<6;       //PG6 7 8 上拉 

    SPI2_Init();            //初始化SPI  

    //针对NRF的特点修改SPI的设置

    SPI2->CR1&=~(1<<6);     //SPI设备失能

    SPI2->CR1&=~(1<<1);     //空闲模式下SCK0 CPOL=0

    SPI2->CR1&=~(1<<0);     //数据采样从第1个时间边沿开始,CPHA=0 

    SPI2->CR1|=1<<6;        //SPI设备使能  

    NRF24L01_CE=0;          //使能24L01

    NRF24L01_CSN=1;         //SPI片选取消               

}

//检测24L01是否存在

//返回值:0,成功;1,失败   

u8 NRF24L01_Check(void)

{

    u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};

    u8 i;

    SPI2_SetSpeed(SPI_SPEED_4); //spi速度为9Mhz24L01的最大SPI时钟为10Mhz     NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.  

    NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址 

    for(i=0;i<5;i++)if(buf!=0XA5)break;                                

    if(i!=5)return 1;//检测24L01错误  

    return 0;       //检测到24L01

}       

//SPI写寄存器

//reg:指定寄存器地址

//value:写入的值

u8 NRF24L01_Write_Reg(u8 reg,u8 value)

{

    u8 status; 

   NRF24L01_CSN=0;                 //使能SPI传输

    status =SPI2_ReadWriteByte(reg);//发送寄存器号

    SPI2_ReadWriteByte(value);      //写入寄存器的值

    NRF24L01_CSN=1;                 //禁止SPI传输    

    return(status);                 //返回状态值

}

//读取SPI寄存器值

//reg:要读的寄存器

u8 NRF24L01_Read_Reg(u8 reg)

{

    u8 reg_val;    

    NRF24L01_CSN = 0;          //使能SPI传输      

    SPI2_ReadWriteByte(reg);   //发送寄存器号

    reg_val=SPI2_ReadWriteByte(0XFF);//读取寄存器内容

    NRF24L01_CSN = 1;          //禁止SPI传输          

    return(reg_val);           //返回状态值

}  

//在指定位置读出指定长度的数据

//reg:寄存器(位置)

//*pBuf:数据指针

//len:数据长度

//返回值,此次读到的状态寄存器值

u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)

{

    u8 status,u8_ctr;         

    NRF24L01_CSN = 0;           //使能SPI传输

    status=SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值      

    for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);

//读出数据

    NRF24L01_CSN=1;       //关闭SPI传输

    return status;        //返回读到的状态值

}

//在指定位置写指定长度的数据

//reg:寄存器(位置)

//*pBuf:数据指针

//len:数据长度

//返回值,此次读到的状态寄存器值

u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)

{

    u8 status,u8_ctr;      

    NRF24L01_CSN = 0;          //使能SPI传输

    status = SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值

    for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //写入数据     NRF24L01_CSN = 1;       //关闭SPI传输

    return status;          //返回读到的状态值

}                 

//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:发送完成状况

u8 NRF24L01_TxPacket(u8 *txbuf)

{

    u8 sta;

    SPI2_SetSpeed(SPI_SPEED_8);//spi速度为9Mhz24L01的最大SPI时钟为10Mhz  

    NRF24L01_CE=0;

    NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);

//写数据到TX BUF  32个字节

    NRF24L01_CE=1;//启动发送      

    while(NRF24L01_IRQ!=0);//等待发送完成

    sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值      

    NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DSMAX_RT中断标志

    if(sta&MAX_TX)//达到最大重发次数

    {

        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器

        return MAX_TX;

    }

    if(sta&TX_OK) return TX_OK;//发送完成

    return 0xff;//其他原因发送失败

}

//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:0,接收完成;其他,错误代码

u8 NRF24L01_RxPacket(u8 *rxbuf)

{

    u8 sta;                                        

    SPI2_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz24L01的最大SPI时钟为10Mhz  

    sta=NRF24L01_Read_Reg(STATUS);//读取状态寄存器的值       

    NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DSMAX_RT中断标志

    if(sta&RX_OK)//接收到数据

    {

        NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据

        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器

        return 0;

    }     

    return 1;//没收到任何数据

}                      

//该函数初始化NRF24L01RX模式

//设置RX地址,RX数据宽度,选择RF频道,波特率和LNA HCURR

//CE变高后,即进入RX模式,并可以接收数据了      

void NRF24L01_RX_Mode(void)

{

    NRF24L01_CE=0;   

    NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

//RX节点地址  

    NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答   

    NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址      

    NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);      //设置RF通信频率       

    NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);

//选择通道0的有效数据宽度     

    NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);

//设置TX发射参数,0db增益,2Mbps,低噪声增益开启  

    NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);

//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式

    NRF24L01_CE = 1; //CE为高,进入接收模式

}                      

//该函数初始化NRF24L01TX模式

//设置TX地址,TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,

//波特率和LNA HCURR

//PWR_UP,CRC使能

//CE变高后,即进入RX模式,并可以接收数据了      

//CE为高大于10us,则启动发送.  

void NRF24L01_TX_Mode(void)

{                                                      

    NRF24L01_CE=0;     

    NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);

//TX节点地址

    NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

//设置TX节点地址,主要为了使能ACK    

    NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答   

    NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 

    NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);

//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10

    NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40

    NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f); 

//设置TX发射参数,0db增益,2Mbps,低噪声增益开启  

    NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);   

//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断

    NRF24L01_CE=1;//CE为高,10us后启动发送

}

此部分代码我们不多介绍,在这里强调一个要注意的地方,在NRF24L01_Init函数里面,我们调用了SPI2_Init()函数,该函数我们在第二十八章曾有提到,在第二十八章的设置里面,SCK空闲时为高,但是NRF24L01SPI通信时序如图37.3.1所示:


37.3.1 NRF24L01读写操作时序

上图中Cn代表指令位,Sn代表状态寄存器位,Dn代表数据位。从图中可以看出,SCK空闲的时候是低电平的,而数据在SCK的上升沿被读写。所以,我们需要设置SPICPOLCPHA均为0,来满足NRF24L01SPI操作的要求。所以,我们在NRF24L01_Init函数里面又单独添加了将CPOLCPHA设置为0的代码。保存24l01.c文件,加入到HARDWARE组下。接下来打开24l01.h,输入如下代码:

#ifndef __24L01_H

#define __24L01_H                     

#include "sys.h"    

//NRF24L01寄存器操作命令

#define READ_REG        0x00  //读配置寄存器,5位为寄存器地址

......//省略部分定义

#define FIFO_STATUS     0x17  //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;

//bit1,RX FIFO满标志;bit2,3,保留 bit4,TX FIFO空标志;bit5,TX FIFO满标志;

//bit6,1, 循环发送上一数据包.0,不循环;

//24L01操作线

#define NRF24L01_CE   PGout(6) //24L01片选信号

#define NRF24L01_CSN  PGout(7) //SPI片选信号    

#define NRF24L01_IRQ  PGin(8)  //IRQ主机数据输入

//24L01发送接收数据宽度定义

#define TX_ADR_WIDTH    5       //5字节的地址宽度

#define RX_ADR_WIDTH    5       //5字节的地址宽度

#define TX_PLOAD_WIDTH  32     //32字节的用户数据宽度

#define RX_PLOAD_WIDTH  32     //32字节的用户数据宽度

void NRF24L01_Init(void);                 //初始化

void NRF24L01_RX_Mode(void);       //配置为接收模式

void NRF24L01_TX_Mode(void);              //配置为发送模式

u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s); //写数据区

u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);  //读数据区             

u8 NRF24L01_Read_Reg(u8 reg);                                   //读寄存器

u8 NRF24L01_Write_Reg(u8 reg, u8 value);              //写寄存器

u8 NRF24L01_Check(void);                                     //检查24L01是否存在

u8 NRF24L01_TxPacket(u8 *txbuf);                         //发送一个包的数据

u8 NRF24L01_RxPacket(u8 *rxbuf);                        //接收一个包的数据

#endif

部分代码,主要定义了一些24L01的命令字(这里我们省略了一部分),以及函数声明,这里还通过TX_PLOAD_WIDTHRX_PLOAD_WIDTH决定了发射和接收的数据宽度,也就是我们每次发射和接受的有效字节数。NRF24L01每次最多传输32个字节,再多的字节传输则需要多次传送。

保存24l01.h文件,接下来我们在主函数里面写入我们的实现代码,来达到我们所要求的功能。打开test.c文件在该文件内修改main函数如下:

int main(void)

{                    

       u8 key,mode;

       u16 t=0;               

       u8 tmp_buf[33]; 

      Stm32_Clock_Init(9);    //系统时钟设置

       uart_init(72,9600);      //串口初始化为9600

       delay_init(72);                  //延时初始化

       LED_Init();                 //初始化与LED连接的硬件接口

       LCD_Init();                  //初始化LCD

       usmart_dev.init(72);      //初始化USMART       

      KEY_Init();                  //按键初始化

      NRF24L01_Init();      //初始化NRF24L01

       POINT_COLOR=RED;//设置字体为红色

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"NRF24L01 TEST");  

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/13");             

      while(NRF24L01_Check())   //检查NRF24L01是否在位.

       {

              LCD_ShowString(60,130,200,16,16,"NRF24L01 Error"); delay_ms(200);             

              LCD_Fill(60,130,239,130+16,WHITE); delay_ms(200);         

       }                                                        

       LCD_ShowString(60,130,200,16,16,"NRF24L01 OK");

      while(1)//在该部分确定进入哪个模式!

       {

              key=KEY_Scan(0);

              if(key==KEY_RIGHT)

              {

                     mode=0; break;                 

              }else if(key==KEY_DOWN)

              {

                     mode=1; break;                   

              }

              t++;

              if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode  KEY1:TX_Mode"

); //闪烁显示提示信息

             if(t==200)

              {    

                     LCD_Fill(10,150,230,150+16,WHITE); t=0;                   

              }

              delay_ms(5);    

       }  

      LCD_Fill(10,150,240,166,WHITE);//清空上面的显示              

      POINT_COLOR=BLUE;//设置字体为蓝色   

       if(mode==0)//RX模式

       {

              LCD_ShowString(60,150,200,16,16,"NRF24L01 RX_Mode"); 

              LCD_ShowString(60,170,200,16,16,"Received DATA:");  

              NRF24L01_RX_Mode();               

              while(1)

              {                                                                     

                     if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.

                     {

                            tmp_buf[32]=0;//加入字符串结束符

                            LCD_ShowString(0,190,239,32,16,tmp_buf);   

                     }else delay_us(100);        

                     t++;

                     if(t==10000) {t=0; LED0=!LED0;}//大约1s钟改变一次状态                   

              };   

       }else//TX模式

       {                                                  

              LCD_ShowString(60,150,200,16,16,"NRF24L01 TX_Mode"); 

              NRF24L01_TX_Mode();

              mode=' ';//从空格键开始 

              while(1)

              {                                             

                     if(NRF24L01_TxPacket(tmp_buf)==TX_OK)

                     {

                            LCD_ShowString(60,170,239,32,16,"Sended DATA:");    

                            LCD_ShowString(0,190,239,32,16,tmp_buf);

                            key=mode;

                            for(t=0;t<32;t++)

                            {

                                   key++;

                                   if(key>('~'))key=' ';

                                   tmp_buf[t]=key;    

                            }

                            mode++;

                            if(mode>'~')mode=' ';    

                            tmp_buf[32]=0;//加入结束符                

                     }else

                     {                                                                        

                           LCD_ShowString(60,170,239,32,16,"Send Failed ");

                            LCD_Fill(0,188,240,218,WHITE);//清空上面的显示                 

                     };

                     LED0=!LED0; delay_ms(1500);                                                

              };

       }    

}

至此,我们整个实验的软件设计就完成了。

37.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图37.4.1所示的内容(默认NRF24L01已经接上了):


37.4.1 选择工作模式界面

通过KEY0KEY1来选择NRF24L01模块所要进入的工作模式,我们两个开发板一个选择发送,一个选择接收就可以了。

设置好后通信界面如图37.4.2所示:



37.4.2 通信界面

上图中,左侧的图片来自开发板A,工作在发送模式。右侧的图片来自开发板B,工作在接收模式,A发送,B接收。图中左右图片的数据不一样,是因为我们拍照的时间不一样导致的。

实验32 无线通信实验.rar

157.58 KB, 下载次数: 531

《STM32开发指南》第三十七章 无线通信实验.rar

681.43 KB, 下载次数: 576

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-3-27
在线时间
0 小时
发表于 2013-3-27 16:59:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2013-3-27
在线时间
38 小时
发表于 2013-3-27 17:07:36 | 显示全部楼层
楼主真的很无私
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-30 22:25:52 | 显示全部楼层
回复【3楼】wp053341:
---------------------------------
为什么用战舰迷你库函数V3.5版本的无线通信程序烧写进去后连LCD都没显示呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-4-30 23:29:15 | 显示全部楼层
回复【4楼】回首看那个曾经的我:
---------------------------------
你用的什么板?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-30 23:42:27 | 显示全部楼层
战舰miniban
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-4-30 23:43:49 | 显示全部楼层
回复【6楼】回首看那个曾经的我:
---------------------------------
要嘛战舰板,要嘛mini板,我还没出过战舰mini板....
难道你两款开发板都买了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-30 23:51:27 | 显示全部楼层
不是,,,是迷你板。
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-30 23:53:26 | 显示全部楼层


回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-5-1 00:00:40 | 显示全部楼层
无线通信的时候,用的是迷你板子,v1.9原理图,用的是配套的光盘里面的程序,但是一直停留在这个画面,按键模式也选择了,试了很多次,按键好像不起作用。两块板子都是这样的。






回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-5-1 00:11:57 | 显示全部楼层
你这是MINI板
把PA0和1820的跳线帽拔了,就会正常了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-5-2 15:25:39 | 显示全部楼层
拔了,好了。谢谢。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-1-14 13:48:23 | 显示全部楼层
原子哥我也用F103系列自己做了两个板子,可以正常通信。

因为我需要来回切换收发状态。我想在一个指令发出后切换为接收状态,以发送成功作为一个条件

使用  if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
         {
         }
不过我发现这里返回的一直不是TX_OK,而是MAX_TX。但是那边确实已经接收到了这边发送的数据。原子哥这是什么原因?
我因为需要发送成功后才能将它转为接收状态所以也不敢发一遍不检验就直接走下面程序。

另外我单独跑例程时候if(NRF24L01_TxPacket(tmp_buf)==TX_OK)是可以的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-1-14 16:21:12 | 显示全部楼层
回复【13楼】wwjdwy:
---------------------------------
你代码改了什么地方?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-1-15 20:46:00 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
void NRF24L01_Init(void);//初始化
void NRF24L01_RX_Mode(void);//配置为接收模式
void NRF24L01_TX_Mode(void);//配置为发送模式

这些底层函数都没改动过
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-1-18 21:54:04 | 显示全部楼层
回复【15楼】wwjdwy:
---------------------------------
SPI初始化,这个很关键哦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-1-19 09:04:54 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
原子哥初始化了。单独测过收发,能收能发。
然后是用在工程中,希望实现一个功能是:甲发送一次,乙接收。想通过 if(NRF24L01_TxPacket(tmp_buf)==TX_OK) 来判断乙是否接收到,在这出了问题,乙已经接收到,可是甲这边的返回值不是TX_OK 而是MAX_TX

之前按照你的例程测试模块好坏时候是返回TX_OK
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-1-19 12:56:03 | 显示全部楼层
回复【17楼】wwjdwy:
---------------------------------
哦哦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-1-19 16:48:48 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
哥有啥想法么?呵呵
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-1-19 17:12:09 | 显示全部楼层
回复【19楼】wwjdwy:
---------------------------------
我想是其他代码干扰了NRF24L01的通信,排除法。
先只留下NRF24L01部分,其他的都屏蔽,看看是否OK,然后逐渐添加其他代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-19 12:18:55 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
单独写个测试程序这样自动的收发转换是OK的。
在板子上跑定位到问题:有时OK有时会挂,挂的时候还是接收方接收到已经,可是发送方没有收到正确的ACK,并且RESET按键之后再跑程序仍然会这样,只有硬件断电上电才有可能消除这个问题。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-3-19 18:31:20 | 显示全部楼层
回复【21楼】wwjdwy:
---------------------------------
那就是死的比较彻底了,呵呵。
考虑下不用自动ACK,而采用切换T/R模式,这个方法试试吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-19 18:57:33 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
RESET按键之后程序前面正常但是到了那里就收不到ACK呵呵。

T/R模式?什么意思,不用应答,发完就自己进入接收模式?如果对方没有收到的话就不给我发送数据或者我要的数据啊,我给他发的是要什么数据,然后我转为接收。这个之间想利用ACK来做发送成功的判断
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-3-19 22:58:13 | 显示全部楼层
回复【23楼】wwjdwy:
---------------------------------
就是程序切换发送和接收模式。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-3-23 15:24:10 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
原子哥,我现在用的是433M的RF,把你的2.4G的程序烧进去,可以检测RF在线,可是发送不了数据,你的这个程序兼容433M么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-3-24 00:11:48 | 显示全部楼层
回复【25楼】jidian0177:
---------------------------------
不兼容。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-11-6
在线时间
0 小时
发表于 2014-4-17 10:19:24 | 显示全部楼层
回复【13楼】wwjdwy:
---------------------------------
你好,可以给我发个测试成功的103系列的24L01的双机通讯代码吗?我想在两个最小系统板子上用,用串口打印一下结果就行了。谢谢
QQ137800277
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-4-17 17:58:10 | 显示全部楼层
回复【27楼】南沟的水:
---------------------------------
就用的原子的代码啊,原子的就是双机啊
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-5-23
在线时间
0 小时
发表于 2014-5-23 10:04:28 | 显示全部楼层
我现在在用stc89c51和nrf24l01做无线通讯实验,,,现在想测试它的在不同距离下传送1KB数据的平均传输速度,,,可是它一次只能传32字节,,怎么办?

分次传送实现了但是一次传送32字节,,,没法测出传送1KB数据的平均传输速度,,,请楼主帮助哇
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-8-6
在线时间
0 小时
发表于 2015-8-6 19:49:41 | 显示全部楼层
我下下来得好像少了STM32的map.h文件。不知道是我电脑问题还是压缩包错误了,我是战舰V3
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2015-8-1
在线时间
0 小时
发表于 2015-8-7 14:33:45 | 显示全部楼层
回复【10楼】回首看那个曾经的我:
---------------------------------
我的情况和你一样,按下按键就是没有显示RX的功能,请问怎么破???
回复 支持 反对

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
发表于 2015-8-8 13:14:36 | 显示全部楼层
原子哥,我只想让一个不断接收,然后一个发送,不想用键盘控制,也不用LCD,只要打在串口助手上就行,为什么注释掉了这些NRF24L01_Check就不执行了,直接跳过去什么也不打印?
回复 支持 反对

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
发表于 2015-8-8 15:15:05 | 显示全部楼层
从哪里可以发送自己想要发送的内容?
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-8-9
在线时间
9 小时
发表于 2015-8-9 10:46:15 | 显示全部楼层
回复【5楼】正点原子:
-------------------------
原子哥,我想把SPI改动到A的端口上,这样的话,SPI2应该怎么改动啊?我每次改动,都提示我检测2401失败,
努力不让自己后悔
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-8-10 22:52:27 | 显示全部楼层
回复【34楼】第一缕阳光:
---------------------------------
根据你的硬件连接来改啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 00:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表