Lotlab / nrf51822-keyboard

a simple G84-4100 ble keyboard with nrf51822. For nrf52, see nrf52-keyboard.
Other
102 stars 50 forks source link

连上电脑后出现驱动故障 #5

Closed genokolar closed 5 years ago

genokolar commented 5 years ago

最小系统按照源码编译完成后,蓝牙连接电脑成功,但是最终显示驱动故障(蓝牙低功耗HID设备未启动);连接手机的话可以配对,但是无法正常连接成功。

main.c中 https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/main/ble/main.c#L363 改回xtal,故障依旧。

Keil中设置xtal频率为12,16也均不行。

求解。

jim-kirisame commented 5 years ago

这个实在是不清楚了,我觉得可能和连接管理的功能有关系?

genokolar commented 5 years ago

这个方案有同样问题,我系统是win10,我再测试下win7系统啥的 https://github.com/sandeepmistry/arduino-BLEPeripheral/issues/160

另外lot60-ble还存在什么已知问题吗?

genokolar commented 5 years ago

Linux下的表现是:不停连接然后断开

genokolar commented 5 years ago

已经解决。 1、为什么出问题: 本身源码没有问题,只是因为我是最小系统,所以按照JIM提示修改此处: https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/main/ble/ble_services.c#L77 将蓝牙连接声明为不要输入PIN码的无输入方式的设备 : #define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE 实现连接设备不需要输入pin码

2、问题出现了:HID设备无法正确启动 上述源码修改后,对应的此处: https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/main/ble/ble_hid_service.c#L182 没有更改为不需要MITM,就会导致HID设备无法正确初始化启动。

3、怎么解决的: 从我上面反映的情况看,andriod手机和linux系统都没法查为什么出错,但是windows给出了具体的问题:显示驱动故障(蓝牙低功耗HID设备未启动)。那么猜测大致应该是HID初始化出错。那么回找到HID初始化代码: https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/main/ble/ble_hid_service.c#L162

通过比对SDK例程,分析和查看JIM的源码修改提交记录,发现原本是没有启用MITM中间人攻击(man-in-the-middle)的,我怀疑因为没有采用PIN码进行连接,所以无法启用MITM,故而导致HID初始化出错。

所以我恢复源码到不启用MITM:修改这个函数下所有 BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITMBLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM

这些属性定义可以参考这个头文件 https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/sdk/ble_gap.h#L349

最终测试通过,问题解决

jim-kirisame commented 5 years ago

感谢填坑~

蓝牙这部分我也不是很熟悉,所以有可能误导了你,不好意思了

jim-kirisame commented 5 years ago

至于lot60-ble存在的问题嘛,应该是只有一个已知的问题:CH554的时钟速率导致其串口速率并不是标准的115200,使其在和蓝牙部分通信的时候会有偶发性的丢包。这个问题可能需要在通信协议上继续下功夫改进,或者是将串口通信更换为其他通信方式。

genokolar commented 5 years ago

至于lot60-ble存在的问题嘛,应该是只有一个已知的问题:CH554的时钟速率导致其串口速率并不是标准的115200,使其在和蓝牙部分通信的时候会有偶发性的丢包。这个问题可能需要在通信协议上继续下功夫改进,或者是将串口通信更换为其他通信方式。

意思是NRF51822和CH554通过串口通讯有丢包现象,那么就是说用USB连接电脑的是否反而会出现偶发按键后无响应是吧?

然后CH554可以采用外接晶振啊,内部好像是24MHZ?看你源码,采用了12Mhz

CH554能改成仅缺一个USB HOST功能的CH552吗?(从你源码看,并未启用host功能)

本人完全萌新,JIM大神多批评指正。

jim-kirisame commented 5 years ago

CH554能改成仅缺一个USB HOST功能的CH552吗?

可以,我就是用的CH552代替的。

可以采用外接晶振啊

USB部分好像是要有一个固定频率的样子,用其他频率的晶振可能会有问题?这点并不是很清楚。

genokolar commented 5 years ago

CH554的时钟速率导致其串口速率并不是标准的115200,使其在和蓝牙部分通信的时候会有偶发性的丢包

可不可以通过修改此处设置的时钟频率Fsys、定时计时器参数,获得标准的115200的波特率呢?看了CH544T的技术手册,对这部分懵懵懂懂的。当前CH554的串口波特率是多少呢? https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/usb/system.c#L25

还有这两个地方感觉设定不一致: https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/usb/uart.c#L56

https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/usb/system.c#L46

https://github.com/Lotlab/nrf51822-keyboard/blob/9ccda83f3b5e3f801f2263920ba39658091f481b/usb/system.c#L6

jim-kirisame commented 5 years ago

UART0的波特率是38400,UART1的是57600