nrf52832使用ble+2.4G(Gzll)遇到的问题

由于有nrf52832(从)与nrf24U01(主)通讯的需求,大概是这样,nrf24U01做为一个dongle接电脑,然后52这边与dongle通讯控制电脑。nrf52代码参考的是gzp_desktop_emulator这个demo,由于nrf24U01dongle的demo用的也是gzp_desktop,所以这个通讯非常简单,gzp初始化的时候把参数设为一样就能通讯了,通讯要求是3ms一个32byte的包不丢包,写好一个测试程序,配对成功,然后发现一直丢包...丢包率为50%,可以确定硬件是好的因为这是同事前几年出货的dongle而且我换了几个都这样..然后把发包速度改为了10ms一个32byte的包,发现还是丢包率50%,仔细看gzll的代码,我的配对通道用的是0,数据通道用的是1,然后在nrf24U01没看出啥,最后看了很久,在nrf52832这边一个gzp的头文件里看到 数据通道1是用于加密数据用的通道,也就是说如果有加密数据的需求才用通道1....改为用通道2,测试OK,3ms一个32byte的包不丢包。把gzp_desktop_emulator代码移植到我的工程里。

本以为大功告成,然后用keil下载程序的时候发现下不进,然后我把我加进工程的几个gzp的.c文件和一个叫gzll_nrf52_sd_resources_arm的.lib文件移除工程,发现又OK了,然后又把gzp的文件加进工程编译,然后打开编译好的hex文件,发现:工程的rom开始地址为0x26000,为啥编译好的hex文件是从0x1000开始,而且刚好就一个扇区的大小,一开始我怀疑是这个lib的原因,后来我把lib移出去了还是这个这样,然后我就在添加进的.c包含的几个头文件查看,然后在nrf_gzp_config.h看到了有可能的代码,然后改了之后如下:

#if SOFTDEVICE
#define GZP_PARAMS_STORAGE_ADR 0x00075000//这里是由我的52833和52832算出来的地址
#else
#define GZP_PARAMS_STORAGE_ADR 0x00001000
#endif
/**
  Number of bytes available for parameter storage in Device.
  It is equal to flash page size on nRF5x chips.
*/
#if defined (NRF51)
    #define GZP_DEVICE_PARAMS_STORAGE_SIZE 1024
#elif defined (NRF52_SERIES)
    #define GZP_DEVICE_PARAMS_STORAGE_SIZE 4096
#else
    #error Chip type is undefined!
#endif

因为我用了ota和fds,上面的0x00075000地址是我自己flash map算出来的地址,具体以相应的需求和芯片为主。

这个扇区主要来给gzll保存配对的信息用的,不得不说Nordic还真浪费,1个扇区4k的flash啊!可以写多少代码,bootsetting两个扇区,gzll一个扇区,fds也是最少要2个扇区我的天。

gzll跟ble不能共存,初始化gzll的时候假如打开了ble的协议栈需要再关掉,如果这时候还用了定时器还需要手动打开因为关协议栈的时候也把时钟关了,大概长这样:

 //现在需要使用gzll           
disable_softdevice();	//关闭蓝牙协议栈	我自己写的一个函数	
ngds_gzp_start();        //初始化gzp相关的各种参数
gzp_get_pairing_status();//是否有存在配对的数据
gzp_init();            //初始化gzp
GAZELLE_ERROR_CODE_CHECK(nrf_gzll_enable());//Enable Gazell.

还有如果需要一直双向通讯的时候,如果从机不发送包,主机这边主动发送会失败,所以可以在gzll的发生task那加一个如果没数据发送就每隔n ms发送空包,这样主机这边有数据的时候也可以主动发过来。

如果你遇到了跟我一样的问题就给我点个赞呗^ ^

发布了11 篇原创文章 · 获赞 0 · 访问量 102

猜你喜欢

转载自blog.csdn.net/weixin_39945910/article/details/104075076