FPGA 基础第 11 期 I2C 总线通信技术,选自ALINX 黑金云课堂 FPGA 免费直播课。该课程由 ALINX 资深工程师团队倾力打造,从 0 到 1 系统化教学,帮助每位工程师跨过 FPGA 开发门槛。
🔍 ALINX:关注 ALINX,进入视频号即可查看完整黑金云课堂 FPGA 视频教程。配合笔记学习效果更佳。
一、I2C基本原理
总线特点半双工、同步、多主多从的串行通信总线,仅需两根线:SDA(数据线) 和 SCL(时钟线)。
物理层关键
上拉电阻影响上升时间和功耗:标准模式(100kHz)推荐 4.7kΩ,快速模式(400kHz)推荐 2.2kΩ / 1.8kΩ。
协议层核心
起始条件 (START):SCL高电平时SDA由高→低。
停止条件 (STOP):SCL高电平时SDA由低→高。
数据帧:8位数据,高位优先,每字节后跟1位应答位(ACK/NACK)。
地址帧:7位从机地址 + 1位读写位(0=写,1=读)。
通信流程
写操作:START → 地址+写 → ACK → 数据 → ACK → STOP。
读操作:START → 地址+写 → ACK → 寄存器地址 → ACK → 重复START → 地址+读 → ACK → 读数据 → NACK → STOP。
二、EEPROM读写实验(AT24C02)
实验目标通过FPGA对AT24C02进行字节/页写和读操作。
硬件连接SDA/SCL接上拉电阻(4.7kΩ)至5V。
关键注意写入操作后需等待至少 5ms(写入周期),或通过轮询ACK确认。
FPGA实现通过状态机模拟I2C时序,控制起始、地址、数据、停止及应答检测。
// I2C主设备模块定义
module i2c_master
(input clk, rst_n,
inout sda, scl,
input [6:0] addr);
// 写EEPROM状态机
case (state)
IDLE: begin scl=1; sda=1; end
START: sda=0; // 起始条件
ADDR: sda=addr[bit]; // 发地址
DATA: sda=data[bit]; // 发数据
STOP: sda=0; scl=1; sda=1; // 停止
endcase
// 读EEPROM状态机
case (state)
RD_ADDR: sda=addr[bit];
RD_DATA: begin // 释放SDA
sda=1'bz; // 高阻态
data_rd=sda; // 采样数据
end
endcase
三、LM75温度传感器读取实验
实验目标FPGA通过I2C读取LM75温度值。
LM75要点
地址格式:1001 A2 A1 A0,最多挂载8个设备。
温度寄存器地址:0x00,16位数据,高9位有效(符号位+整数位)。
温度计算公式:实际温度 = (原始数据 >> 7) × 0.5°C。
FPGA实现状态机先写寄存器地址(0x00),再读2字节数据,最后移位计算温度。
```verilog
// 状态机:写寄存器地址 & 读温度数据
always @(posedge clk) begin
case (i2c_state)
WRITE_ADDR: begin // 阶段1: 写0x00
sda_out <= lm75_addr[7:0];
if (ack) i2c_state <= READ_DATA;
end
READ_DATA: begin // 阶段2: 读2字节
temp_raw[15:8] <= sda_in; // 高8位
temp_raw[7:0] <= sda_in; // 低8位
i2c_state <= IDLE;
end
endcase
end
四、总结与进阶
核心回顾
双线、开漏、上拉电阻、起始/停止、地址/数据帧、应答机制、主读/主写流程。
常见总线对比
I2C:2线,多主多从,低速,常用于传感器、EEPROM。
进阶学习
多主设备仲裁、10位地址模式、软件I2C(Bit-Banging)、逻辑分析仪调试。
💡 完整视频讲解可前往 ALINX 视频号进行直播回看
更多细节欢迎关注我们黑金云课堂全年免费直播课,黑金云课堂六月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!
| 系列 | 内容定位 |
|---|---|
| Verilog开发 | 硬件描述语言基础、逻辑设计、仿真调试 |
| Vitis开发 | Zynq软硬件协同、外设驱动、网络协议栈 |
| Linux开发 | 嵌入式Linux系统移植、驱动编写、应用开发 |
198