开发环境
- 软件:Quartus II 64-Bit
- 开发板及芯片型号:至芯 EP4CE6E22C8N 1.2V
协议核心概述
1. 物理层特性
- 双线制:仅需 SCL(时钟线)和 SDA(数据线)两根线,均需外接上拉电阻,空闲时保持高电平。
- 多主多从:支持多个主机和从机,通过设备地址(通常 7 位)区分不同外设,地址后接 1 位读写标志位(0 写 / 1 读)。
- 半双工通信:数据线 SDA 同一时刻只能单向传输,由主机控制时序。
2. 关键时序状态
- 起始条件(Start):SCL 高电平时,SDA 由高→低跳变,标志通信开始。
- 停止条件(Stop):SCL 高电平时,SDA 由低→高跳变,标志通信结束。
- 数据传输:SCL 低电平时更新 SDA 数据,SCL 高电平时保持稳定,数据按高位优先传输。
- 应答机制(ACK/NACK):每传输 8 位数据后,接收方在第 9 个 SCL 周期拉低 SDA(ACK)或保持高电平(NACK)。
3. 状态机驱动
通过状态机划分 IIC 操作阶段,典型状态包括:空闲态(IDLE)、起始态(START)、写数据(WR_DATA)、读数据(RD_DATA)、应答(ACK)、停止态(STOP)。
4. 时钟分频与时序控制
将 FPGA 系统时钟(如 50MHz)分频至 IIC 速率(如 100kHz 或 400kHz),需计算分频参数。在 SCL 低电平中点更新 SDA 数据,确保时序稳定。
示例状态机跳转逻辑:
case(state)
IDLE: if(读写请求) next_state <= START;
START: next_state <= WR_DATA;
WR_DATA:next_state <= ACK;
ACK: if(操作类型) next_state <= STOP else next_state <= RD_DATA;
STOP: next_state <= IDLE;
endcase
- 写操作:主机依次发送设备地址(+ 写标志)、寄存器地址、数据,每字节后检测 ACK。
- 读操作:主机发送设备地址(+ 写标志)→寄存器地址→重新发送起始信号→设备地址(+ 读标志)→接收数据并发送 ACK/NACK。
基础知识
1. I2C(IIC)通讯协议
I2C 通讯协议(Inter-Integrated Circuit)是由 Philips 公司开发的一种简单、双向二线同步串行总线,只需要两根线就可以在连接于总线上的器件之间传送信息。
优点:
- 多设备支持:每个设备都有唯一的地址。
- 简单:协议相对简单,易于实现和调试。
- 低功耗:空闲状态下器件可进入低功耗模式。
- 仲裁:防止多个主机同时使用总线时的冲突。
- 速度:标准模式 100kb/s,快速模式 400kb/s。
缺点:
- 速度较慢:适用于低速设备。
- 受限制:总线长度和设备数量受限。
- 冲突:需要额外的冲突检测和处理机制。
**应用案例:**小型传感器、LCD 屏幕、RTC(实时时钟)模块等。
2. I2C 物理层
- I2C_SCL:串行时钟线,用于同步通讯数据。
- I2C_SDA:双向串行数据线,传输通讯数据。
3. I2C 协议层
包含 4 个状态:总线空闲状态、起始信号、数据读写状态、停止信号。


