跟猫一起酸汤面系列:第12天 nRF24L01库试用

中间没有第10天和第11天,因为一直没有什么进展,也不想随意糊弄
串口通了后调试起来就相对方便了,起码能够通过串口日志看到系统的工作状态
同时找到一个相对来说看起来比较清晰的nRF的HAL库
其中提供了一个测试函数uint8_t NRF24L01_Check(void)感觉配合串口输出很有用
起码能够初步判断SPI配置是否正确,接线和IO配置是否正确,得到一个是否能和模块说上话的结果
期间也出现过两次意外,一次是串口不知道什么原因默认7bit,大量乱码,
另一次就是SPI不知道什么原因默认4bit,结果Check一直通过不,
采完几个坑后让两个模块工作起来还是蛮方便的,检查完模块后,一个进入RX状态,一个进入TX状态,然后就可以调用接口收发了
实验环境是,L011接了一个模块负责循环发送,田鸡F042接一个模块和串口负责接收和输出
效果不错,下面就是读库的代码了解收发过程了,总代码量不足400行,配合猫的文档一起消化

检查24L01是否存在,这个很有用,说不上话一切免谈
uint8_t NRF24L01_Check(void);

初始化函数,似乎不需要,或许某些场合需要吧
void NRF24L01_Init(void);

很多地方会涉及一个设置SPI口速率,其实设一次就够了吧
static void SPI1_SetSpeed(uint8_t SPI_BaudRatePrescaler)
参数有八种从2分频到256分频,速率从快到慢,据说nRF24支持到10M速率
本质是操作SPI的CR寄存器的3-5位

配置为接收模式,CE拉低配参数,CE拉高等接收
void NRF24L01_RX_Mode(void);

配置为发送模式,CE拉低配参数,CE拉高等发送
void NRF24L01_TX_Mode(void);

写数据区,写若干数据到寄存器,先打开CS,写寄存器,写数据,关闭CS
uint8_t NRF24L01_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uint8_ts);

读数据区,写若干数据到寄存器,先打开CS,写寄存器,写0xFF就是读,关闭CS
uint8_t NRF24L01_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uint8_ts);

读寄存器,先打开CS,写寄存器,写0xFF就是读,关闭CS。猫说扯淡,这是个坑。
uint8_t NRF24L01_Read_Reg(uint8_t reg);

写寄存器,先打开CS,写寄存器,写数据,关闭CS
uint8_t NRF24L01_Write_Reg(uint8_t reg, uint8_t value);

发送一个包的数据,发射CE低然后写入32字节,CE拉高发射,读IRQ好像没用到,读取状态,清楚标志
uint8_t NRF24L01_TxPacket(uint8_t *txbuf);

接收一个包的数据,读取状态,清楚标志,如果有数据就接收32字节,然后清除
uint8_t NRF24L01_RxPacket(uint8_t *rxbuf);

进入低功耗状态,猫说一个寄存器的事儿
void NRF_LowPower_Mode(void);

经猫讲解,这确实是个坑,收发是通过第5位来体现的,不是那个0xFF
uint8_t SPIx_ReadWriteByte(SPI_HandleTypeDef* hspi,uint8_t byte)

参考文献:
https://blog.csdn.net/qq_36075612/article/details/103027490

标签: none

添加新评论