首页 > 编程知识 正文

nrf24l01通信协议,canal的详细使用

时间:2023-05-05 06:14:05 阅读:125031 作者:182

NRF2401引线

8.IRQ7. mis o6.mos i5.sck4. csn3. ce2.VC C1.gnd具体说明:

3.CE芯片的模式控制线。 如果CSN为低,则CE与NRF24L01的配置寄存器协作来确定NRF24L01的状态(参见NRF24L01的状态机)。 4.CSN是芯片切片线CSN是低电平芯片操作5.SCK是芯片控制时钟线(SPI时钟)6.MOSI是芯片控制数据线(Master output slave input )主输出是输入5.SCK output ) )的中断时为低电平,即NRF24L01内部发生中断时,IRQ引脚从高电平变为低电平。 发送Tx FIFO,ack (启用ack时)、Rx FIFO (启用ack时)这三种情况下,引脚较低

接收数据并达到最大重发次数NRF2401的5种状态机

断电模式(nRF24L01使用最小消耗电流禁用。 所有可用寄存器值保持不变,SPI保持活动状态,以便您可以更改配置和数据寄存器的上载/下载。 (要进入此模式,nRF24L01必须将PWR_UP位设置为高电平,将PRIM_RX位设置为低电平,TX FIFO的有效载荷和CE的高电平脉冲必须超过10s。 nRF24L01将进入TX模式,直到数据包发送完成。 如果CE=0,则nRF24L01返回待机I模式。 CE=1时,TX FIFO的状态决定下一个操作。 如果TX FIFO不为空,nRF24L01将在TX模式下发送下一个数据包。 如果TX FIFO为空,则nRF24L01进入待机II模式。 TX模式时,nRF24L01发射器PLL在开环状态下操作。 重要的是,一次在TX模式下保持nRF24L01的时间不能超过4ms。 启用扩展ShockBurst功能后,nRF24L01在TX模式下不会超过4ms。 )接收模式(nRF24L01一定将PWR_UP比特设置为高电平,将PRIM_RX比特设置为低电平,并且TX FIFO下的有效载荷和CE下的高电平脉冲超过10s。 nRF24L01将进入TX模式,直到数据包发送完成。 如果CE=0,则nRF24L01返回待机I模式。 CE=1时,TX FIFO的状态决定下一个操作。 如果TX FIFO不为空,nRF24L01将在TX模式下发送下一个数据包。 如果TX FIFO为空,则nRF24L01进入待机II模式。 TX模式时,nRF24L01发射器PLL在开环状态下操作。 重要的是,一次在TX模式下保持nRF24L01的时间不能超过4ms。 启用扩展ShockBurst功能后,nRF24L01在TX模式下不会超过4ms。 )待机1模式(CONFIG寄存器的PWR_UP位设置为1,设备进入待机I模式。 如果功耗最低且只能配置寄存器spi (待机2模式) CE在具有空TX FIFO的PTX设备上保持高电平,则nRF24L01将进入待机II模式。 在此模式下,时钟正常工作,新数据包上载到TX FIFO后,PLL会立即启动,并在正常的PLL建立延迟(130s )后发送数据包。 ) NRF2401初始化发送模式

开机并进入powerDown (在节能模式下只能配置通过spi发送的数据,可以接收并写入寄存器) )。

发送目标地址(接收方的地址)接收到的地址(本站地址)自动响应)配置,不是默认的。 如果启用,则在发送后立即转移到接收模式)频率配置) 2.4G-2.512G 2M信道2信道则频率2400 2*2=2404MHZ接收也必须是2信道)根据接收距离调整功率强度- 12 //待机CSN=1; //SPI禁止SCK=0; //SPI低时钟延迟(200; 戴尔(200; 戴尔(200; CE=0; //芯片启用CSN=1; //SPI禁用sck=0; //SPI _ write _ buf (write _ regtx _ addr,TX_ADDRESS,ADR_WIDTH ); //写本地地址SPI _ write _ buf (write _ re grx _ addr _ P0,RX_ADDRESS,ADR_WIDTH ); //接收方地址SPI_rw_reg(write_regen_aa,0x01 ); //在通道0自动ACK响应中显示SPI_rw_reg(write_regen_rxaddr,0x01 ); //接收许可地址仅限通道0,需要多个通道时请参照page 21 SPI _ rw _ reg (write _ re GRF _ ch,0 )。 //将信道操作设置为2.4GHZ,并且发送和接收必须匹配SPI_rw_reg(write_regrx_pw_p0,PLOAD_WIDTH )。 //设定接收数据长度,

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB delays(200);delays(200);} /****************************************************************************************************//*功能:数据接收模式 nRF24L01_RX_Mode(RxBuf);//数据接收到寄存器/****************************************************************************************************/void nRF24L01_RX_Mode(unsigned char * RX_buf){CE=0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, ADR_WIDTH); // 写本地地址SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);// IRQ收发完成中断响应,16位CRC,接收sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况if(RX_DR)// 判断是否接收到数据SPI_Read_Buf(RD_RX_PLOAD,RX_buf,PLOAD_WIDTH);//读取数据完成标志SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志CE = 1; delays(200);//Delay(200);Delay(200);} /***********************************************************************************************************/*功能:发送 TX_buf中数据/**********************************************************************************************************/void nRF24L01_TX_Mode(unsigned char * TX_buf){CE=0;//StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, TX_buf, PLOAD_WIDTH);// 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);// IRQ收发完成中断响应,16位CRC,发送CE=1; //置高CE,激发数据发送delays(250);//模块发送延时重要120-250之间//Delay(250);//模块发送延时重要120-250之间} /****************************************************************************************************/*功能:NRF24L01的 SPI同步读写时序/****************************************************************************************************/uchar SPI_RW(uchar reg){uchar bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit {MOSI = (reg & 0x80); // output 'uchar', MSB to MOSIreg = (reg << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..reg |= MISO; // capture current MISO bitSCK = 0; // ..then set SCK low again } return(reg); // return read uchar}/****************************************************************************************************/*功能:NRF24L01的SPI读寄存器时序/****************************************************************************************************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; // CSN low, initialize SPI communication...SPI_RW(reg); // Select register to read from..reg_val = SPI_RW(0); // ..then read registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value}/****************************************************************************************************//*功能:NRF24L01读写寄存器函数/****************************************************************************************************/uchar SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN low, init SPI transactionstatus = SPI_RW(reg); // select registerSPI_RW(value); // ..and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar}/****************************************************************************************************//*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/void SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uchar i;CSN = 0; // Set CSN low, init SPI tranactionSPI_RW(reg); // Select register to write to and read status ucharfor(i=0;i<uchars;i++)pBuf[i] = SPI_RW(0); // CSN = 1; }/*********************************************************************************************************/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*********************************************************************************************************/void SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uchar status,i;CSN = 0; //SPI使能 status = SPI_RW(reg); for(i=0; i<uchars;i++) //SPI_RW(*pBuf++);CSN = 1; //关闭SPI}

参考链接:https://blog.csdn.net/weixin_42876465/article/details/84675313
https://blog.csdn.net/u013816689/article/details/80000703

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。