跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

基于 FPGA 的 IIC 协议驱动 OLED 显示屏及 DHT11 数据读取

在 FPGA 中使用 IIC 协议驱动 0.96 寸 OLED 屏幕的方法。内容包括 IIC 协议基础时序、物理层特性、状态机设计,以及将 SPI 接口 OLED 改造为 IIC 接口的硬件修改方案。此外,文章提供了完整的 Verilog 代码实现,涵盖 IIC 驱动模块、DHT11 温湿度传感器数据采集模块、字模生成及显示刷新逻辑,实现了在 OLED 上实时显示温湿度数据的功能。

星落发布于 2026/4/5更新于 2026/7/2452 浏览
基于 FPGA 的 IIC 协议驱动 OLED 显示屏及 DHT11 数据读取

开发环境

  • 软件:Quartus II 64-Bit
  • 开发板及芯片型号:至芯 EP4CE6E22C8N 1.2V

协议核心概述

1. 物理层特性

  • 双线制:仅需 SCL(时钟线)和 SDA(数据线)两根线,均需外接上拉电阻,空闲时保持高电平。
  • 多主多从:支持多个主机和从机,通过设备地址(通常 7 位)区分不同外设,地址后接 1 位读写标志位(0 写 / 1 读)。
  • 半双工通信:数据线 SDA 同一时刻只能单向传输,由主机控制时序。

2. 关键时序状态

  • 起始条件(Start):SCL 高电平时,SDA 由高→低跳变,标志通信开始。
  • 停止条件(Stop):SCL 高电平时,SDA 由低→高跳变,标志通信结束。
  • 数据传输:SCL 低电平时更新 SDA 数据,SCL 高电平时保持稳定,数据按高位优先传输。
  • 应答机制(ACK/NACK):每传输 8 位数据后,接收方在第 9 个 SCL 周期拉低 SDA(ACK)或保持高电平(NACK)。

3. 状态机驱动

通过状态机划分 IIC 操作阶段,典型状态包括:空闲态(IDLE)、起始态(START)、写数据(WR_DATA)、读数据(RD_DATA)、应答(ACK)、停止态(STOP)。

4. 时钟分频与时序控制

将 FPGA 系统时钟(如 50MHz)分频至 IIC 速率(如 100kHz 或 400kHz),需计算分频参数。在 SCL 低电平中点更新 SDA 数据,确保时序稳定。

示例状态机跳转逻辑:

case(state)
    IDLE:   if(读写请求) next_state <= START;
    START:  next_state <= WR_DATA;
    WR_DATA:next_state <= ACK;
    ACK:    if(操作类型) next_state <= STOP else next_state <= RD_DATA;
    STOP:   next_state <= IDLE;
endcase
  • 写操作:主机依次发送设备地址(+ 写标志)、寄存器地址、数据,每字节后检测 ACK。
  • 读操作:主机发送设备地址(+ 写标志)→寄存器地址→重新发送起始信号→设备地址(+ 读标志)→接收数据并发送 ACK/NACK。

基础知识

1. I2C(IIC)通讯协议

I2C 通讯协议(Inter-Integrated Circuit)是由 Philips 公司开发的一种简单、双向二线同步串行总线,只需要两根线就可以在连接于总线上的器件之间传送信息。

优点:

  • 多设备支持:每个设备都有唯一的地址。
  • 简单:协议相对简单,易于实现和调试。
  • 低功耗:空闲状态下器件可进入低功耗模式。
  • 仲裁:防止多个主机同时使用总线时的冲突。
  • 速度:标准模式 100kb/s,快速模式 400kb/s。

缺点:

  • 速度较慢:适用于低速设备。
  • 受限制:总线长度和设备数量受限。
  • 冲突:需要额外的冲突检测和处理机制。

**应用案例:**小型传感器、LCD 屏幕、RTC(实时时钟)模块等。

2. I2C 物理层

  • I2C_SCL:串行时钟线,用于同步通讯数据。
  • I2C_SDA:双向串行数据线,传输通讯数据。

3. I2C 协议层

包含 4 个状态:总线空闲状态、起始信号、数据读写状态、停止信号。

在 SCL 为高电平的时候进行数据的写入,低电平的时候进行数据的更新。当从机设备正确接受到信号时,会把 SDA 数据线拉低,称为响应位(ACK)。

关于器件的地址: 器件地址被定义为 7Bit 的数据,厂商出厂设置。部分引脚允许用户自行设置。最后一位为读写控制位,0 表示写入,1 表示读取。

4. 数据传输流程

  1. 地址分配:每个设备有唯一地址。
  2. 开始条件:主机发送特定电平变化。
  3. 发送地址:发送 7 位地址 + R/W 位。
  4. 确认应答:目标设备拉低 SDA 表示接收成功。
  5. 数据传输:主机发送或从机发送数据。
  6. 非应答(NACK):无法接收时不拉低 SDA。
  7. 停止条件:主机发送停止信号结束传输。
  8. 多主机环境:使用仲裁机制决定控制权。

IIC 驱动 7Pin 0.96 寸 OLED 显示屏实例

1. 硬件修改

默认使用 SPI 协议驱动,改为 IIC 协议需修改电路:

  1. 将背面 R3 电阻移动到 R4 的位置。
  2. 短接 R8 电阻。

改造后需连接 7 个管脚:

  1. CS:接地。
  2. DC:选择 IIC 通信地址;接地时为 0x78,接高电平时为 0x7A(测试程序用 0x78)。
  3. RES:复位脚。方案包括接电源正(不稳定)、接开发板复位脚、IO 脚控制(拉低延迟 200ms 后拉高)或 RC 复位电路。
  4. D0:IIC 时钟线(SCK)。
  5. D1:IIC 数据线(SDA)。
  6. GND:接地。
  7. VDD:电源线。

2. OLED 刷新方式

  • 页地址模式:一页写完自动换页。
  • 水平地址模式:一列写完自动换列。
  • 垂直地址模式:类似水平模式。

3. OLED 关键命令介绍

  • 0xAE/0xAF:关闭/开启显示。
  • 0x20-0x22:数据存储模式(默认为 0x22)。
  • 0x00-0x0F:列地址低四位。
  • 0x10-0x1F:列地址高四位。
  • 0xB0-0xB7:设置 Page。

IIC 数据格式:OLED 地址 + 命令/数据 + 值。

  • OLED 地址:从机地址(如 0x78)。
  • 命令/数据:0x00 表示命令,0x40 表示数据。
  • 值:具体指令或数据。

初始化代码示例:

always@(*) begin
    case(Init_index)
        'd0: Init_data_reg <= {8'h78, 8'h00, 8'hAE}; // 关闭显示
        'd1: Init_data_reg <= {8'h78, 8'h00, 8'h00};
        // ... 其他初始化命令
        default: Init_data_reg <= {8'h78, 8'h00, 8'hAE};
    endcase
end

IIC 驱动 4Pin OLED 显示器显示 DHT11 温湿度数据

1. 字模设计

需根据字体大小(如 1616 数字字母,816 汉字)生成对应的点阵数据。

2. 程序设计

顶层模块
module main(
    input sys_clk,
    input rst_n,
    inout dht11,
    output OLED_SCL,
    inout OLED_SDA
);
    wire dht11_done;
    reg dht11_req;
    wire[7:0] tempH, tempL, humidityH, humidityL;
    // ... 实例化 DHT11 和 OLED_Top 模块
endmodule
IIC_Driver 模块

实现了 IIC 通信的状态机,包含空闲、起始、写数据、读数据、应答、停止等状态。支持分频计数、字节计数及 ACK/NACK 检测。

DHT11 模块

负责采集温湿度数据,包含时序控制、数据解析及校验逻辑。

OLED 相关模块
  • OLED_FontData:存储字模数据。
  • OLED_Init:初始化序列控制。
  • OLED_Refresh:全屏刷新。
  • OLED_ShowData:显示数值。
  • OLED_ShowFont:显示字符。
  • OLED_Top:顶层控制状态机。

以上模块协同工作,实现 FPGA 通过 IIC 协议驱动 OLED 屏幕,并实时显示 DHT11 采集的温湿度数据。

目录

  1. 开发环境
  2. 协议核心概述
  3. 1. 物理层特性
  4. 2. 关键时序状态
  5. 3. 状态机驱动
  6. 4. 时钟分频与时序控制
  7. 基础知识
  8. 1. I2C(IIC)通讯协议
  9. 2. I2C 物理层
  10. 3. I2C 协议层
  11. 4. 数据传输流程
  12. IIC 驱动 7Pin 0.96 寸 OLED 显示屏实例
  13. 1. 硬件修改
  14. 2. OLED 刷新方式
  15. 3. OLED 关键命令介绍
  16. IIC 驱动 4Pin OLED 显示器显示 DHT11 温湿度数据
  17. 1. 字模设计
  18. 2. 程序设计
  19. 顶层模块
  20. IIC_Driver 模块
  21. DHT11 模块
  22. OLED 相关模块
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ffmpeg-python 实现立体声转环绕声音频升级指南
  • SVN 到 Git 平滑迁移:svn2git 工具实践指南
  • 从零构建量化交易系统:通达信 API 与 Python 应用
  • Python vs Java:AI 项目选型对比与实战建议
  • RK3588 Linux 平台 ES8390 替换 ES8388 驱动移植实例
  • 使用 OLLAMA 国内镜像源加速本地大模型部署
  • 深度解析 Qt 与 Python 混合架构:嵌入、交互与工程化实践
  • AMD 显卡运行 ComfyUI-Zluda 配置与优化指南
  • Rust 异步测试与调试实战指南
  • Git 安装流程与基础使用指南
  • B 站直播弹幕场控机器人使用指南
  • 前端转型实战:7 天用 Electron 开发跨平台桌面应用
  • Fooocus 文生图工具快速入门与使用指南
  • AI 小说生成器:基于大语言模型的长篇小说创作工具
  • 操作系统智能助手 OS Copilot 新功能测评
  • ESP32-C6物联网开发实战:基于Wi-Fi 6与BLE 5.2的智能家居节点设计
  • NVIDIA Jetson Orin Nano 8GB 开发套件评测:性能与 AI 应用分析
  • OpenClaw 在 Linux 下的安装、初始化与 Web UI 配置指南
  • CameraLink 图像输出与采集时序详解(FPGA 开发)
  • C++ 实现 LLaMA-3 推理加速:量化、算子融合与内存池优化

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online