1. 项目背景与硬件选型
最近在做一个智能家居传感器项目,需要将温湿度传感器的数据无线传输到手机端。经过多方比较,我最终选择了Silicon Labs的EFR32BG22作为主控芯片。这款芯片真的让我眼前一亮,它集成了Cortex-M33内核和2.4GHz射频模块,功耗低得惊人,在蓝牙传输时电流只有几毫安。
为什么选择EFR32BG22呢?首先它的性价比很高,一片芯片就解决了MCU和蓝牙射频两个需求,不需要外挂蓝牙模块。其次它的开发环境很友好,Simplicity Studio 5提供了完整的工具链。最重要的是,它支持丰富的通信接口,包括I2C、SPI、UART等,正好满足我连接各种传感器的需求。
在我的项目中,使用了一款常见的I2C接口温湿度传感器,通过两根线(SDA和SCL)与EFR32BG22连接。整个硬件架构非常简洁:传感器负责采集数据,EFR32BG22负责处理并通过蓝牙传输,手机端接收显示。这种设计既节省了PCB空间,又降低了系统复杂度。
2. 开发环境搭建
刚开始接触EFR32BG22时,我在开发环境搭建上花了些时间。Simplicity Studio 5的安装过程比较直接,但需要注意选择正确的SDK版本。我推荐使用Gecko SDK v3.2.0或更高版本,这些版本对EFR32BG22的支持更加完善。
安装完成后,首先要创建新项目。在Simplicity Studio中选择"New Project",然后找到EFR32BG22对应的开发板型号。我使用的是TBRL4184A开发板,如果你用的是其他板子,记得选择对应的型号。创建项目时建议选择"Empty"模板,这样可以从零开始配置,更好地理解整个流程。
SDK组件的选择很重要。除了默认的蓝牙栈之外,还需要添加I2C驱动组件。在Software Components面板中搜索"I2C",选择"I2CSPM"(I2C Simple Polling Mode)组件。这个组件提供了轮询方式的I2C操作接口,对于传感器数据采集来说完全够用,而且比中断方式更简单可靠。
3. 硬件引脚配置
引脚配置是第一个实操环节,也是容易出错的步骤。EFR32BG22的引脚功能很灵活,每个引脚都可以配置为多种功能。我建议先在数据手册中找到I2C对应的引脚映射,避免选到不支持I2C功能的引脚。
打开Pin Tool工具后,可以看到芯片的引脚分布图。我需要将PC0配置为SCL,PC1配置为SDA。在Pin Tool中右键点击PC0引脚,选择"I2C0_SCL"功能,同样的方法将PC1配置为"I2C0_SDA"。配置完成后记得检查引脚模式,I2C引脚需要设置为开漏输出(Open Drain)模式,并启用上拉电阻。
配置完成后,Simplicity Studio会自动生成引脚初始化代码。你可以在autogen目录下的sl_pin_init.c文件中查看生成的代码。这些代码会在系统启动时自动执行,确保引脚工作在正确的模式下。如果后续需要修改引脚配置,只需要在Pin Tool中重新配置即可,不需要手动修改代码。
4. I2C外设初始化
引脚配置完成后,接下来要初始化I2C外设。在Software Components中启用I2C组件后,系统会自动生成初始化函数。主要的初始化工作在sl_i2cspm_init_instances()函数中完成,这个函数会配置I2C的时钟频率、工作模式等参数。
I2C的时钟配置需要特别注意。EFR32BG22支持多种时钟源,我建议使用高频RC oscillator(HFXO)作为时钟源,这样能获得更稳定的I2C时序。时钟频率设置为100kHz是比较稳妥的选择,大多数I2C传感器都支持这个速率。如果需要更高的传输速度,可以设置为400kHz,但要确保传感器支持快速模式。
初始化完成后,可以通过sl_i2cspm_get_handle()函数获取I2C实例的句柄。这个句柄在后面进行数据传输时会用到。我习惯在程序初始化阶段就获取句柄并保存起来,避免每次传输时都要重新获取。
// I2C实例句柄
static sl_i2cspm_t *i2c_handle = NULL;
void init_i2c(void)
{
/
254



被折叠的 条评论
为什么被折叠?



