从硬件到软件玩转Nordic nRF52840 低功耗蓝牙
电路板设计
nRF52840在数据手册中给出了几种不同供电方案下的参考电路,其外围电路相对简单。对个人而言,开发过程中尽可能的降低成本,简化电路,在业余时间中完成快速开发。
考虑到元器件购买数量较小的情况下,其最小系统成本大约30元,然而nRF52840的封装需要开钢网,增加成本和焊接难度。因此,在某宝找了一个很便宜的模组,约30多一些吧,感觉挺划算的,其电路如图:
从商品描述中可以看到实物的尺寸和预留的引脚如下:
上述两张图为商品描述,暂不添加链接,避免广告嫌疑。如有侵权,请及时相告。
到此为止,主芯片已经搞定,接下来是芯片的供电方式,避免额外使用稳压器,直接从USB供电,同时,将芯片VDD作为输出电压,预留一些测试IO口即为原理图方案,绘制PCB如图:
将模组正下方开槽,露出模组底下焊盘,输出gerber文件。打板回来的板子如图所示,测试电源地是否短路,测试开槽孔的连接性是否完好,接下来完成焊接。
至此,焊接好的电路板如图所示:
确认好电路板焊接无误后接上USB线,测试nRF52840的电源输出正确。
开发环境准备
工具 | 名称 |
---|---|
开发环境 | Keil 523 |
Pack | nRF_DeviceFamilyPack.8.35.0.pack |
SDK | nRF5SDK160098a08e2.zip |
Jlink驱动 | V630 |
App | nRF Connect |
从点灯开始
打开nordic提供的例程,nRF5SDK160098a08e2\examples\peripheral\blinky\pca10056\blank\arm5_no_packs,发现找不到相应的pack,幸好发现网上有同样的问题,解决方法参考CSDN文章《nRF52840(一) 环境搭建》。在pca10056.h中修改例程中对应LED的引脚位置,编译工程。
该工程中不存在协议栈,直接下载程序,下载后装上LED灯,可以看到LED闪烁。
直奔串口蓝牙
打开nordic提供的例程,
nRF5SDK160098a08e2\examples\ble_peripheral\ble_app_uart\pca10056\s140\arm5_no_packs,先下载协议栈,然后下载应用程序,终于到了见证奇迹的时刻,打开nRF connect开始搜索附近的蓝牙,该例程中的蓝牙名称始终没有出现,从此开始了查找bug之路。
借助CSDN中的一些文章,总算拨开云雾见青天。现总结一下,在调试的过程中,主要是由于官网例程与硬件结合紧密,在初始化时会进行相关检查,程序容易出现APP_CHECK_ERROR,所以针对当前硬件电路板,去掉不相关的LED和BUTTON初始化,配置好串口,另外协议栈始采用外部晶振,需要设置为内部RC时钟。
再次打开搜索蓝牙设备,Nordic_UART出现了,终于看见了曙光。
做一些简单的测试,在手机端发送字符串如图:
在串口助手中可以接收到手机端发送的数据。
在这里感谢CSDN中一些介绍蓝牙串口的相关文章,才得以实现本DIY。
化繁为简
该蓝牙DIY要应用在实际中时,为避免冗余,将去除串口和按键功能,该项工作需要以下操作:
- 去除下列5个文件不做编译
nrf_drv_uart.c
nrfx_uart.c
nrfx_uarte.c
app_uart_fifo.c
retarget.c - 注释main.c中串口按键相关代码
nus_data_handler函数中串口发送代码
uart_event_handle函数定义
uart_init函数定义
main函数中uart_init和printf - 设置sdk_config.h中宏定义
将nRF_Libraries中串口相关宏定义置位0 - 设置boards.h中宏定义
设置BSP_INIT_BUTTONS为0
经上述修改,可以保留源代码中的4个LED指示灯,这里可以通过蓝牙发送控制命令点亮或者熄灭LED灯。
上图为即将完成的蓝牙控制跑马灯。
nRF52840驱动0.96寸OLED
在nRF52840蓝牙实现了LED灯的状态之后,可以说该DIY没有什么大的毛病,接下来就是根据兴趣实现一些想实现的东西。
闲暇之余,不经意间发现了之前用过的OLED显示屏,于是有一种点亮它的冲动。该OLED模块出厂默认配置为并行通信方式,考虑到该DIY模块预留的IO数量有限,接线困难,在这里通过修改电路板上BS1和BS2的为低电平,设置为SPI通信方式。
其实不管是SPI还是并行通信方式,字符和图片的显示代码是一致的,仅仅是底层驱动方式不一样。网上基于STM32和51单片机的代码很多,可参考CSDN文章《OLED驱动 0.96寸 模拟SPI驱动(STM32)》。
除了可以显示最近本的字符之外,还可以通过Img2LCD软件和取字模软件实现图片和汉字的显示,相关操作也很多。
上图为OLED显示效果,其中显示了年份、月份和二维码图片。个人通过手机蓝牙发送自己的姓名之后,在OLED上即可显示自己的毕业年份和简单的信息。