[学习资料] SSD1306使用I2C,支持读取显存吗

[复制链接]
1979|12
 楼主| 734774645 发表于 2025-2-24 11:43 | 显示全部楼层 |阅读模式
SSD1306 是一款常用的 OLED 显示驱动芯片,通常通过 I2C 或 SPI 接口与单片机通信。关于 SSD1306 是否支持通过 I2C 读取显存,以下是详细解答:

SSD1306 的显存读取支持
SSD1306 的显存结构:

SSD1306 内部有一个 GDDRAM(Graphic Display Data RAM),用于存储显示内容。

GDDRAM 的大小通常为 128x64 位(对于 128x64 分辨率的屏幕)或 128x32 位(对于 128x32 分辨率的屏幕)。

I2C 通信模式:

SSD1306 的 I2C 接口主要用于 写入数据(如命令和显存数据)。

根据 SSD1306 的数据手册,I2C 模式不支持直接读取显存。I2C 接口是单向的,只能用于发送数据到 SSD1306,而不能从 SSD1306 读取数据。

SPI 通信模式:

如果使用 SPI 接口,SSD1306 支持通过 READ 命令读取显存数据。

但在 I2C 模式下,没有类似的读取功能。

为什么 I2C 不支持读取显存?
I2C 协议本身是支持双向通信的,但 SSD1306 的 I2C 实现被设计为只接收数据,可能是为了简化硬件设计和降低成本。

如果你需要读取显存,建议使用 SPI 接口,或者通过其他方式(如单片机缓存)来管理显示内容。

替代方案
如果你需要在 I2C 模式下实现类似的功能,可以考虑以下方法:

在单片机中缓存显存数据:

在单片机中维护一个与 SSD1306 显存相同的缓冲区。

每次更新显示时,先将数据写入缓冲区,然后再通过 I2C 将整个缓冲区发送到 SSD1306。

使用 SPI 接口:

如果你的硬件设计允许,可以改用 SPI 接口连接 SSD1306。

SPI 接口支持读取显存数据。

部分更新显存:

如果你只需要更新部分显示内容,可以通过设置 SSD1306 的页地址和列地址,只更新特定区域的显存。

 楼主| 734774645 发表于 2025-2-24 11:44 | 显示全部楼层
SSD1306 I2C 写入显存示例
以下是一个简单的示例,展示如何通过 I2C 向 SSD1306 写入显存数据:
  1. #include <avr/io.h>
  2. #include <util/delay.h>

  3. #define SSD1306_I2C_ADDRESS 0x3C  // SSD1306 的 I2C 地址

  4. void I2C_Init() {
  5.     // 初始化 I2C(根据你的单片机配置)
  6.     TWSR = 0x00;  // 预分频器 = 1
  7.     TWBR = 0x48;  // 设置比特率
  8.     TWCR = (1 << TWEN);  // 使能 I2C
  9. }

  10. void I2C_Start() {
  11.     TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
  12.     while (!(TWCR & (1 << TWINT)));
  13. }

  14. void I2C_Stop() {
  15.     TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
  16. }

  17. void I2C_Write(uint8_t data) {
  18.     TWDR = data;
  19.     TWCR = (1 << TWINT) | (1 << TWEN);
  20.     while (!(TWCR & (1 << TWINT)));
  21. }

  22. void SSD1306_Command(uint8_t cmd) {
  23.     I2C_Start();
  24.     I2C_Write(SSD1306_I2C_ADDRESS << 1);  // 发送设备地址(写模式)
  25.     I2C_Write(0x00);  // 控制字节:命令
  26.     I2C_Write(cmd);   // 发送命令
  27.     I2C_Stop();
  28. }

  29. void SSD1306_Data(uint8_t data) {
  30.     I2C_Start();
  31.     I2C_Write(SSD1306_I2C_ADDRESS << 1);  // 发送设备地址(写模式)
  32.     I2C_Write(0x40);  // 控制字节:数据
  33.     I2C_Write(data);  // 发送数据
  34.     I2C_Stop();
  35. }

  36. void SSD1306_Init() {
  37.     // 初始化 SSD1306
  38.     SSD1306_Command(0xAE);  // 关闭显示
  39.     SSD1306_Command(0xD5);  // 设置显示时钟分频
  40.     SSD1306_Command(0x80);
  41.     SSD1306_Command(0xA8);  // 设置多路复用率
  42.     SSD1306_Command(0x3F);
  43.     SSD1306_Command(0xD3);  // 设置显示偏移
  44.     SSD1306_Command(0x00);
  45.     SSD1306_Command(0x40);  // 设置显示起始行
  46.     SSD1306_Command(0x8D);  // 电荷泵设置
  47.     SSD1306_Command(0x14);
  48.     SSD1306_Command(0x20);  // 内存地址模式
  49.     SSD1306_Command(0x00);
  50.     SSD1306_Command(0xA1);  // 段重映射
  51.     SSD1306_Command(0xC8);  // COM 输出扫描方向
  52.     SSD1306_Command(0xDA);  // COM 引脚硬件配置
  53.     SSD1306_Command(0x12);
  54.     SSD1306_Command(0x81);  // 对比度控制
  55.     SSD1306_Command(0xCF);
  56.     SSD1306_Command(0xD9);  // 预充电周期
  57.     SSD1306_Command(0xF1);
  58.     SSD1306_Command(0xDB);  // VCOMH 电压
  59.     SSD1306_Command(0x40);
  60.     SSD1306_Command(0xA4);  // 显示内容从 RAM 中读取
  61.     SSD1306_Command(0xA6);  // 正常显示
  62.     SSD1306_Command(0xAF);  // 打开显示
  63. }

  64. int main(void) {
  65.     I2C_Init();
  66.     SSD1306_Init();

  67.     // 写入显存数据
  68.     for (uint8_t i = 0; i < 128; i++) {
  69.         SSD1306_Data(0xFF);  // 点亮所有像素
  70.     }

  71.     while (1) {
  72.         // 主循环
  73.     }
  74. }
SSD1306 在 I2C 模式下不支持读取显存。

如果需要读取显存,建议使用 SPI 接口,或者在单片机中维护一个显存缓冲区。

 楼主| 734774645 发表于 2025-2-24 11:45 | 显示全部楼层
如果选择I2C接口,需要在单片机内创建缓存,方便绘制更加复杂的图像。因此需要选择内存大的单片机
guijial511 发表于 2025-2-24 20:33 来自手机 | 显示全部楼层
只要显示控制器支持就可以的
捉虫天师 发表于 2025-2-25 14:32 | 显示全部楼层
SPI接口的也不支持吧,难道有MISO?
小灵通2018 发表于 2025-2-25 15:02 | 显示全部楼层
这个只看到过写数据,没看到过读取。
jiekou001 发表于 2025-2-26 15:18 | 显示全部楼层
U8G2好像就可以驱动这个,就需要一定的缓存
wanduzi 发表于 2025-2-26 19:00 | 显示全部楼层
只要是读写操作,然后指令了解。
yiy 发表于 2025-2-27 19:39 | 显示全部楼层
不支持,只看到写操作了。
gouguoccc 发表于 2025-2-27 22:24 来自手机 | 显示全部楼层
SSD1306没有这个功能哦
jiekou001 发表于 2025-2-28 11:13 | 显示全部楼层
这个显示屏性价比很高的,非常适合。
自动化陈稳 发表于 2025-4-27 00:55 | 显示全部楼层
虽然 I2C 协议本身是支持双向通信的,但 SSD1306 的 I2C 实现只被设计为单向的数据传输。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

3588

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部