[技术讨论] 在很多单片机调试通过的 NRF24L01库

[复制链接]
1602|6
 楼主| Ketose 发表于 2017-3-5 09:05 | 显示全部楼层 |阅读模式
最近看论坛,有些人调试这个,很多的时候都不成功。所以共享一个自己使用的在很多MCU上调试通过的NRF24L01库。这个库是从mbed上移植过来的,相当的稳定。而且对于开发者来说使用起来也很简单。
先看下这个库的目录结构:
NRF240L01_LIB
│  
├─Driver
│      NRF24L01P.c
│      NRF24L01P.h
│      
└─Hal
    │  i2c_api.h
    │  
    └─Target
        └─GD32F105R
                gd32f1x0_i2c_api.c
其中Drvier是nRF24L01P是基于HAL下的i2c_api.h实现的驱动,这个我们是不用管。我们需要做的就是实现特定平台下i2c_api.h定义的函数。例如上面代码实现了GD32F105系统MCU的i2c_api接口。那么i2c_api.h有些什么东西呢,其实也很简单,只需要实现5个函数,看代码就知道了:
  1. /**
  2. ****************************************************************************************
  3. *
  4. * [url=home.php?mod=space&uid=1455510]@file[/url] i2c_api.h
  5. *
  6. * [url=home.php?mod=space&uid=247401]@brief[/url] Header file of i2c hardware abstract layer api.
  7. *
  8. * Copyright (C) sunsjw 2012-2020
  9. *
  10. * $Rev: 5444 $
  11. *
  12. ****************************************************************************************
  13. */
  14. #ifndef _I2C_API_H
  15. #define _I2C_API_H

  16. #include <stdint.h>

  17. //**************************************
  18. //向I2C设备写入一个字节数据
  19. //**************************************
  20. void i2c_init(void);
  21. //**************************************
  22. //向I2C设备写入一个字节数据
  23. //**************************************
  24. void i2c_WriteByte(uint8_t SlaveAddr,uint8_t REG_Address,uint8_t REG_data);
  25. //**************************************
  26. //从I2C设备读取一个字节数据
  27. //**************************************
  28. uint8_t i2c_ReadByte(uint8_t SlaveAddr,uint8_t REG_Address);
  29. //**************************************
  30. //从I2C设备读取指定长度字节数据
  31. //**************************************
  32. int i2c_ReadBytes(int dev_address,int reg_address,char* buffer,int length);
  33. //**************************************
  34. //向I2C设备写入多字节数据
  35. //**************************************
  36. int i2c_WriteBytes(int dev_address,int reg_address,char* buffer,int length);

  37. #endif
就是I2C的初始化,读写操作。每个MCU不尽相同,大家去实现自己所用MCU的就可以了。
主程序调用就更简单了,首先声名一个全局的nRF24L01的实例 extern NRF_Class_cb_TypeDef nrf_obj;然后在main函数里调用初始化,上电,设置等一些函数,就可以了。还是发代码给大家看比较清楚:
  1. extern NRF_Class_cb_TypeDef nrf_obj;
  2. char txbuf[20];

  3. int main()
  4. {

  5.         nrf_obj.initialize();
  6.         
  7.         nrf_obj.powerUp();
  8.         //
  9.         nrf_obj.setAirDataRate(NRF24L01P_DATARATE_2_MBPS);
  10.         //设置传输大小
  11.         nrf_obj.setTransferSize(sizeof(txbuf),NRF24L01P_PIPE_P0);
  12.         //设置为发送模式 如果是接收则调用 nrf_obj.setReceiveMode
  13.         nrf_obj.setTransmitMode();
  14.         nrf_obj.enable();
  15.         
  16.         while(1)
  17.         {
  18.                 result = nrf_obj.write(NRF24L01P_PIPE_P0,(char*)&txbuf,sizeof(txbuf));
  19.                 if( result == -1)
  20.                 {
  21.                         wait_us(100);
  22.                 }

  23.         }
  24. }
OK,搞定,希望对大家有用。如有疑问可以跟贴。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +5 收起 理由
lfjwfm + 5 很给力!

查看全部评分

dirtwillfly 发表于 2017-3-5 09:13 | 显示全部楼层
感谢分享
zhujunjiejuan 发表于 2017-3-5 10:18 | 显示全部楼层
好东西,谢谢楼主。
z00 发表于 2017-3-6 19:30 | 显示全部楼层

好东西,谢谢楼主。
高勇 发表于 2017-3-7 09:30 | 显示全部楼层
太有想法了。
512528536 发表于 2017-9-12 17:53 | 显示全部楼层
这个不是SPI的吗
changle11sdo5 发表于 2017-9-13 15:09 来自手机 | 显示全部楼层
NRF24L01有一个bug
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我最讨厌两种人:一是有种族歧视的; 二是黑人;三是不识数的!

67

主题

3271

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部