完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先说下个人对这个模块的调试心得(ACK模式):
五种工作模式:
指令:
主函数: int main(void) { LED_CONFIG(); KEY_CONFIG(); GPIO_CONFIG(); Usart_Config(); CHECK_DEVICE(); CHECK_DEVICE_RX(); NRF24_RX_MODE(); delay_ms(10); while(1) { uint8_t buf[32] = {0}; uint8_t a,rxx[32]; if(KEY1()) { buf[0] = 0x88; NRF24_TX_MODE(); LED_G(ON); delay_ms(30); LED_G(OFF); TXPACKET(buf); delay_ms(30); } buf[0] = 0; delay_ms(10); if(KEY2()) { RXPACKET(rxx); } } } 主要发射代码: uint8_t DATAWIDTH=32; uint8_t TX_ADDRESS[5]={0X3E,0x7E,0x7E,0x7E,0x7E}; //发送模式配置,ACK void NRF24_TX_MODE(void) { CE_L; SPI_WRITE_DATA(W_REGISTER+TX_ADDR,TX_ADDRESS,5);//写入发送地址,5字节 SPI_WRITE_DATA(W_REGISTER+RX_ADDR_P0,TX_ADDRESS,5);//写入接收通道0地址,5字节 SPI_RW_REG(W_REGISTER+FLUSH_TX,0xFF);//清空TX_FIFO SPI_RW_REG(W_REGISTER+EN_AA,0X01);//使能自动确认 SPI_RW_REG(W_REGISTER+EN_RXADDR,0X01);//使能接收通道0 SPI_RW_REG(W_REGISTER+SETUP_RETR,0X25);//750us自动重发延时,自动重发5次 SPI_RW_REG(W_REGISTER+RF_CH,40);//射频通道40 SPI_RW_REG(W_REGISTER+RF_SETUP,0X0F);//速率2Mbps,功率7dBm SPI_RW_REG(W_REGISTER+CONFIG,0X0E);//发送模式,2 Byte CRC CE_H; delay_ms(1); } //发送数据包 uint8_t TXPACKET(uint8_t *tx) { uint8_t status; SPI_RW_REG(FLUSH_TX,DUMMY); CE_L; SPI_WRITE_DATA(W_TX_PAYLOAD,tx,DATAWIDTH); CE_H; while(IRQ_TX); status=SPI_R_REG(STATUS); SPI_RW_REG(W_REGISTER+STATUS,status);//清除标志位 printf("status=0x%xn",status); if(status&0x10) { SPI_RW_REG(W_REGISTER+FLUSH_TX,0xFF); printf("数据发送失败,达到最大发送次数!n"); return 0; } if(status&0x20) { SPI_RW_REG(W_REGISTER+FLUSH_TX,0xFF); printf("数据发送完成!n"); return 1; } } 主要接收射代码: extern uint8_t DATAWIDTH; extern uint8_t TX_ADDRESS[5]; //发送模式配置,ACK void NRF24_RX_MODE(void) { CE_L; SPI_WRITE_DATA(W_REGISTER+RX_ADDR_P0,TX_ADDRESS,5);//写入接收通道0地址,5字节 SPI_RW_REG(W_REGISTER+FLUSH_RX,0xFF);//清空RX_FIFO SPI_RW_REG(W_REGISTER+EN_AA,0X01);//使能自动确认 SPI_RW_REG(W_REGISTER+EN_RXADDR,0X01);//使能接收通道0 SPI_RW_REG(W_REGISTER+RF_CH,40);//射频通道40 SPI_RW_REG(W_REGISTER+RX_PW_P0,DATAWIDTH);//设置接收通道0,与发送字节相同 SPI_RW_REG(W_REGISTER+RF_SETUP,0X0F);//速率2Mbps,功率7dBm SPI_RW_REG(W_REGISTER+CONFIG,0X0F);//接收送模式,2 Byte CRC CE_H; } //接收数据 uint8_t RXPACKET(uint8_t *rx) { uint8_t status,rdata[32]; while(IRQ_RX); status=SPI_R_REG(STATUS); SPI_RW_REG(W_REGISTER+STATUS,status);//清除标志位 printf("status=0x%xn",status); if(status&0x40) { SPI_READ_DATA(R_RX_PAYLOAD,rdata,32); SPI_RW_REG(W_REGISTER+FLUSH_RX,0xFF); printf("接收的数据为:0x%xn",rdata[0]); return 1; } else printf("数据接收失败!n"); return 0; } SPI参考代码: 发射接收模块共用MISO,MOSI,SCK,CE,IQR脚,CS不同管脚。默认上电SCK,CE为低,CS为高。 /*NRF24LO1指令定义*/ #define R_REGISTER 0x00 #define W_REGISTER 0x02 #define DUMMY 0x00 #define RX_PAYLOAD 0X61 #define TX_PAYLOAD 0XA0 #define FLUSH_TX 0XE1 #define FLUSH_RX 0XE2 #define RX_WID 0X60 #define NOP 0XFF #define CONFIG 0X00 #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 RX_ADDR_P0 0X0A #define RX_PW_P0 0X11 #define TX_ADDR 0X10 #define FIFO_STATUS 0X17 #define DYNPD 0X1C #define FEATURE 0X1D //读写字节 static uint8_t SPI_RW_BYTE(uint8_t wdata)//MSB { uint8_t i; uint8_t rdata; //发送数据 for(i=0;i<8;i++) { SCK_L; delay_us(5); ((wdata< delay_us(5); //接收数据 rdata<<=1; SCK_TX; rdata|=MISO; delay_us(5); SCK_L; } return rdata; } //指令读写 static uint8_t SPI_RW_REG(uint16_t cmd,uint16_t val) { uint8_t status; CS_L; status=SPI_RW_BYTE(cmd); SPI_RW_BYTE(val); CS_H; return status; } //读寄存器 static uint8_t SPI_R_REG(uint16_t reg) { uint8_t status; CS_L; SPI_RW_BYTE(reg); status=SPI_RW_BYTE(DUMMY); CS_H; return status; } //写数据 static uint8_t SPI_WRITE_DATA(uint8_t cmd,uint8_t *wdata,uint8_t wnum) { uint8_t status; CS_L; status=SPI_RW_BYTE(cmd); while(wnum) { SPI_RW_BYTE(*wdata++); //wdata++; wnum--; } CS_H; return status; } //读数据 static uint8_t SPI_READ_DATA_RX(uint16_t cmd,uint8_t *rdat,uint8_t wnum) { uint8_t status; CS_L; status=SPI_RW_BYTE(cmd); while(wnum) { *rdat=SPI_RW_BYTE(DUMMY); rdat++; wnum--; } CS_H; return status; } 测试结果: 分别按下KEY1,KEY2。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
566浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 07:54 , Processed in 0.839958 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号