天线|RF射频
直播中

莫钻红

7年用户 240经验值
私信 关注
[问答]

NRF24L01不能通信怎么回事


[C] 纯文本查看 复制代码
NRF24L01的数据手册不停翻看了好多了,确实有点不行了,想请人帮帮忙,谢谢大家
[C] 纯文本查看 复制代码

[C] 纯文本查看 复制代码

[C] 纯文本查看 复制代码
#include "NRF2401.h"const unsigned char TX_ADDRESS[TX_ADR_WIDTH] = {0xe7,0xe7,0xe7,0xe7,0xe7};//本地地址const unsigned char RX_ADDRESS0[RX_ADR_WIDTH]= {0xe7,0xe7,0xe7,0xe7,0xe7};//接收地址const unsigned char RX_ADDRESS1[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc2};//接收地址const unsigned char RX_ADDRESS2[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc3};//接收地址const unsigned char RX_ADDRESS3[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc4};//接收地址const unsigned char RX_ADDRESS4[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc5};//接收地址const unsigned char RX_ADDRESS5[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc6};//接收地址unsigned int sta;   //状态标志/************************************NRF24L01初始化************************************/void Set_TxMode(void){  DelayMs(5); CECLR;    // chip enable// CSNSET;   // Spi  disable  SCKCLR;   SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, RX_ADR_WIDTH); //写接收端地址SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS0,RX_ADR_WIDTH);SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);    // IRQ收发完成中断响应,16位CRC,主发送SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                      //频道0自动,ACK应答允许(应该需要关闭自动应答)SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   //SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03);  //收发地址宽度5字节(不知道写不写)SPI_RW_Reg(WRITE_REG + RF_CH, 0x40);        //设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   //设置发射速率为1MHZ,发射功率为最大值0dB}/****************************************************************************************************函数:void SetRX_Mode(void)功能:数据接收配置 ****************************************************************************************************/void Set_RxMode(void){
[C] 纯文本查看 复制代码
tica;line-height:1.5;">//延时至少10us
[C] 纯文本查看 复制代码
DelayMs(5);
[C] 纯文本查看 复制代码
CECLR;SCKCLR;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, TX_ADR_WIDTH);    //写本地地址SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                      SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03);     //看好多都没设置  SPI_RW_Reg(WRITE_REG + RF_CH, 0x40);                   SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //此处CE可能需要拉高,并延时}/**********************************NRF24L01的SPI写时序**********************************/unsigned int SPI_RW(unsigned int uchar){unsigned int bit_num;   for(bit_num=0;bit_num<8;bit_num++) // output 8-bit   {if(uchar & 0x80)MOSISET;else MOSICLR;// output 'uchar', MSB to MOSIuchar = (uchar << 1);           // shift next bit into MSB..SCKSET;                      // SCK置高,理论上需延时40nsDelayUs(1);uchar |= ((GPIOE_IDR & 0x0040)>>6);         //uchar已经左移,故最后一位位0,和0或获得MISO状态,且PE6为输入状态SCKCLR;              // 置低,不解释DelayUs(1);   }    return uchar;               // 返回MISO线状态}/****************************************************************************************************函数:uchar SPI_Read(uchar reg)功能:NRF24L01的SPI时序****************************************************************************************************/unsigned char SPI_Read(unsigned char reg){unsigned char reg_val;CSNSET;                // 置低,则可以开始读写操作CSNCLR;SPI_RW(reg);            // CSN置低后,先给出指令,即寄存器地址reg_val = SPI_RW(0);    // ..then read registervalueCSNSET;                // 置高,读写结束return reg_val;        //return register value}/***************************************************************************************************功能:NRF24L01读写寄存器函数  (感觉应该是写)****************************************************************************************************/unsigned int SPI_RW_Reg(unsigned char reg, unsigned char value){unsigned int status;CSNSET;                   // CSN low, init SPI transactionCSNCLR;status = SPI_RW(reg);      //给出指令,返回状态寄存器地址SPI_RW(value);             // ..and write value to it..CSNSET;                   // CSN high againreturn status;            // return nRF24L01 status uchar}/***************************************************************************************************函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数****************************************************************************************************/unsigned int SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars){unsigned int status,uchar_ctr;CSNSET;                    // Set CSN low, init SPI tranactionCSNCLR;status = SPI_RW(reg);       // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr>6));// 等待接受到数据CECLR; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer数据位数设置的32位revale =1;//读取数据完成标志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){CECLR;//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);  // 装载数据CESET;//置高CE,激发数据发送DelayMs(1);}







这粘上主函数


[C] 纯文本查看 复制代码
int main(){  RCC_HSE_ON();RCC_APB2ENR=0xFFFFFFFF;GPIOA_Init();GPIOB_Init();GPIOC_Init();GPIOD_Init();GPIOE_Init();LCD_Init();//以上的初始化都没问题Set_TxMode();while(1){TxBuf[0]=1;nRF24L01_TxPacket(TxBuf);LCD_WriteString(0,0,"TxBuf[0]=");     //在LCD上显示,TurnChar是我写的一个把整数转化成字符串以便显示的函数LCD_WriteString(0,1,"TxBuf[1]=");LCD_WriteString(55,0,TurnChar(TxBuf[0]));LCD_WriteString(55,1,TurnChar(TxBuf[1]));//LCD_WriteString(0,2,TurnChar(SPI_Read(WR_TX_PLOAD)));LCD_WriteString(0,3,"STATUS=");//SPI_RW_Reg(WRITE_REG+STATUS,0x70);LCD_WriteString(43,3,TurnChar(SPI_Read(STATUS)));DelayMs(1000);}//***********************************************************************************************/*Set_RxMode();while(1){nRF24L01_RxPacket(RxBuf);LCD_WriteString(0,0,"RxBuf[0]=");LCD_WriteString(0,1,"RxBuf[1]=");LCD_WriteString(55,0,TurnChar(RxBuf[0]));LCD_WriteString(55,1,TurnChar(RxBuf[1]));LCD_WriteString(0,3,TurnChar(SPI_Read(STATUS)));if(RxBuf[1]==1){LEDON;LCD_WriteString(0,2,"Received");DelayMs(1);}if(RxBuf[1]==0){LEDCL;LCD_WriteString(0,2,"not received");DelayMs(1);}//RxBuf[1] = 0x00;DelayMs(1000);}*/}




回帖(2)

李汉荣

2020-5-22 15:06:44
先保证能够正常读写寄存器。
举报

何夏庄

2020-5-22 15:18:56

我在主函数里面试着读了读STATUS寄存器的值,读出来是30,1s后变成31,好像不对
举报

更多回帖

相关问答

nRF24L01
发帖
登录/注册
×
20
完善资料,
赚取积分