【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术

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。
    • SPI:4线,单主多从,高速,常用于ADC/DAC。
    • UART:2线(TX/RX),异步,常用于上位机通信。
  • 进阶学习
    • 多主设备仲裁、10位地址模式、软件I2C(Bit-Banging)、逻辑分析仪调试。

💡 完整视频讲解可前往 ALINX 视频号进行直播回看

更多细节欢迎关注我们黑金云课堂全年免费直播课黑金云课堂六月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!

系列 内容定位
Verilog开发 硬件描述语言基础、逻辑设计、仿真调试
Vitis开发 Zynq软硬件协同、外设驱动、网络协议栈
Linux开发 嵌入式Linux系统移植、驱动编写、应用开发
相关推荐
尤老师FPGA8 小时前
HDMI数据的接收发送实验(二十)
fpga开发
千寻xun1 天前
三、实战篇-NVME SSD控制之FPGA实现(一)
fpga开发·nvme ssd·nvme协议
XMAIPC_Robot1 天前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
upper20201 天前
从零开始设计riscv cpu记录之七
fpga开发·riscv·riscv设计·btb·分支预测
ARM|X86+FPGA工业主板厂家1 天前
AI视觉跟随运动控制实战|RK3588 NPU检测+FPGA EtherCAT多轴联动精准跟随方案,适用于半导体视觉对位等
人工智能·fpga开发·硬件工程·ethercat·实时系统
XMAIPC_Robot1 天前
RK3588+FPGA半导体设备量产踩坑大全|发热、时序漂移、推理抖动、成像干扰、EMC干扰方案
人工智能·嵌入式硬件·fpga开发·arm+fpga
凡亿卓达方案设计2 天前
FPGA硬件开发怎么选靠谱方案商?
fpga开发
Eloudy2 天前
QSFP28、RoCEv2、RFSoC-4x2 数据传输与器件链路
网络·fpga开发·rocev2
Echo_cy_2 天前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
現実君2 天前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发