×
RF射频 > RF技术 > 详情

蓝牙4.0模块如何编程

发布时间:2020-10-20 发布时间:
|

  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了。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
全面详解射频技术原理电路及设计电路