OpenEdv-开源电子网

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

nrf2401 无线通讯 发送不正常 求指点

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-8-6
在线时间
3 小时
发表于 2019-9-14 21:52:53 | 显示全部楼层 |阅读模式
4金钱
背景:手里有两块开发板 精英和mini  看了几遍教程下载官方提供的例程实现了两个模块的通讯,为了检验自己的吸收情况,所以自己动手给mini开发板写一个只发送的程序,只用到LED和SPI外设,相关函数也是参考官方给的例程,精英版作为接收端用官方提供的例程未做修改,但是接收端只能收到四次数据之后就接收不到数据了,发送端也好像是发送四次就不做发送了(发送函数是在一个while(1))循环里,刚刚入门找半天找不到原因,特来求教。上代码,宏定义都是官方例程里的就不贴了
#include "nrf2401.h"
#include "delay.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 nrf2401_Init(void)/
        {
                GPIO_InitTypeDef GPIO_InitStruct;
                SPI_InitTypeDef SPI_InitStruct;
               
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_SPI1,ENABLE);//初始化GPIOA、C、SPI1
               
                GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
                GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
                GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&GPIO_InitStruct);
                GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
               
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP ;   
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStruct);
               
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU  ;   
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStruct);
               
                GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
               
                GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
                GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
                GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOC,&GPIO_InitStruct);
                GPIO_SetBits(GPIOC,GPIO_Pin_4);
               
                SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
                SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
                SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;
                SPI_InitStruct.SPI_CRCPolynomial= 7;
                SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
                SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
                SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
                SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
                SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
                SPI_Init(SPI1, &SPI_InitStruct);
               
                SPI_Cmd(SPI1,ENABLE);
               
               
                NRF24L01_CE=0;        
                NRF24L01_CSN=1;         
        }
void nrf2401_TxMode(void)
        {               
                        NRF24L01_CE=0;
                        nrf2401_WriteBuf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);
                        nrf2401_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);
                        nrf2401_WriteReg(NRF_WRITE_REG+EN_AA,0x01);
                        nrf2401_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);
                        nrf2401_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);
                        nrf2401_WriteReg(NRF_WRITE_REG+RF_CH,40);
                        nrf2401_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0d);
                        nrf2401_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);
                        NRF24L01_CE=0;
        }
u8 SPI_WR_Byte(u8 Txdata)
        {
                //SPI_I2S_SendData(SPI1,Txdata);
                //return SPI_I2S_ReceiveData(SPI1);
                u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
                {
                retry++;
                if(retry>200)return 0;
                }                          
                SPI_I2S_SendData(SPI1, Txdata);
                retry=0;

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
                {
                retry++;
                if(retry>200)return 0;
                }                                                              
        return SPI_I2S_ReceiveData(SPI1);        
        }
u8 nrf2401_WriteBuf(u8 reg,u8 *buf,u8 len)
        {        u8 status,i;
                NRF24L01_CSN=0;
                status=SPI_WR_Byte(reg);
                for(i=0;i<len;i++){
                        SPI_WR_Byte(*buf++);
                }
                NRF24L01_CSN=1;
                return status;
        }

u8 nrf2401_WriteReg(u8 reg,u8 value)
        {
                u8 status;
                NRF24L01_CSN=0;
                status=SPI_WR_Byte(reg);
                SPI_WR_Byte(value);
                NRF24L01_CSN=1;
                return (status);
        }
u8 nrf2401_ReadReg(u8 reg)
        {
                u8 reg_value;
                NRF24L01_CSN=0;
                SPI_WR_Byte(reg);
                reg_value=SPI_WR_Byte(0xff);
                NRF24L01_CSN=1;
                return (reg_value);
}
       
u8 nrf2401_TxPackage(u8*buf)
  {
                u8 sta;
                NRF24L01_CE=0;
                nrf2401_WriteBuf(WR_TX_PLOAD,buf,TX_PLOAD_WIDTH);
                NRF24L01_CE=1;
                while(NRF24L01_IRQ!=0);
                sta=nrf2401_ReadReg(STATUS);
                nrf2401_WriteReg(NRF_WRITE_REG+STATUS,sta);
                if(sta&MAX_TX){
                                nrf2401_WriteReg(FLUSH_TX,0xff);
                        return MAX_TX;
                }
                if(sta&TX_OK){
                        return TX_OK;
                }
                return 0xff;
}
主函数是:
#include "stm32f10x.h"
#include "nrf2401.h"
#include "delay.h"
#include "led.h"
int main (void){
        u8 date[]={'g','h','g','h'};
        LED_Init();                         
        nrf2401_Init();
        nrf2401_TxMode();
        LED0=!LED0;
        while(1){
                nrf2401_TxPackage(date);
                LED0=!LED0;
                delay_ms(1500);               
        }


真心求教

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-8-6
在线时间
3 小时
 楼主| 发表于 2019-9-16 15:04:19 | 显示全部楼层
自己顶一下  有人看到吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-17 00:16:41 | 显示全部楼层
帮顶
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2019-8-13
在线时间
21 小时
发表于 2019-9-17 20:26:34 | 显示全部楼层

楼主您解决了吗?
我调试这个模块也发现,发送数据时好时坏的,有时候可以发有时候不可以发。如果解决了,求解
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 01:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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