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