BES蓝牙耳机开发--IIC接口应用
- [BES SDK IIC接口介绍](#BES SDK IIC接口介绍)
- [BES SDK IIC使用示例](#BES SDK IIC使用示例)
- IIC常见问题与排查
在嵌入式开发中,IIC总线(也叫I2C:Inter-Integrated Circuit)是常用的通信接口之一,IIC总线有着独特的两线制通信设计,总线定义了SCL(Serial Clock Line串行时钟线)以及SDA(Serial Data Line串行数据线),实现比较简单,大大降低了系统的复杂性和成本。因此,无论是读取传感器数据、控制EEPROM存储器,还是与各种外设通信,IIC总线都扮演着重要角色。本篇文章以BES2710IHC SDK为例,介绍如何使用SDK中自带的IIC接口来驱动IIC外设进行通信。
BES SDK IIC接口介绍
IIC总线上有主设备(一般是主控)和从设备(一般是各种传感器)两种角色,数据传输由主机控制。BES的SDK为开发者提供了完善的 IIC 驱动支持,SDK支持IIC主从两种角色,也同时支持硬件IIC与软件GPIO模拟IIC两种方式。相关接口可以参考SDK中的hal_i2c.c和hal_i2c.h文件中的接口,无需用户手动编写底层时序,直接调用API即可完成通信,如下图为SDK中可供用户调用的API。

BES SDK IIC使用示例
硬件IIC依托芯片内置的IIC硬件控制器实现,通信稳定,时钟精准,不占用太多CPU资源,适合高速、长距离、高稳定性要求的项目;而软件IIC则通过GPIO引脚翻转模拟IIC时序波形,最大优势是引脚可任意映射,不受硬件 IIC固定引脚限制,灵活度高,适合引脚紧张、通信速率要求不高的场景。
下面以软件IIC接口,即上图中的hal_gpio_i2c接口为例,在BES的SDK中以GPIO模拟IIC总线控制波形时序,达到与外设通信的目的。
IIC初始化
因为是使用GPIO模拟的IIC,所以软件IIC在使用前需要完成GPIO的配置和初始化,如下图只要初始化时定义一个HAL_GPIO_I2C_CONFIG_T结构体的变量,配置指定好SCL及SDA使用的对应IO口引脚,调用hal_gpio_i2c_open()初始化函数即可。

IIC数据发送接口
数据发送用于向从设备写入配置、指令或数据,这里用户只需要调用hal_gpio_i2c_send()数据发送函数即可完成标准IIC数据发送。

标准IIC写时序为:起始信号->发送7位从机地址+写位->发送寄存器地址->写入数据->结束信号。如下图,是一个写外设寄存器时序图,外设传感器从机7位地址为0x2C(一般在外设数据手册可以查到),对外设0x84寄存器写入0xA5的值。

IIC数据接收接口
标准IIC通信在接收数据前需要先发送寄存器的地址告诉从机需要读取的寄存器地址,再重新发送起始信号读取外设寄存器的值,在BES的SDK中,用户可以先调用hal_gpio_i2c_send()函数发送需要读取的寄存器地址再调用hal_gpio_i2c_recv()完成数据的接收;也可以直接调用hal_gpio_i2c_recv()配置tx_buf,只需要调用一次也可以完成这两个步骤。

标准IIC读取时序为:起始信号->发送7位从机地址+写位->发送需要读取的寄存器地址->结束信号->重新发送起始信号->发送7位从机地址+读位->读取数据->NAK->结束信号。下图是一个读取外设寄存器时序图,外设传感器从机7位地址为0x2C,对外设0x1E寄存器进行读取,从机返回寄存器的值为0x01。

IIC常见问题与排查
- 外接上拉电阻:IIC总线上的SCL和SDA必须加上拉电阻,这是由其开漏输出特性决定的。否则无法拉高电平而导致通信失败。
- 从机地址错误:从设备地址为7位,部分芯片手册会给出8位地址(包含读写位),需注意区分;写操作最低位为0,读操作最低位为1。
- 引脚配置错误:软件 IIC 的 SCL、SDA 引脚不能被其他外设复用,需确保初始化配置与硬件实际接线一致。
- 信号质量差:注意PCB布线时尽量缩短IIC走线长度,减小寄生电容,这样可以获得更好的信号质量和更高的通信速率。
- 无ACK应答:检查从设备供电、复位状态、寄存器地址是否正确,确认从设备处于正常工作模式。