发 帖  
原厂入驻New
[问答]

51单片机NRF2401与STM32的NRF2401之间的通讯显示乱码的原因?

173 51单片机 STM32
分享
我用51单片机NRF2401与STM32的NRF2401通讯,,51单片机的作为发送芯片;STM32的作为接收芯片,但是接收打开后很久才能接收到数据并且是乱码,求解答这是什么原因?<br />
附:STM32的程序是用原子哥的测试程序  下面的是51的程序<br />
<div   style="background-color:#E8E8E8;">
[C] 纯文本查看 复制代码

[C] 纯文本查看 复制代码
#include <reg52.h>#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;//****************************************NRF24l01端口定义***************************************sbit MISO=P1^3;sbit MOSI=P1^4;sbitSCK    =P1^2;sbitCE    =P1^1;sbitCSN=P3^2;sbitiRQ=P3^3;//************************************按键***************************************************sbitKEY1=P3^6;sbitKEY2=P3^7;//************************************数码管位选*********************************************sbitLED3=P2^0;sbitled2=P2^1;sbitled1=P2^2;sbitled0=P2^3;//************************************蜂明器***************************************************sbit BELL=P3^4;//***********************************数码管0-9编码*******************************************uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码//*********************************************NRF24L01*************************************#define TX_ADR_WIDTH    5   #define RX_ADR_WIDTH    5   #define TX_PLOAD_WIDTH  32  #define RX_PLOAD_WIDTH  32 uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址unsigned char tf =0;unsigned char TxBuf[33]={0}; // unsigned char RxBuf[33]={0};//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG        0x00  // 读寄存器指令#define WRITE_REG       0x20 // 写寄存器指令#define RD_RX_PLOAD     0x61  // 读取接收数据指令#define WR_TX_PLOAD     0xA0  // 写待发数据指令#define FLUSH_TX        0xE1 // 冲洗发送 FIFO指令#define FLUSH_RX        0xE2  // 冲洗接收 FIFO指令#define REUSE_TX_PL     0xE3  // 定义重复装载数据指令#define NOP             0xFF  // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式#define EN_AA           0x01  // 自动应答功能设置#define EN_RXADDR       0x02  // 可用信道设置#define SETUP_AW        0x03  // 收发地址宽度设置#define SETUP_RETR      0x04  // 自动重发功能设置#define RF_CH           0x05  // 工作频率设置#define RF_SETUP        0x06  // 发射速率、功耗功能设置#define STATUS          0x07  // 状态寄存器#define OBSERVE_TX      0x08  // 发送监测功能#define CD              0x09  // 地址检测           #define RX_ADDR_P0      0x0A  // 频道0接收数据地址#define RX_ADDR_P1      0x0B  // 频道1接收数据地址#define RX_ADDR_P2      0x0C  // 频道2接收数据地址#define RX_ADDR_P3      0x0D  // 频道3接收数据地址#define RX_ADDR_P4      0x0E  // 频道4接收数据地址#define RX_ADDR_P5      0x0F  // 频道5接收数据地址#define TX_ADDR         0x10  // 发送地址寄存器#define RX_PW_P0        0x11  // 接收频道0接收数据长度#define RX_PW_P1        0x12  // 接收频道0接收数据长度#define RX_PW_P2        0x13  // 接收频道0接收数据长度#define RX_PW_P3        0x14  // 接收频道0接收数据长度#define RX_PW_P4        0x15  // 接收频道0接收数据长度#define RX_PW_P5        0x16  // 接收频道0接收数据长度#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置//**************************************************************************************void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);//*****************************************长延时*****************************************void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}//******************************************************************************************uint bdata sta;   //状态标志sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;/******************************************************************************************/*延时函数/******************************************************************************************/void inerDelay_us(unsigned char n){for(;n>0;n--)_nop_();}//=======================================================================================static void Delay1(int n){int i;while(n--)for(i=0;i<80;i++);}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){    inerDelay_us(100); CE=0;    // chip enable CSN=1;   // Spi  disable  SCK=0;   // SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0  SPI_RW_Reg(WRITE_REG + RF_CH, 40);        //   设置信道工作为2.4GHZ,收发必须一致  、、 0SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 、、0SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);   //设置发射速率为1MHZ,发射功率为最大值0dB  、、07}/****************************************************************************************************/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/****************************************************************************************************/uint SPI_RW(uint uchar){uint bit_ctr;   for(bit_ctr=0;bit_ctr<8;bit_ctr++)    {MOSI = (uchar & 0x80);         uchar = (uchar << 1);          SCK = 1;                     uchar |= MISO;        SCK = 0;                }    return(uchar);            /****************************************************************************************************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/****************************************************************************************************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0;              SPI_RW(reg);           reg_val = SPI_RW(0);    CSN = 1;               return(reg_val);       }/****************************************************************************************************//*功能:NRF24L01读写寄存器函数/****************************************************************************************************/uint SPI_RW_Reg(uchar reg, uchar value){uint status;CSN = 0;                   status = SPI_RW(reg);      SPI_RW(value);             CSN = 1;                   return(status);          }/****************************************************************************************************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0;                    status = SPI_RW(reg);       for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr] = SPI_RW(0);     CSN = 1;                           return(status);                   }/*********************************************************************************************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*********************************************************************************************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0;            //SPI使能       status = SPI_RW(reg);   for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //SPI_RW(*pBuf++);CSN = 1;           //关闭SPIreturn(status);    // }/****************************************************************************************************//*函数:void SetRX_Mode(void)/*功能:数据接收配置 /****************************************************************************************************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);   // IRQ收发完成中断响应,16位CRC,主接收CE = 1; inerDelay_us(130);}/******************************************************************************************************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/******************************************************************************************************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){    unsigned char revale=0;sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况if(RX_DR)// 判断是否接收到数据{    CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);revale =1;//读取数据完成标志if(RxBuf[1]==1){ RxBuf[1] = 0x00;  TxBuf[1] = 2 ;  tf = 1 ; }//=======================================================================if(RxBuf[1]==2){ tf=0;//TxBuf[1] = 2 ;  tf = 1 ; RxBuf[1]=0;}}SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}/***********************************************************************************************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/**********************************************************************************************************/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0;//StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);  // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);    // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}//************************************主函数************************************************************void main(void){ uint i;    init_NRF24L01() ;led0=0;led1=1;led2=1;led3=1;P0=0x00;    for(i=0;i<32;i++) TxBuf=i;    TxBuf[32]=0;nRF24L01_TxPacket(TxBuf);// Transmit Tx buffer dataDelay(6000);P0=0xBF;KEY1=0;//强制为发送模式while(1){SetRX_Mode();nRF24L01_RxPacket(RxBuf);    if(KEY1 ==0 ) //进入发送模式  {TxBuf[1] = 1 ; tf = 1 ; P0=seg[(TxBuf[1])];inerDelay_us(20);    }   if (tf==1)       {nRF24L01_TxPacket(TxBuf);SPI_RW_Reg(WRITE_REG+STATUS,0XFF);  TxBuf[1] = 0x00;//TxBuf[2] = 0x00;tf=0;inerDelay_us(200);   }}}
</div>
<br />
<br />
0
2020-7-16 08:01:37   评论 分享淘帖 邀请回答

相关问题

19个回答
用的原子无线代码还是你自己写的?
2020-7-16 06:32:26 评论

举报

STM32的NRF2401的代码是原子哥的呀
<br>&nbsp;STM32的NRF2401的代码是原子哥的呀
2020-7-16 06:46:11 评论

举报

2020-7-16 07:04:09 评论

举报

<br>SPI应该是调通了的,51的程序用两片51能正常通讯,STM32的也一样&nbsp;,不过用STM32收51的就不行了
2020-7-16 07:21:06 评论

举报

<br>我那时候调试的时候可以收51的
2020-7-16 07:36:30 评论

举报

<br>嗯&nbsp;可能我51的程序有错误&nbsp;我再查查吧&nbsp;谢谢了哟!
2020-7-16 07:41:35 评论

举报

回复【6楼】Badu_Space:
<br>--------------------------------
<br>你的51的NRF24L01的程序是你自己写的??
2020-7-16 07:52:42 评论

举报

<br>原子哥的,只是SPI接口是自己模拟的
2020-7-16 08:00:21 评论

举报

<br>嗯&nbsp;&nbsp;这样的呀&nbsp;能不能分享一下51的NRF21L01的程序的。
2020-7-16 08:15:30 评论

举报

我之前也在这一块遇到过问题的啊,也是51与51的调通了,51与32的就有点问题了啊!
<br>望楼主分享一下32与32的通信程序!
2020-7-16 08:34:25 评论

举报

<br>就是原子哥的程序呀&nbsp;例程里面有的呀
2020-7-16 08:40:19 评论

举报

<br>全部否是按着那个改的?但是我拿来用好久就老是不行了啊!
2020-7-16 08:55:05 评论

举报

<br>STM32与STM32之间的通讯用原子哥的板子不用改都可以用的呀,,,
2020-7-16 09:11:26 评论

举报

恩恩,我现在用的这个板子不是原子哥的啊!所以。。。。
2020-7-16 09:21:11 评论

举报

<br>额,应该改引脚就可以的呀
2020-7-16 09:39:34 评论

举报

本来我也是这样想的,结果我用两个32来做通信,发送端一直处于发送最大次数中断!
2020-7-16 09:52:12 评论

举报

<br>那就不清楚了。。。
2020-7-16 09:59:03 评论

举报

楼主,现在你的51做发射。32做接收的调出来了吗。希望指点一下
2020-7-16 10:10:24 评论

举报

楼主指点下   我的51发送  stm 32接收  
2020-7-16 10:15:52 评论

举报

只有小组成员才能发言,加入小组>>

125个成员聚集在这个小组

加入小组

热门话题

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

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