蓝牙4.0模块如何编程

ble(低功耗蓝牙)技术是最近最热门的词汇之一,ble可以让电子设备很方便地和智能设备(手机)互联。为进一步简化低功耗蓝牙(ble)应用技术在各个行业产品中的移植和使用,中国ti无线领域战略合作伙伴信驰达科技特别推出了低功耗蓝牙模块,其中rf-bm-s01模块通过了蓝牙技术联盟bqb认证。特别地,在为苹果智能设备开发外设时,可以绕过mfi认证,就这个特点很值得看好此类模块的应用前景。对于安卓系统的智能设备,只要底层支持ble,同样可以使用模块进行设计你的个性化外设。而且ble技术相对wifi,bluetooth 2.0等无线技术,有着能耗低,连接迅速,通讯距离更远等优势。
rf-bm-s01蓝牙模块可以同时工作在桥接(透传)模式和直驱两种模式下。桥接模式下(串口),用户的可以通过串口将自己的电子设备和智能设备(需支持蓝牙4.0)之间建立双向通讯。而直驱模式下,用户可以直接使用模块扩展简单外围,就能快速设计出方案甚至产品,以最低成本最高效地推出特有的个性化移动设备新外设。借此模块,甚至可以进一步通过智能设备的上网功能,直接建立设备和服务器,云应用等更高级的的通讯网络,对其设备实现智能化控制和管理。
从上图可以看出,在桥接模式下(透传模式),模块通过串口和客户的mcu相连,其中包括tx,rx,en,brts,bcts五条信号线,其中en是总使能开关,当抬高后,模块将会进入彻底睡眠状态(《0.4ua),当en置低后,模块会进入广播态,此时可以开启app对模块进行搜索和连接,连接成功之后,mcu和手机便可以进行全双工通讯。另外两条brts和bcts是用来唤醒对方的信号线,在要求低功耗的应用中,双方可以通过这两根线来唤醒对方,开始接收数据。
在直驱模式下,用户可以直接通过智能设备对模块进行指令控制。模块提供了丰富的接口,包括蓝牙广播指示,连接指示,6路双向可编程io,四路可编程pwm,两路14bit adc采集接口,用户可以通过服务中的通道对这些资源进行编程控制,十分方便。只设计简单的外围扩展电路,就能构成最小ble控制系统,而直接省下mcu的成本开销。
除此之外,用户甚至可以同时使用两种工作模式,当用户的mcu不够强大时,可以通过模块的外扩接口来弥补mcu的不足,分担部分驱动工作。
此模块的强大不仅仅在于两种模式的应用,更是提供了诸多附加功能,其中包括丰富的at指令,以及自定义或标准蓝牙服务,为应用提供了更可靠,更先进的智能控制。
如模块的at指令包括: 连接间隔调整
模块重命名
波特率调整
获取物理地址mac 16
模块复位
模块的服务(部分自定义)包括:
蓝牙数据通道【服务uuid:0xffe5】
串口数据通道【服务uuid:0xffe0】
pwm输出(4路) 【服务uuid:0xffb0】
adc输入(2路) 【服务uuid:0xffd0】
可编程io (8路) 【服务uuid:0xfff0】
定时翻转输出 (2路) 【服务uuid:0xfff0】
防劫持密钥【服务uuid:0xffc0】
电池电量报告【服务uuid:0x180f】
rssi报告【服务uuid:0xffa0】
模块参数设置【服务uuid:0xff90】
设备信息【服务uuid:0x180a】
此外,模块还提供了快速测试模式,可以在无硬件连接的情况下,单独测试蓝牙以及串口通讯。
常见的蓝牙4.0模块 1、ti公司的cc2540/cc2640;
2、nordic的蓝牙4.0(ble)芯片nrf51822;
3、汇承公司的hc-05蓝牙转串口模块:主芯片csr bluecore5 mm。
一般程序的编写 可参考的例程如下:
建议学习例程步骤(纯单片机控制):
1. io控制学习-à2.系统时钟-à3.按键中断-à4.定时器-à5.串口-à6.ppi模块-à7.iic(twi)
主要参考例程:(官方的)
blinky_example
ppi_example
timer_example
uart_example
twi_sw_master_example
temperature_example(以后看,关于温度传感器)
主要学习思路:
看例程
看芯片手册(nrf51_series_reference_manual_v2.1.pdf)两个方面:方框图(吐槽一句方框图没ti的好),寄存器说明
举个栗子:
温度传感器temperature_example
首先可以打开例程和芯片手册,可以看到有以下寄存器
在nrf51822体系里,寄存器分三种,tasks,events,registers。task是执行任务的,events是报告各种状态,类似触发中断。
temp寄存器是储存收集到数值 nrf_temp_init();
while(1)
{
nrf_temp-》tasks_start= 1;
while (nrf_temp-》events_datardy== 0) { }
nrf_temp-》events_datardy= 0;
temp =(nrf_temp_read()/4);
temp=temp*0.6904-0.74;
nrf_temp-》tasks_stop = 1; /** stop the temperature measurement.
nrf_delay_ms(500);
}
}
}
temp=temp*0.6904-0.74;这个是由于按照官方的直接得到的误差太大了,根据实际测得温度值(万用表)和temp = (nrf_temp_read()/4);直接得出的temp用 excel求趋势线得出的。
下面简单说下一些其他模块的细节: 1. uart:nrf51822默认配置的uart引脚是有四个,rxd;txd;cts;rts.在simple_uart.c里提供调用方法。另外这些引脚都是可以自己设置的,有没有类似fpga,是不是很方便!!
2. gpiote:这个功能是通过io的event来触发tasks的。
tasks有三种状态:set,clear,toggle。
event也有三种risingedge;falling edge;any change
主要寄存器有:tasks:out[0] ,out[1],out[2] ,out[3]
event:in[0],in[1],in[2],in[3]
主要结合ppi功能
定时器:
主要寄存器
通过exanple: timer_example
里面需要注意的问题: 频率 (rtc不同)
一般设置步骤:设置时钟—》设置mode(timer还是counter)-》然后设置分频—》设置bitmode(需要注意的是总共有三个定时器,timer0是32bit,timer1,2是16bit)—》清定时器。
当设置的定时次数溢出了,将从溢出后重新开始计数。就比如例程中bit16位,最多定时2097,当
#define timer_delay_ms3 (3000ul) /**《 timer delay in milli-second*/时只会定时903.
c#进行蓝牙编程 用源码的形式给大家介绍如何用c#调用蓝牙。下面的源码是基于destop的c#调用蓝牙的程序,也就是使用普通版本的.net framework来调用编程,一般是有蓝牙的笔记本电脑,或者使用外接蓝牙设备的电脑,如何使用外接蓝牙设备,请参考代码:
using system;
sing system.collections.generic;
sing system.windows.forms;
sing inthehand.net;
sing inthehand.net.bluetooth;
sing inthehand.net.sockets;
amespace bluetooth
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
bluetoothclient blueclient = new bluetoothclient();
dictionary《string, bluetoothaddress》 deviceaddresses = new dictionary《string, bluetoothaddress》();
private void btnfind_click(object sender, eventargs e)
{
this.lblmessage.text = “”;
this.lblmessage.visible = true;
bluetoothradio buleradio = bluetoothradio.primaryradio;
buleradio.mode = radiomode.connectable;
bluetoothdeviceinfo[] devices = blueclient.discoverdevices();
lsbdevices.items.clear();
deviceaddresses.clear();
foreach (bluetoothdeviceinfo device in devices)
{
lsbdevices.items.add(device.devicename);
deviceaddresses[device.devicename] = device.deviceaddress;
}
this.lblmessage.text = “搜索设备完成,搜索到” + lsbdevices.items.count + “个蓝牙设备。”;
}
private void btnconnect_click(object sender, eventargs e)
{
try
{
bluetoothaddress deviceaddress = deviceaddresses[lsbdevices.selecteditem.tostring()];
blueclient.setpin(deviceaddress, txtpwd.text.trim());
blueclient.connect(deviceaddress, bluetoothservice.handsfree);
messagebox.show(“配对成功。”);
}
catch (exception ex)
{
messagebox.show(ex.message);
}
}
}
上图是点击finddevices按钮后的结果。我们选择其中的一个设备,然后在password的textbox中输入配对密码,点击connect,如果成功会弹出对话框提示“配对成功”,如果失败会出现如下提示:
note:你只要想在visual studio中建立一个winform的默认程序,并把代码复制过去,然后引用inthehand.net.personal.dll你的程序就可以直接运行了。不过我不建议你直接复制,最好是敲一边代码比较好。
上面的示例代码中还需要特殊注意的就是下面这三个命名空间: using inthehand.net;
using inthehand.net.bluetooth;
using inthehand.net.sockets;
他们是哪来的呢?在上面的程序中我引用了一个外部的dll:inthehand.net.personal.dll,上面那三个命名空间就是inthehand.net.personal.dll中的。我使用的是桌面版的.net framework3.5,如果你想在移动设备,如手机或者手持机等移动设备而上使用,那么你只需要创建一个.net compact framework 3.5的程序,把上面的源码直接复制过去,并且引用inthehand.net.personal.dll的移动版本就ok了。

中国手机市场排名大洗牌 苹果仍然稳居榜首
1-5月风电工程投资达623亿元,未来风电装机容量将迎来新增长
红外遥控电路中陶瓷谐振电路图
51单片机的引脚
门禁控制器原理图_门禁系统组成模块电路分析
蓝牙4.0模块如何编程
Avago展示QSFP+ AOC与收发器解决方案
国产品牌16TB SSD杀来!1899元?
微软15英寸Surface Laptop 3曝光,将搭载i5处理器
两款低压DC/DC升压转换器应用电路
国内叫停比特币,宣布进行平台转型
高低温试验箱出现冷媒泄露怎么办?
过零触发光耦的选型及其实例分析(微波炉控制器)
谷景教你如何解决大功率共模电感引脚太长的问题
工业以太网技术优势
三星国行Galaxy S21将标配充电器
媲美x86/Arm/RISC-V!龙芯CPU自主龙架构再进一步
监听音箱和普通音箱有什么区别
母线弧光保护装置在电网的应用
涂鸦智能重磅推出TuyaOS神器!变革性创新降低物联网开发门槛