硬件介绍
user guide 官方(https://www.silabs.com/support/getting-started/thunderboard/thunderboard-bg22)
主芯片
- 型号:EFR32BG22C224F512IM40
- RAM: 32kB 0x20000000 ~ 0x20008000
- FLASH: 512kB 0x00000000 ~ 0x00080000
- 32bit ARM cortex-M33内核 ,最高76.8 MHz
- 2个I2C
- 2个USART
- EUART
- ADC
- TrustZone 技术
芯片参考手册:
芯片BG22系列datasheet: [EFR32BG22 Wireless Gecko SoC Family Data Sheet ](https://www.silabs.com/documents/public/data-sheets/efr32bg22-datasheet.pdf)
芯片BG22系列参考手册:[efr32xg22-reference Manual](https://www.silabs.com/documents/public/reference-manuals/efr32xg22-rm.pdf)
这块板子上的芯片:
GPIO 有26个, QFN40封装
PA00~PA08 9个
PB00~PB04 5个
PC00~PC07 8个
PD00~PD03 4个
一共有这26个GPIO脚
开发板情况
这个开发板虽然小,但是负载的传感器有很多,该开发板型号是4184A-A01 开发板原理图:[Schematic for BRD4184A-A01](https://www.silabs.com/documents/public/schematic-files/BRD4184A-A01-schematic.pdf)
官方开发板USER GUIDE[UG415: Thunderboard EFR32BG22 User's Guide](https://www.silabs.com/documents/public/user-guides/ug415-sltb010a-user-guide.pdf)
板载晶振是38.4MHz,低功耗晶振32.768(接PD0 PD1)
GPIO(LED, BUTTON)
LED有一个,接PB0, GPIO脚拉高是点亮,拉低是灭
- BUTTON 有一个,接PB1,button按下GPIO脚是低电平,button未按是高电平
外部FLASH
板载一颗外部SPI flash, 大小是8Mbit,(1MKB FLASH),接的引脚是PC00~PC03
霍尔开关传感器Si7210
霍尔开关传感器接口使用的是I2C,13bit模数转换器。传感器由GPIO开关PA04来控制电源,PD02 PD03是I2C接口
这边I2C还接了Si7021 相对温湿度传感器,Si1133 UV 光敏传感器
6轴传感器
六轴用的是ICM-20648用的是SPI接口和SPI FLASH在同一个总线上,不同是CS脚不一样也用了一个开关
MIC phone
麦克风有两个分别是左右声道,使用的是I2C接口
PC6 - I2C_CLK
PC7- I2C_DATA
调试系统
板载J-LINK,非常mini的调试口,板子上反面最大的一颗IC就是DEBUG IC, 型号是:EFM32GG12B410F1024GL120-A
这颗IC也外置了一颗SPIflash和主芯片一样MX25R,非常小的一颗IC.
PA3-SWO
PA2-SWDIO
PA1-SWCLK
PA5-UART_RX
PA6-UART_TX
也可以跳过调试器直接调试板子:
两侧connect引脚
IIC的引脚和SPI引脚已经引出来了
GPIO引脚选择
那silicon的引脚如何选择对应的功能呢?
我们依靠两张表格
第一张表格这张表格代表GPIO脚复用的不可控的情况比如PA02 PA01只能用SWCLK和SWDIO debug调试接口
这张图也就是说ADC所有脚都可以用
剩下的就参考下面这张图
这张图大概意思就是比如I2C0.SCL I2C0.SDA 两个脚PA PB PC PD脚都可以用,只有脚没有其他的地方影响。
蓝牙
官方参考API主页:[General Overview - v2.13 - Bluetooth API Documentation Silicon Labs](https://docs.silabs.com/bluetooth/latest/)
官方蓝牙API文档:[Bluetooth Software API Reference Manual](https://www.silabs.com/documents/public/reference-manuals/bluetooth-api-reference.pdf)
蓝牙profile 开发user guide: [UG118: Bluetooth® Profile Toolkit Developer's Guide](https://www.silabs.com/documents/public/user-guides/ug118-bluegecko-bt-profile-toolkit.pdf)
蓝牙sample
整理了一下BG22开发板的蓝牙的sample:
分为以下几个:
- Thermometer Client 和Server(默认没有后缀的都是server,因为通常手机作为client)
这个sample遵循的是SIG规定的GATT profile,[Health Thermometer](https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=238688)(0x1809)
这个sample可以用两个板子,一个跑client,一个跑server,也可以用一个板子跑server,手机用app
连上之后,通过client端UART口打印,可以看到图中所示,指示出对应的地址的温度,该client端可以自动连接N个client。
用手机测试可以用官方的EFR Connect apk,来连接,连上之后,打开CCCD就可以看到对应的温度实时发送过来。
- Thunderboard
这个sample中是一个综合的演示例程,可以使用一个叫`Thunderboard` 的app来演示对应的server的值,基本上把板子上的霍尔感应,温湿度传感器,LED灯,BUTTON都在APP中提供了演示,
参考的SIG 的GATT PROFILE 有:
- [Environmental Sensing Service 0x181A ](https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=294797)
- [Automation IO Service 0x1815](https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=304972)
设计思路
对于蓝牙BLE来说,这次任务主要是在client端和server端进行操作。
- client -----这个就是设备发起命令和请求server数据和接收notify
- server----- 这个是设备响应命令和请求,并且可以发数据给client端。
也就是通常用手机连接某个蓝牙传感器的时候,手机就是client端,传感器就是server端。
通常手机都是作为client端来操作server端的数据的。
通过了解蓝牙协议栈之后,我们知道只需要实现client端控制我们的BG22开发板即可,这边有很多种方式,大致上有两个方向:
- 手机作为client端:可以用微信小程序来实现操作开发板,也可以直接修改官方的[Thunderboard](https://github.com/SiliconLabs/thunderboard-android) apk来实现,这个在github上是有源码的
- 电脑作为client端:可以使用PC上的蓝牙来作为client端,来控制server,linux下面可以用bluez,windows下面可以net windorm变成
- MCU作为client端:这个可以找一个其他的蓝牙板子,作为client端,检测到温度达到某一个阈值之后,直接操作GATT来点亮小灯,像WB55, NRF52840这些设备都可以,也可以用silicon lab来作为client端。
大体上就这些方向,
流程图:
```sequence
Title: 标题:FUNPACK 第四期
client-->>server: scan adv
client-->>server: if adv have uuid 0x181A
client -> server: connect
client -> server: discovery all service
client -> client: save the led handle and Temperature handle
client -> server: read the Temperature handle
client -> client: check the Temperture if > 25°C
client -> server: control the led handle
```
主要代码片段
主要修改代码在Project\client\soc_thermometer_client\app.c中,
首先根据server端打出的广播UUID我们来筛选设备
```
static uint8_t find_service_in_advertisement(uint8_t *data, uint8_t len)
{
uint8_t ad_field_length;
uint8_t ad_field_type;
uint8_t i = 0;
// Parse advertisement packet
while (i < len) {
ad_field_length = data[i];
ad_field_type = data[i + 1];
// Partial ($02) or complete ($03) list of 16-bit UUIDs
if (ad_field_type == 0x02 || ad_field_type == 0x03) {
// compare UUID to Health Thermometer service UUID
if (memcmp(&data[i + 2], thermo_service, 2) == 0) {
return 1;
}
}
// advance to the next AD struct
i = i + ad_field_length + 1;
}
return 0;
}
// Health Thermometer service UUID defined by Bluetooth SIG
static const uint8_t thermo_service[2] = { 0x1A, 0x18 };
```
thermo_service这个就是对应的uuid 0X181A
之后连接设备,连上之后就开始查找服务
```
sc = sl_bt_gatt_discover_primary_services(evt->data.evt_connection_opened.connection);
```
查找到对应的服务保存对应的handle
```
if(evt->data.evt_gatt_service.uuid.len == 2)
{
if(!memcmp(evt->data.evt_gatt_service.uuid.data, thermo_service,2))
{
sl_app_log("We have environment temperate servcie\r\n");
conn_properties[table_index].thermometer_service_handle = evt->data.evt_gatt_service.service;
}
else if(!memcmp(evt->data.evt_gatt_service.uuid.data, led_service,2))
{
sl_app_log("We have led_service \r\n");
conn_properties[table_index].aiot_service_handle = evt->data.evt_gatt_service.service;
}
}
```
之后一直查询对应的温度值:
```
sl_bt_gatt_read_characteristic_value(conn_properties[table_index].connection_handle,conn_properties[table_index].thermometer_characteristic_handle);
```
最后可以根据温度阈值做对应的处理,来点亮LED灯的handle
```
if((rht_temperature > 2500) && (led_status == 0))
{
sl_app_log("the rht_temperature has up to 30 C, OPEN LED\r\n");
led_status = 1;
sl_bt_gatt_write_characteristic_value(conn_properties[table_index].connection_handle,conn_properties[table_index].aiot_service_led_handle, 1,&led_status);
}
else if((led_status ==1) && (rht_temperature <= 2500))
{
led_status = 0;
sl_app_log("the rht_temperature has up to 30 C, CLOSE LED");
sl_bt_gatt_write_characteristic_value(conn_properties[table_index].connection_handle,conn_properties[table_index].aiot_service_led_handle, 1,&led_status);
}
```
心得体会
这次活动非常好,任务也不是特别难,对于普及蓝牙基本知识能够起到很大的作用。大家通过这个能学到蓝牙的基本知识和使用。并且可以了解世界顶级MCU巨头silicon lab的产品,从产品中也可以学到很多传感器相关的知识。
建议:
一个月的时间,有些仓促,任务比较简单,大家都是入门,如果能够拉动大家后续继续学习跟进,就能持续学习下去。也可以组织大家一起来给开源提供一些PR来促进大家学习兴趣。
个人信息:
· 姓名 李涛
· 电话 15895566607
· 邮箱 89524862@qq.com
· 公司或学校 霍尼韦尔
· 职务或专业及年级 嵌入式软件工程师