WCH CH582M蓝牙例程RF_PHY记录详解

文章目录

  • 前言
  • 一、RF_PHY
  • 二、使用步骤
  • 1.使用MounRiver Studio打开例程
  • 2.对例程进行简单修改并烧录
  • 3.通过串口查看数据发送
  • 4.通过WCH-BLE分析仪抓包
  • 总结

  • 前言

    最近在研究沁恒的CH58x系列蓝牙功能,作为一个小白记录一下自己的摸索过程。首先我使用的是CH582M型号两块,RF_PHY例程。
    本文简单介绍如何实现数据收发与使用WCH-BLE分析仪抓包。


    一、RF_PHY

    https://www.cnblogs.com/iot-fan/p/14320405.html
    RF_PHY 是wch提供的一个调用底层2.4g收发器的一个接口,可以通过此接口实现更为灵活的通信方式
    这种底层,仅仅是BLE的收发器基础上,这意味着,收发器调制解调参数,包括frequency,deviation,symbol_rate,以及packet_handler(preamble,syncword,length,crc,whitening)都是符合蓝牙的底层规范的.
    具体的工程可参考官方提供例程对应路径下的工程,如:CH582\EVT\EXAM\BLE\RF_PHY

    二、使用步骤

    1.使用MounRiver Studio打开例程

    MounRiver Sutdio的下载与使用本站有许多教程,此处不再赘述。
    给出MounRiver Studio与沁恒BLE例程下载链接:
    MounRiver Studio:http://www.mounriver.com
    沁恒CH85x BLE例程:https://www.wch.cn/downloads/CH583EVT_ZIP.html
    工程界面如下,主函数在APP文件夹
    工程主界面
    沁恒的蓝牙芯片例程已经将各个函数进行高度封装,不同主从机例程的主函数中,一般都只时一到两个的函数的区别,但是在这一到两个函数中,差别还是很大的

    //主函数
    int main(void)
    {
    #if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
        PWR_DCDCCfg(ENABLE);
    #endif
        SetSysClock(CLK_SOURCE_PLL_60MHz);
    #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
        GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
        GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    #endif
    #ifdef DEBUG
        GPIOA_SetBits(bTXD1);
        GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
        UART1_DefInit();
    #endif
        PRINT("start.\n");
        PRINT("%s\n", VER_LIB);
        CH58X_BLEInit();                        // 初始化蓝牙库
        HAL_Init();
        RF_RoleInit();                          // 配置此设备的角色为RF Role
        RF_Init();
        Main_Circulation();
    }
    

    2.对例程进行简单修改并烧录

    可以看到主函数内容并不多,我们主要关注HAL_Init() 与RF_Init()这两个函数
    其中HAL_Init()注册了HAL层任务,对硬件参数进行初始化,比如RTC的时钟,睡眠唤醒,RF校准等

    void HAL_Init()      // 注册HAL层任务,对硬件参数进行初始化,比如RTC的时钟,睡眠唤醒,RF校准等
    {
        halTaskID = TMOS_ProcessEventRegister(HAL_ProcessEvent);
        HAL_TimeInit();                                               // 系统定时器初始化
    #if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE)
        HAL_SleepInit();
    #endif
    #if(defined HAL_LED) && (HAL_LED == TRUE)
        HAL_LedInit();
    #endif
    #if(defined HAL_KEY) && (HAL_KEY == TRUE)
        HAL_KeyInit();
    #endif
    #if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE)
        tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD)); // 添加校准任务,单次校准耗时小于10ms
    #endif
        tmos_start_task( halTaskID, HAL_TEST_EVENT, 1600 );    // 添加一个测试任务
    }
    

    而RF_Init()主要就是RF初始化,收发功能的配置

    void RF_Init(void)
    {
        uint8_t    state;
        rfConfig_t rfConfig;
    
        tmos_memset(&rfConfig, 0, sizeof(rfConfig_t));
        taskID = TMOS_ProcessEventRegister(RF_ProcessEvent);                 // 注册RF任务,初始化RF功能,以及注册RF的回调函数
        rfConfig.accessAddress = 0x71764129;                                 // 禁止使用0x55555555以及0xAAAAAAAA ( 建议不超过24次位反转,且不超过连续的6个0或1 )
        rfConfig.CRCInit = 0x555555;
        rfConfig.Channel = 8;
        rfConfig.Frequency = 2480000;
        rfConfig.LLEMode = LLE_MODE_BASIC | LLE_MODE_EX_CHANNEL;             // 使能 LLE_MODE_EX_CHANNEL 表示 选择 rfConfig.Frequency 作为通信频点
        rfConfig.rfStatusCB = RF_2G4StatusCallBack;
        rfConfig.RxMaxlen = 251;
        state = RF_Config(&rfConfig);
        PRINT("rf 2.4g init: %x\n", state);
    //    { // RX mode
    //        state = RF_Rx(TX_DATA, 10, 0xFF, 0xFF);
    //        PRINT("RX mode.state = %x\n", state);
    //    }
    
            { // TX mode
                state = RF_Tx(TX_DATA, 10, 0xFF, 0xFF);
                PRINT("TX mode.state = %x\n", state);
            }
    
        	{ // TX mode
        		tmos_set_event( taskID , SBP_RF_PERIODIC_EVT );
        	}
    }
    

    注意对两个不同设备进行烧录时,TX mode与RX mode要分别屏蔽,记录为发送设备与接收设备
    本文使用WCHISPStudio进行烧录,烧录过程站内与沁恒官方也有非常详细的介绍,此处不再介绍
    WCHISPStudio工具下载地址:https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html

    3.通过串口查看数据发送

    此为接收设备的串口打印,可以看到例程已经成功跑起来了
    打印内容包括接收模式状态、RSSI、接收数据等
    接受设备串口打印

    4.通过WCH-BLE分析仪抓包

    本文使用沁恒官方出产的WCH-BLE分析仪进行抓包,需要额外购买。大概就长这样 也比较轻便

    上位机及配套材料下载地址:https://www.wch.cn/downloads/WCH_BLEAnalyzer_zip.html
    上位机打开后的界面如下:

    由于本文使用的是RF_PHY例程,不使用蓝牙协议栈。所以这里想要抓包还需要稍微设置一下
    1.点击坐上工具栏的小齿轮即硬件设置——>选择自定义2.4G模式
    2.自定义2.4G参数设置中Data Channel改为39
    3.AccessAddress与CRCInit就是前面RF_Init函数中设置的参数,填写进去(注意,格式中不要加0x)

    确定以后点击开始,就可以看到数据包了

    分享一个小坑
    在刚上手时忘记填写CRCInit,会出现满屏的以下情况

    在查关键字FEC ERROR时只有极少的资料,所以也没弄得很明白,下面放原文链接
    1.https://e2echina.ti.com/support/wireless-connectivity/bluetooth/f/bluetooth-forum/97644/fcs
    2.https://e2echina.ti.com/support/wireless-connectivity/bluetooth/f/bluetooth-forum/77982/packet-sniffer-fce-error

    总结

    还是颗小白菜 慢慢进步

    物联沃分享整理
    物联沃-IOTWORD物联网 » WCH CH582M蓝牙例程RF_PHY记录详解

    发表回复