前言
最近在研究沁恒的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
总结
还是颗小白菜 慢慢进步