当前位置: 首页 > news >正文

FPGA实现I2C通信方案

目录

总体系统架构图

I2C控制器模块划分

关键时序图

完整写操作时序(写24C02 EEPROM)

状态机定义

时钟生成(100kHz)

测试方案

测试用例


总体系统架构图

I2C控制器模块划分
  1. 时钟分频模块:生成I2C时钟

  2. 主状态机:控制通信流程

  3. 移位寄存器:数据串并转换

  4. ACK检测:响应检测逻辑

  5. 仲裁逻辑:多主竞争处理

  6. 三态控制:双向IO管理

关键时序图

SCL  _______/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\_______/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\_______
SDA  _____/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\___

 起始SDA↓ while SCL=H     结束 ↑ SDA↑ while SCL=H
完整写操作时序(写24C02 EEPROM)

         Start       地址+W       ACK      数据        ACK       Stop
SCL  ___/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\___
     |    |  A6 A5 A4 A3 A2 A1 A0 W |     | D7 D6 ... D0 |     |    |
SDA  ___/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\_
     | S | 1  0  1  0  0  0  0  0 | ACK | 0  1  ... 1   | ACK | P |
         ↑ 从机地址(0x50) + 写(0)     ↓    数据(0x5F)       ↓

3. 读操作时序

         Start       地址+R       ACK      数据        NACK      Stop
SCL  ___/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\___
     |    |  A6 A5 A4 A3 A2 A1 A0 R |     | D7 D6 ... D0 |     |    |
SDA  ___/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\_
     | S | 1  0  1  0  0  0  0  1 | ACK | 1  0  ... 1   | NACK| P |
         ↑ 从机地址(0x50) + 读(1)     ↓    数据(0xA5)       ↑(主机释放)

Verilog实现核心代码

状态机定义
localparam [3:0]IDLE      = 4'd0,START     = 4'd1,ADDR      = 4'd2,ACK_ADDR  = 4'd3,WR_DATA   = 4'd4,ACK_WR    = 4'd5,RD_DATA   = 4'd6,ACK_RD    = 4'd7,STOP      = 4'd8,RESTART   = 4'd9;

          三态控制逻辑

// SDA双向控制
assign sda_out = (sda_oe) ? shift_reg[7] : 1'bz;
assign sda = sda_out;// SCL时钟控制
assign scl_out = (scl_oe) ? scl_clk : 1'bz;
assign scl = scl_out;// 输入采样
always @(posedge sys_clk) beginsda_in <= sda;scl_in <= scl;
end

状态机片段(写操作)

case(state)IDLE:if (start) beginscl_oe <= 1;sda_oe <= 1;state <= START;endSTART:if (scl_high) beginsda_oe <= 0;  // 产生下降沿shift_reg <= {slv_addr, 1'b0}; // 地址+写bit_cnt <= 7;state <= ADDR;endADDR:if (scl_fall) beginif (bit_cnt > 0) beginshift_reg <= {shift_reg[6:0], 1'b0};bit_cnt <= bit_cnt - 1;end else beginsda_oe <= 0; // 释放SDAstate <= ACK_ADDR;endendACK_ADDR:if (scl_rise) beginif (!sda_in) begin // 检测ACKshift_reg <= tx_data;bit_cnt <= 7;state <= WR_DATA;end else beginstate <= STOP; // NACK处理endend...
endcase
时钟生成(100kHz)
// 系统时钟50MHz -> I2C 100kHz
parameter DIV_CNT = 250; // 50e6 / (100e3 * 2) = 250always @(posedge sys_clk or negedge rst_n) beginif (!rst_n) beginclk_cnt <= 0;scl_clk <= 1;end else beginif (clk_cnt == DIV_CNT-1) beginclk_cnt <= 0;scl_clk <= ~scl_clk; // 翻转SCLend else beginclk_cnt <= clk_cnt + 1;endend
end// 时钟边沿检测
assign scl_rise = (scl_in_prev == 0) && (scl_in == 1);
assign scl_fall = (scl_in_prev == 1) && (scl_in == 0);

测试方案

逻辑分析仪捕获波形

        +--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
SCL     | START | BIT7| BIT6| BIT5| BIT4| BIT3| BIT2| BIT1| BIT0| ACK | ... |+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
SDA     |   ↓   | A6  | A5  | A4  | A3  | A2  | A1  | A0  | W/R |  ↓  | ... |+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
测试用例
  1. EEPROM写测试:写入地址0x10,数据0xAA

  2. EEPROM读测试:读取地址0x10

  3. 错误测试:

    • 无效地址(NACK检测)

    • 总线竞争仲裁

    • 时钟拉伸测试

http://www.dtcms.com/a/334636.html

相关文章:

  • 爬机 验证服务器是否拒绝请求
  • 第五章 大数定律与极限定理
  • 概率论基础教程第3章条件概率与独立性(一)
  • 搜索 AI 搜索 概率论基础教程第3章条件概率与独立性(二)
  • Tomcat Server 组件原理
  • Java 学习笔记(基础篇3)
  • 从零打造大语言模型2--编码注意力机制
  • 【基础-判断】可以通过ohpm uninstall 指令下载指定的三方库
  • 中国教育信息化演进历程与发展趋势研究报告
  • Bash常用操作总结
  • 解决html-to-image在 ios 上dom里面的图片不显示出来
  • 《Python 单例模式(Singleton)深度解析:从实现技巧到争议与最佳实践》
  • 【自动化运维神器Ansible】Ansible逻辑运算符详解:构建复杂条件判断的核心工具
  • Manus AI与多语言手写识别的技术突破与行业变革
  • c#Blazor WebAssembly在网页中多线程计算1000万次求余
  • aws(学习笔记第五十一课) ECS集中练习(3)
  • 基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息
  • qsort实现数据排序
  • cuda编程笔记(15)--使用 CUB 和 atomicAdd 实现 histogram
  • PMP-项目管理-十大知识领域:进度管理-制定时间表、优化活动顺序、控制进度
  • 进程替换:从 “改头换面” 到程序加载的底层逻辑
  • 【深度学习计算性能】05:多GPU训练
  • TypeScript快速入门
  • MCP 大模型的扩展坞
  • 洛谷P1595讲解(加强版)+错排讲解
  • php版的FormCreate使用注意事项
  • 基于单片机的防酒驾系统设计
  • NY243NY253美光固态闪存NY257NY260
  • 24. async await 原理是什么,会编译成什么
  • 惠普声卡驱动win10装机完成检测不到声卡