本帖最后由 lilijin1995 于 2023-1-11 17:54 编辑
今天要跟大家分享的是WCH的CH582作为Central连接其他厂芯片peripheral遇到的坑。踩完这个坑,感觉越来越喜欢CH582了。良心的蓝牙芯片,特别是对于我们这些搞电脑游戏外设的开发者来说,真乃国产良“芯”!!!
一、硬件环境:
1.Central:
用的是CH582作为central接收两个peripheral的报文,同时使用了它的USB host接收我们的usb hid设备报文,然后整合成一个usb dongle(实际上是一个(usb Gamepad)。582有蓝牙,又有两个usb(支持主从),竟是是强大如斯,赞赞赞
2.peripheral
这里我们有两个从机,都是用的FR8012HAQ ,这颗片子是我第一次接触的国产蓝牙,遇到了许多巨坑,其中的酸楚不便与人说。选择这颗片子的原因是它内置了PMU,电源管理模块,对于电池电量的检测是非常方便的,只需要把ADC参考源改一下,重新配置一下就可以,但是ADC只有一个,而且是10位的,这就不友好了。
二、软件设计
本人软硬件都会一点,但都不精。所以软硬件开发时候都很容易遇到bug。
这次遇到的bug是连接参数问题。
首先是我们测试主从经常掉线,两从连一主,其中,数最后一个连接上的主机最容易断开重连,打印日志如下图:
断开的原因是Disconnected...Reason:3b,是0x3B,马赛克的原因是我找不到那张bug图了
查阅蓝牙5.3规范中的错误码如下图
这里说是不可接受的参数,那这样应该是主从连接参数配置的问题。
下面我们来检查一下参数,首先是582做的central:
// Connection min interval in 1.25ms
#define DEFAULT_MIN_CONNECTION_INTERVAL 6
// Connection max interval in 1.25ms
#define DEFAULT_MAX_CONNECTION_INTERVAL 100
// Connection supervision timeout in 10ms
#define DEFAULT_CONNECTION_TIMEOUT 100
void Central_Init()
{
centralTaskId = TMOS_ProcessEventRegister(Central_ProcessEvent);
// Setup GAP
GAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);
GAP_SetParamValue(TGAP_CONN_EST_INT_MIN, DEFAULT_MIN_CONNECTION_INTERVAL);
GAP_SetParamValue(TGAP_CONN_EST_INT_MAX, DEFAULT_MAX_CONNECTION_INTERVAL);
GAP_SetParamValue(TGAP_CONN_EST_SUPERV_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);
}
计算参数,最小连接间隔6x1.25ms=7.5ms,最大连接间隔100x1.25ms=125ms, 连接超时时间100x10ms=1S.
接着我们再来看看从机的,
void param_timer_func(void *arg)
{
co_printf("param_timer_func\r\n");
gap_conn_param_update(0, 12, 12, 0, 500);
}
然后再看API文档
0.625us是什么鬼?有这么夸张吗,BLE达不到吧。后来跟FAE确认,
1.25ms才是真。
然后我把两从机的参数改成与Central的一致。最小连接间隔6x1.25ms=7.5ms,最大连接间隔100x1.25ms=125ms, 连接超时时间100x10ms=1S.
完美解决!!!
三、个人总结
因为公司是小微企业,所以需要掌握很多技能,项目的迭代非常快,基本上每个人手头都是至少3个项目并行进行的。导致了很难深入学习。
但是我们不用担心学不到东西,我们需要做的是,做好笔记,利用闲暇时间总结一下,比如多发帖子!
另外就是遇到bug不要慌,找原厂FAE,这里真的非常感谢WCH的FAE,技术支持力度真的很到位。
还有就是多去找找资料,比如Disconnected...Reason:3b这个错误码,其实在《Core_v5.3》,蓝牙的核心规范文档上面就有介绍,如下
图
|