BLE UART GPIO波特率不对或无输出现象调试记录

说起来,购买nRF51822相关的开发板或模块也不少了。但是却总是有各种问题。要么Nordic芯片改版,无法使用新版SDK。要么Nordic模块缺乏适配和验证。

前一阶段,我使用STLINK/V2替代了JLINK,解决了在Windows/Linux中下载softdevice/应用,也解决了MDK5中下载调试的需求。但是,无论是Baremetal/BLE应用中UART中出现一个问题:对应的GPIO输出的字符串波特率不正确。目前已经排除了晶体、固件问题,需要排除GPIO TX/RX引脚,为此,我额外购买了其他的模块,作为交叉对比。此外我观察了官方nRF51/nRF52的引脚定义,发现其GPIO也没有保持脚对脚兼容。

nrf51-dk_v1.2.0_top_pin_information_with_logo.png

Fig 1: nRF51-DK

nrf52_dk_pinout_armmbed_enabled_v2.png

Fig 2: nRF52-DK

希望能够BLE开发后,能够顺利适配到玩具,LoRa/Sub-1GHz,EPD,NFC/RFID设备中。

UPDATE

难道是中元节的关系么?新买来的模块居然P0.10/P0.11是短路的!这意味着RXD/CTS是短路的。这样就无法使用官方固件来验证了。

把固件下载后,发现其输出依然是乱码。和之前的模块几乎是一摸一样。唯有插拔瞬间会出现一些打印信息,但是这不是我需要的字符串。这说明乱码和模块硬件无关。

问题初步解决

中元节过后的早晨,问题得到了解决。原因有几点:

  1. 新买来的nRF51822与转换板是不一致的,由于nRF52832与nRF51822引脚不一致,所以开发者没有做到脚对脚兼容,仅仅是供电和SWD引脚兼容,所以原以为的P0.10/P0.11脚没有短路,而是P0.05/P0.06短路,但是官方UART例程可以运行了。
  2. 官方baremetal的UART之所以没有输出,是因为HWFC宏定义根本没有使用,必须在源码中使用另外一个枚举宏来关闭。
  3. 可能TXD/RXD接反了。

现在baremetal UART/BLE UART均可以在新PCB上成功运行,同时通过使能CCCD实现nRF到Android的消息通知推送。

问题溯源

有鉴于固件都已经得到确认。所以在旧版nRF模块和转换板上一定存在硬件问题。通过交叉对比试验。首先,LED不亮的问题原因在于虚焊,而且是两处虚焊:

  1. LED连接Pin header处虚焊,导致测量时会出现1.8V左右电压,这个实际上是3.3V通过LED压降之后的浮动电压,并没有形成回路,所以不亮;
  2. P0.16从nRF模块到Pin header处也有虚焊,导致Pad上电压切换无法连接到P0.16;

但是,UART输出波特率问题,依然是个麻烦。使用baremetal blinky固件确认丝网和引脚定义没有错误,localloop是运行的,但就是波特率不对,检查了波特率寄存器值,与参考手册一致。更换了引脚和波特率设置,结果一样。所以,现在可以推断,串口硬件有问题,需要使用示波器和逻辑分析仪来查看

逻辑分析仪

以逻辑分析仪来看,发现nRF的TXD上没有正常UART通讯字符串,而只有一些简单的负脉冲,脉宽在100ns以内。

BLE UART GPIO波特率不对或无输出现象调试记录_第1张图片
P8_RXD_P12_TXD.png

你可能感兴趣的:(BLE UART GPIO波特率不对或无输出现象调试记录)