CH592同时使用蓝牙和射频的问题

我司现在做的一个产品是蓝牙和2.4G双模通讯的,用的是MCU+蓝牙芯片+XN297的组合,目前有降成本的压力,考虑升级换到CH592。我们这个产品的需求是蓝牙枚举为HID键盘,2.4G的Dongle也枚举为HID键盘,当有数据向PC上报时,如果蓝牙和2.4G都连接,则同时向蓝牙和2.4GDongle发送按键报文。

现在想确认CH592一颗芯片是否能完成以上同时发送的功能?这里指的同时发送可以接受是异步,比如RF先发,BLE再发,前后几百毫秒以内都是可以的


目前我收集到的信息有:

1、在这篇帖子“在CH579/CH573/CH583/CH32V208/CH32F208 上使用RF_PHY使用 https://www.cnblogs.com/iot-fan/p/14320405.html”

里面提到了RF可以和BLE同时使用a.JPG

  但是这个RF_PHY的历程比较简单,没有实现设备和Dongle绑定握手的环节


2、在这篇帖子里“ CH582/CH592_EVT中RF_Device(从机)例程详解_底层自动跳频管理_支持一对七通讯(两颗IC可互通)https://www.cnblogs.com/azou/p/18129426”

我下载测试了,确实两个CH592板子可以绑定并通讯


3、我想要的是在蓝牙实现的基础上也可以调用RF库进行绑定并通讯

所以 我测试了在一个BLE的工程中加入RF_device工程中的"libCH59xRF.a"库和配套的代码,发现编译不过,出现大量报错,主要是为RF库和BLE库中的很多函数命名系统,重复定义


4、应该如何做呢?

贵司是否可以提供一个兼具BLE和RF库的工程?

若上述工程不能提供,贵司是否可提供绑定流程如何实现的?我可以在Dongle上跑RF_host的工程然后在device上基于RF_PHY工程改一改,两个能对接上不?

您好,

第1点中博客所演示的程序均可以在CH592EVT包中获取,链接:CH592EVT.ZIP - k1体育 - 十年品牌 值得信赖 (wch.cn)

BLE文件夹中对应的BLE例程为HID_Keyboard,RF例程为RF_PHY(自己做跳频)/RF_PHY_HOP(跳频已做好),只需按照博客的说明将两个工程合并使用,并且自己做好状态切换管理(BLE和RF共用的一方,处理会稍复杂一些,但难度并不高),目前我们还没有遇到过一起使用的项目需求,因此暂时没有例程提供,只能您自己先做尝试。


第2点中的RF独立库的做法,不可以与BLE库存在于同一个工程中,也就是说BLE和RF同时只能跑一个,当初开发这个库的目的也是为了缩减RF通讯项目的开发周期,因此给出了一版比较简单且易于理解使用的demo,但受限于CH592的RAM容量只有26KB,合到一起的话,可用RAM会很少,所以没有合并在一起,不过最新芯片CH584/CH585已经合并到一起了。


我今天继续尝试了一下,我发现在RF_Device中调用RF独立库的API,其实存在于BLE库中,所以我尝试只使用BLE库进行了编译,可以编译通过

在main中进行了如下初始化

    PRINT("%s\n", VER_LIB);
    CH59x_BLEInit();
    HAL_Init();
    GAPRole_PeripheralInit();
    HidDev_Init();
    HidEmu_Init();
    RF_Init();
    Main_Circulation();

其中RF_Init直接复制于RF_Device

void RF_Init(void)
{
    rfTaskID = TMOS_ProcessEventRegister( RF_ProcessEvent );
    tmos_memset( gPBound_t, 0, sizeof(gPBound_t) );
    gPBound_t[BOUND_ID].rssiMax = -127;
    // 库初始化
    RF_LibInit( RF_ProcessCallBack );
    // 绑定信息初始化
    InitBoundInfo( );
#if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE)
    RF_SleepInit();
#else
    // 定时器初始化,用于演示定时发送数据,演示睡眠时不启用
    TMR0_TimerInit( (GetSysClock() / RF_TEST_PERIDOC)+1 );
    TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
    PFIC_EnableIRQ(TMR0_IRQn);
#endif

    PRINT("%s\n",VER_LIB);
    PRINT("rf mode----------- Device -----------\n");
    tmos_start_task(rfTaskID, RF_START_BOUND_EVENT,MS1_TO_SYSTEM_TIME(1));
//#if(defined RF_CALIBRATION_ENABLE) && (RF_CALIBRATION_ENABLE == TRUE)
//    tmos_start_task(rfTaskID, RF_REG_INIT_EVENT, 800); // 添加校准任务,单次校准耗时小于10ms
//#endif
}

1、由于校准在BLE工程中已经有执行,所以删除了RF中的校准任务

2、且在RF初始化过程中没有调用TMOS_Init相关,因为我猜测蓝牙在CH59x_BLEInit内部应该是调用过TMOS_Init了

3、为TMOS的工作栈增加了1K的空间 改为:#define
BLE_MEMHEAP_SIZE  (1024*7)

4、引出了在#include "CH59xBLE_LIB.h"中为定义的API,但实际上这些API在BLE库中存在,在头文件中声明加入了RF_Device的所有功能API,结构体声明和库中函数声明

如:

bStatus_t RFRole_LibInit( rfRoleConfig_t *pConf );

bStatus_t RFRole_Shut(void );

bStatus_t RFRole_SetParam( rfRoleParam_t *pConf );

bStatus_t RFBound_StartHost( rfBoundHost_t *pConfig );

bStatus_t RFBound_StartDevice( rfBoundDevice_t *pConfig );


移植以后,虽然RAM占用增多,但是并没有超过芯片容量,甚至还有3K的剩余空间(足够我这边的用户应用使用了)
Memory region         Used Size  Region Size  %age Used
           FLASH:      169440 B       448 KB     36.93%
             RAM:       23092 B        26 KB     86.73%
   text       data        bss        dec        hex    filename
 167964       1476      11684     181124      2c384    CH592_BLE_HID_RF.elf

所以我认为RAM空间应该不是什么大问题


但是现在搞完以后,并不能正常工作,应该是库内某些资源出现了冲突。

表现为蓝牙能广播但是连不上,RF和host不能绑定通讯。

由于库是闭源的,我没法继续追踪故障原因,工程上传附件了,贵司可以帮忙看看吗?

@TECH_ZZY

论坛上传好像有问题 传到网盘了

链接: https://pan.baidu.com/s/1nvvZjnvHSK-AhhPw86dozg?pwd=ithn 提取码: ithn


不行的,两个库文件就算函数名相同,实际功能是有区别的


我分别测试了 “RF例程为RF_PHY(自己做跳频)/RF_PHY_HOP(跳频已做好),只需按照博客的说明将两个工程合并使用”

发现和蓝牙整合在一起的情况下,不跳频的可以使用。但是跳频的不行,会报错CRC错误,串口输出调试结果如下。麻烦帮忙看下

1729056888104667.jpg

1729056888442092.png



自动跳频例程可能确实无法与BLE共存。

RF_PHY例程在可用的情况下也可自主实现跳频,

可在双方约定的条件下,至于双方如何约定,比如定一个数据包协议,在发送方发送指定跳频数据包给接收端,且在收到接收端的应答数据后,双方切换通讯频点,完成跳频,至于多长时间跳频一次,可自行管理,其他约定方式也可自行尝试。

跳频配置可按如下处理:

        uint8_t state;

        rfConfig_t rfConfig;

        tmos_memset(&rfConfig, 0, sizeof(rfConfig_t));

        rfConfig.Frequency = 2480000;//频点选择,当前参数2480000=2.480GHZ,参数范围:2402000~2480000

        state = RF_Config(&rfConfig);

通过state返回值查看是否设置成功。


学习了,最近也在关注这个


只有登录才能回复,可以选择微信账号登录