【黑金云课堂】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系统移植、驱动编写、应用开发
相关推荐
techdashen3 小时前
从网络栈继续往下:micro:bit、2.4GHz、调制方式,以及一个不太靠谱但很有趣的想法
网络·fpga开发
FPGA小徐3 小时前
FIR 数字滤波器 --verilog设计实现
fpga开发
zlinear数据采集卡3 小时前
从协议解析到波形实时显示:硬核拆解ZLinear采集卡上位机软件的开发架构
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
pcjiushizhu4 小时前
ModelSim 仿真时 Simulate 无反应或只显示 Loading 的解决方法:网卡问题排查
fpga开发
FPGA小迷弟7 小时前
vivado中的AXI Interconnect到底应该怎么用,他的底层原理是什么,一篇文档全部理清楚!!!
网络协议·tcp/ip·fpga开发·verilog·fpga
国科安芯16 小时前
ASC4T245S分组双向控制架构深度解析:独立DIR/OE控制、QFN16封装与混合方向总线桥接
单片机·嵌入式硬件·物联网·fpga开发·架构·risc-v
尤老师FPGA1 天前
GT系列2:GT基础架构(二)
fpga开发
想你依然心痛1 天前
电源时序控制:多路电源的上电顺序与监控——复位、看门狗
fpga开发
Eloudy1 天前
hsb fpga/ 目录分析
fpga开发·量子计算
Hello-FPGA1 天前
GPU Direct DMA RDMA 与FPGA 通讯在Jetson 平台的测试表现
fpga开发