I2C 使用指南
概述
I2C 是一种串行同步半双工通信协议,总线上可以同时挂载多个主机和从机。I2C 总线由串行数据线 (SDA) 和串行时钟线 (SCL) 线构成。这些线都需要上拉电阻。
I2C 具有简单且制造成本低廉等优点,主要用于低速外围设备的短距离通信(一英尺以内)。
I2C相关测试和配置介绍: I2C_test_config_driver
Figure 1. I2C_Connection
上图为 I2C 硬件连接,其中:
SCL:时钟信号, 提供传输数据的时钟,用来同步数据传输;
SDA:用于传输数据。
Beken 芯片通常具有 2 个 I2C 控制器(I2C0和I2C1);
I2C 通信流程
在主模式下,I2C 接口会启动数据传输并生成时钟信号。串行数据传输始终是在出现 START 位 (STA) 时开始,在出现 STOP 位 (STO) 时结束。起始位和停止位均在主模式下由软件生成。START 位通过在 SCL 为高电平时将 SDA 线拉低而生成,STOP 位通过在 SCL 为高电平时将 SDA 线拉高而生成。
在从模式下,该接口能够识别其自身地址(7 或 10 位)以及广播呼叫地址。数据和地址均以 8 位字节传输,最高有效位 (MSB) 在先。起始位后紧随地址字节(7 位地址占据一个字节;10 位地址占据两个字节)。地址始终在主模式下传送。
在 (N)ACK 后通过在总线上发送 STOP 位来结束传输。在 STOP 位之后,任何希望在总线上启动传输的主器件都可以尝试获得对总线的控制。如果当前主器件希望在当前之后立即进行另一次传输,它可以通过发送重复的 START 位 (Sr) 来直接开始新的传输,而不是先发送 STOP 后再发送 START。
Figure 2. I2C通信图
I2C 时序
该接口支持7 位和10 位寻址模式,不同寻址模式下的接口传输时序如下图所示。7 位寻址模式下,主器件在发送 STA 之后只需发送 1 个地址字节,其内容为 SLV_ADDR[6:0]+W;10 位寻址模式下,主器件在发送 STA 后需要发送 2 个地址字节,第 1 个地址字节内容为 11110+SLV_ADDR[9:8]+W,第 2 个地址字节的内容为 SLV_ADDR[7:0]。
从器件检测到 STA 后开始接收地址字节。7 位寻址模式下,接收到的第一个地址字节与软件配置的从地址匹配时将上报中断;10 位寻址模式下,接收到的前 2 个地址字节于软件配置的从地址匹配时才上报中断,且地址字节不会写入内部接收 FIFO 中。
Figure 3. I2C时序图
I2C 使用方法
Beken I2C 既可工作在主机模式下,也可工作在从机模式下。无论主机还是从机,读写之前需要先调用 bk_i2c_init() 配置 I2C。 bk_i2c_init() 主要配置 I2C SCL 的时钟频率,如果工作在从机模式下,还需要配置 Beken I2C 的器件地址。
备注
对于 bk7231n/bk7251,由于 I2C_ID_1(对应 address_mapping 上的 I2C2) 与 UART2 共用 GPIO,因此当 I2C_ID_1 使能时,UART2 无法使用。
I2C 主机模式下通信
调用 bk_i2c_master_write() 写入数据到从设备,bk_i2c_master_read() 读取数据。 针对 eeprom 这类内存设备,Beken 提供 bk_i2c_memory_write()/bk_i2c_memory_read() 接口,可以指定到从设备内部的地址去执行读写操作。以下是
I2C memory write
I2C memory read
I2C 从机模式下通信
针对从机模式下,Beken 提供 bk_i2c_slave_write()/bk_i2c_slave_read(),用于发送/接收数据。
I2C api介绍
I2C相关的api介绍参考: I2C的api介绍