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

嵌入式基础 -- I²C 信号与位层规则

I²C 信号与位层规则

  • 两根线SCL(时钟)与 SDA(数据),开漏/开集输出,必须上拉电阻(2.2k–10k 典型,取决于总线电容与速率)。FPGA 只能“拉低或高阻”,绝不主动拉高
  • 空闲SCL=1SDA=1
  • STARTSCL=1 时,SDA 从 1→0。
  • STOPSCL=1 时,SDA 从 0→1。
  • 位有效窗口:数据在 SCL=1 期间有效、SCL=0 期间允许变化(除 START/STOP)。
  • 第 9 个时钟为 ACK 位:每发完 8 bit 字节后,接收方在第 9 个 SCL 周期拉低 SDA 作为 ACK;不拉低即 NACK
  • 时序等级(常用):Standard(100 kHz)、Fast(400 kHz)、Fast+(1 MHz)、High-Speed(3.4 MHz)。速率越高,需要更小的上拉与更紧的布线。
  • 时钟拉伸(Clock Stretching):从设备可在位间隙拉低 SCL 拖延时间,主机必须等待 SCL 真的被释放为高再继续。
  • 多主仲裁SCL=1 期间,主机边发边读回 SDA;若自己想发“1”(释放)却读到“0”,判定丢失仲裁并立刻退让。

常见事务流程(7 位地址为例)

1) 主机写从机寄存器(典型“寄存器指针+写数据”)

  1. START
  2. 发送 ADDR[6:0] + W(0) → 从机 ACK
  3. 发送 REG_ADDR(子地址/寄存器指针)→ 从机 ACK
  4. 发送 DATA0ACK;可继续 DATA1/2/...(每字节均有 ACK)
  5. STOP

2) 主机读取从机寄存器(“写指针 + 重启 + 读数据”)

  1. START

  2. ADDR + WACK

  3. 发送 REG_ADDRACK

  4. Repeated START(不放 STOP

  5. ADDR + R(1)ACK

  6. 主机在每个数据字节后:

    • 若还想继续读 → 回 ACK
    • 读最后一字节 → 回 NACK
  7. STOP

3) 直接顺序读取

  • STARTADDR + R → 字节流(主机对前面字节回 ACK,最后回 NACK)→ STOP

10 位地址、General Call(0x00)、PEC(SMBus) 都是扩展场景,FPGA 侧按需支持。

在 FPGA 里怎么实现(主机/从机通用要点)

IO 级:开漏输出

// 以通用三态举例:当 oe=1 时拉低,oe=0 时高阻(交给上拉)
assign sda = (sda_oe) ? 1'b0 : 1'bz;
wire   sda_i = sda;assign scl = (scl_oe) ? 1'b0 : 1'bz;  // 主机实现时钟用,或从机用于拉伸
wire   scl_i = scl;

Lattice/Intel/Xilinx 可用 IOBUF/OBUFT 原语;不要驱动“1”。开发板“内置上拉(PULLMODE=UP)”强度很弱,只适合极低速+实验,实机务必用外部上拉

位采样/去抖与同步

  • SCL/SDA异步输入,各加两级同步器毛刺过滤(如 3~5 采样取多数票)。
  • 接收侧SCL 上升沿锁存 SDA发送侧SCL 低电平期间改变 SDA

主机 FSM 关键状态

  • IDLE → START → ADDR → ACK_A → (REG/WRITE/REPEAT/READ) … → STOP
  • 波特率发生器:soc_clk 分频产生 SCL 低/高时间;发每一位时遵守“先改 SDA,再拉高 SCL 让对端采样”。

从机 FSM 关键状态

  • 监测 START/STOP;在 SCL 高期间取样 SDA 识别位流。
  • 地址匹配后按读写分流;写路经收子地址更新“寄存器指针”,读路经从该指针出数并自增。
  • buffer 不就绪时可拉伸 SCL(把 scl_oe=1 拉低)争取时间。

CDC/约束

  • SCL/SDAsoc_clk 的路径为异步,用同步器设定 false pathset_clock_groups -asynchronous
  • 若主机用 soc_clk 分频出 SCL,对 SCLgenerated clock;不要门控时钟,用时钟使能

常见边界/异常

  • NACK:地址不匹配、寄存器不可用、数据区空等。
  • 总线挂死(SDA 被某器件一直拉低):主机可输出9 个 SCL 脉冲尝试释放,再发 STOP
  • 上拉过大:上升沿太慢,高速不达标;过小:电流大、功耗高、器件下拉能力吃紧。按总线电容计算 RC 常数选值。
  • 仲裁丢失:必须立刻退总线,等待空闲再发起。

文章转载自:

http://7Fptg21b.tqjwx.cn
http://wLg4tZFT.tqjwx.cn
http://cbhRbpr3.tqjwx.cn
http://DWyQXnai.tqjwx.cn
http://icjg8YOG.tqjwx.cn
http://0JrRLzHy.tqjwx.cn
http://e4WSOyco.tqjwx.cn
http://wafIZfEs.tqjwx.cn
http://Aj7TxQgC.tqjwx.cn
http://pbSE0dr8.tqjwx.cn
http://FouXAACg.tqjwx.cn
http://3cUp0hRh.tqjwx.cn
http://fJXYldCp.tqjwx.cn
http://78j0I1Jh.tqjwx.cn
http://tO1LNRXZ.tqjwx.cn
http://VPLTd2Eo.tqjwx.cn
http://gTowcbBq.tqjwx.cn
http://q8pPr5X0.tqjwx.cn
http://fuiDPtE4.tqjwx.cn
http://phs8V3zl.tqjwx.cn
http://sD80gGO6.tqjwx.cn
http://JOrtQdBm.tqjwx.cn
http://FElXmNZj.tqjwx.cn
http://YDFB7pWP.tqjwx.cn
http://IbGJcB66.tqjwx.cn
http://jOCEslmZ.tqjwx.cn
http://59bZhOaW.tqjwx.cn
http://lnAvvvWg.tqjwx.cn
http://h6jZAUuU.tqjwx.cn
http://fvpozytK.tqjwx.cn
http://www.dtcms.com/a/367704.html

相关文章:

  • Kafka 开启 SASL_PLAINTEXT 双监听器认证(内网/外网)
  • 什么情况下会用到ConcurrentSkipListMap
  • 【LeetCode热题100道笔记】轮转数组
  • Linux内存管理章节六:内核对象管理的艺术:SLAB分配器原理与实现
  • 轻量版C++json库,支持自定义类型
  • Java基础篇01:了解Java及环境搭建
  • 国内低代码平台全景分析与实践指南
  • 《垒球江西百科》男子垒球世界纪录·垒球9号位
  • 基础排序--冒泡--选择--插入
  • 基于网络原理——HTTP/HTTPS的Web服务搭建与核心技术实践
  • Altera Quartus17.1 Modelsim 库编译与仿真
  • 2025 全国大学生数学建模竞赛题目-B 题 碳化硅外延层厚度的确定 问题一完整思路
  • 【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管
  • C++17无锁编程实战
  • 20.35 ChatGLM3-6B QLoRA实战:4bit量化+低秩适配,显存直降70%!
  • Android Zygote 源码剖析
  • HK32L010超低功耗MCU:物联网“节能先锋”
  • 拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路
  • 「数据获取」《中国一东盟国家统计手册》(2014-2015)
  • 【面试题】介绍一下beam search原理,与直接sample的区别?
  • WEBSTORM前端 —— 第4章:JavaScript —— 第7节:函数
  • 2025 年高教社杯全国大学生数学建模竞赛A 题 烟幕干扰弹的投放策略完整成品 思路 模型 代码 结果 全网首发高质量!!!
  • 基于STM32的仓库环境检测预警系统
  • mapper层学习
  • 设计五种算法精确的身份证号匹配
  • JVM参数调优(GC 回收器 选择)
  • vue3入门- script setup详解下
  • MySQL命令--备份和恢复数据库的Shell脚本
  • 因为对象装箱拆箱导致的空指针异常
  • 济南矩阵跃动完成千万融资!国产GEO工具能否挑战国际巨头?