IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> esp32系列(9):完成一个OLED的驱动 -> 正文阅读

[嵌入式]esp32系列(9):完成一个OLED的驱动

开始写一个OLED驱动,第一步,学ESP32 的 I2C 外设。实现0.96英寸的OLED显示不同的表情。
基本设计:将 128*64 像素的 0.96 英寸 OLED 分成可以独立刷新的 8 行区域,分别表示 额头(占2行)、眼镜(占2行)、鼻子(占1行)、嘴巴(占2行)、下巴(占1行)

在这里插入图片描述

显示效果:
在这里插入图片描述

1 ESP32 的 I2C 资源

I2C (Inter-Integrated Circuit) 总线用于使 ESP32 和多个外部设备进行通信。多个外部设备可以共用一个 I2C 总线。

  • I2C 为两线总线,SDA和SCL线。
  • 漏极开漏输出,所以可以挂载多个外设。
  • 通常1个主机多个从机。

ESP32 有 2 个 I2C 总线接口,根据用户的配置,总线接口可以用作 I2C 主机或从机模式。 I2C 接口支持:

  • 标准模式 (100 Kbit/s)
  • 高速模式 (400 Kbit/s)
  • 速度最高可达 5 MHz,但受制于 SDA 上拉强度
  • 7-bit/10-bit 寻址模式
  • 双寻址模式
    用户可以配置指令寄存器来控制 I2C 接口,从而实现更多灵活的应用。

1.1 ESP32 的 I2C 架构

在这里插入图片描述

1.2 I2C API 使用指南

I2C 驱动程序配置和工作的基本步骤:

  • 1 配置驱动程序 - 设置初始化参数(如主机模式或从机模式,SDA 和 SCL 使用的 GPIO 管脚,时钟速度等)
  • 2 安装驱动程序- 激活一个 I2C 控制器的驱动,该控制器可为主机也可为从机
  • 3 根据是为主机还是从机配置驱动程序,选择合适的项目
    • 主机模式下通信 - 发起通信(主机模式)
    • 从机模式下通信 - 响应主机消息(从机模式)
  • 4 中断处理 - 配置 I2C 中断服务
  • 5 用户自定义配置 - 调整默认的 I2C 通信参数(如时序、位序等)
  • 6 错误处理 - 如何识别和处理驱动程序配置和通信错误
  • 7 删除驱动程序- 在通信结束时释放 I2C 驱动程序所使用的资源

1.3 I2C时序

时序图:

在这里插入图片描述

2 OLED驱动

具体的显示原理见之前写过的FPGA驱动0.96OLED显示原理及FPGA驱动程序

FPGA驱动为了设计简单,每个指令或者数据都已一次完整的I2C数据传输来实现的(即包含起始位、器件地址、控制码、数据和终止位)。

ESP32使用c语言开发,传输的时候可以优化一下,将一个功能的数据放在一次传输中完成,这样可以节省带宽。

OLED 的 I2C 时钟周期最小值为2.5us,即最大支持400KHz的数据率。

在这里插入图片描述

2.1 OLED驱动使用

主要功能:实现OLED刷新不同的表情。

1 需要在“oled_driver.h”中的宏定义中设置相关参数:

#define OLED_I2C_SDA_IO 22          //I2C SDA GPIO Number   
#define OLED_I2C_SCL_IO 23          //I2C SCL GPIO Number    
#define OLED_I2C_POER_NUM 1         //OLED 使用的 I2C 驱动号
#define OLED_I2C_FREQ 400000        //OLED 对应 I2C 时钟  
#define OLED_ADDR 0x3c              //OLED I2C 器件地址    

2 在函数中调用 oled_init() 进行OLED的初始化。

3 调用其他 api 实现相关功能。

2.1 主要api

2.1.1 esp_err_t oled_init();

  • 功能:
    初始化OLED。
  • 实现原理:
    根据乐鑫的I2C驱动使用指南,对控制OLED的I2C外设进行初始化,配置为master模式、SDA和SCL线都上拉、I2C频率为400KHz。
  • 注意:
    需要在“oled_driver.h” 宏定义中设置相关参数
  • 返回:
    • 1: i2c参数配置 i2c_param_config() 失败。
    • 2: i2c驱动安装 i2c_driver_install() 失败。
    • 3: oled 初始化配置 i2c_master_write_slave() 失败。
    • 0/ESP_OK: oled初始化成功
  • 参数:

2.1.2 esp_err_t oled_set_start_address(uint8_t page_addr, uint16_t ram_addr);

  • 功能:
    设置显存刷新的起始地址,包括页地址和ram地址。
  • 实现原理:
    将设置需要刷新显存的起始地址的控制字发送给OLED。
  • 注意:
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • page_addr:页地址
    • ram_addr:此页内的ram地址

2.1.3 esp_err_t oled_page_refresh(uint8_t page_addr, uint8_t *buf);

  • 功能:
    刷新一个page的显存
  • 实现原理:
    设置好需要更新的page的起始地址后,将图像数据发送给oled。
  • 注意:
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • page_addr:页地址
    • buf, 图像数据

2.1.4 esp_err_t oled_gddram_refresh(uint8_t *buf);

  • 功能:
    刷新整个显存 Graphic Display Data RAM (GDDRAM)
  • 实现原理:
    刷新所有page。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • buf, 图像数据

2.1.5 esp_err_t oled_forehead_refresh(forehead_t forehead_expr, uint8_t frame_cnt);

  • 功能:
    刷新额头范围(第1,2行)显存
  • 实现原理:
    刷新 page0 和 page1。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • forehead_expr:额头的表情索引
    • frame_cnt:刷新当前表情的帧索引

2.1.6 esp_err_t oled_eyes_refresh(eyes_t eyes_expr, uint8_t frame_cnt);

  • 功能:
    刷新眼睛范围(第3,4行)显存
  • 实现原理:
    刷新 page2 和 page3。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • eyes_expr:眼睛的表情索引
    • frame_cnt:刷新当前表情的帧索引

2.1.7 esp_err_t oled_nose_refresh(nose_t nose_expr, uint8_t frame_cnt);

  • 功能:
    刷新鼻子范围(第5行)显存
  • 实现原理:
    刷新 page4。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • nose_expr:鼻子的表情索引
    • frame_cnt:刷新当前表情的帧索引

2.1.8 esp_err_t oled_mouth_refresh(mouth_t mouth_expr, uint8_t frame_cnt);

  • 功能:
    刷新嘴巴范围(第6、7行)显存
  • 实现原理:
    刷新 page5 和 page6。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • mouth_expr:嘴巴的表情索引
    • frame_cnt:刷新当前表情的帧索引

2.1.9 esp_err_t oled_chin_refresh(chin_t chin_expr, uint8_t frame_cnt);

  • 功能:
    刷新下巴范围(第8行)显存
  • 实现原理:
    刷新 page7。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • mouth_expr:下巴的表情索引
    • frame_cnt:刷新当前表情的帧索引

2.1.10 esp_err_t oled_refresh_expression(expression_t expression);

  • 功能:
    刷新整个表情
  • 实现原理:
    逐个刷新各部位。
  • 返回:
    • 0/ESP_OK: 成功
    • 其他:失败
  • 参数:
    • mouth_expr:下巴的表情索引
    • frame_cnt:刷新当前表情的帧索引

4 代码

https://github.com/luming-xyz/ESP32_IDF-oled_driver

或者有积分的可以支持一下 😃

https://download.csdn.net/download/lum250/84540080

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:43:47  更:2022-03-12 17:44:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:54:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码