通过I2C向SSD1306写入数据

Write data to SSD1306 via I2C

我正在使用 SSD1306 OLED,对此有疑问。

通过I2C向其缓冲区写入数据时,有些库每次写入16个字节。

例如:

void SSD1306::sendFramebuffer(const uint8_t *buffer) {
  // Set Column Address (0x00 - 0x7F)
  sendCommand(SSD1306_COLUMNADDR);
  sendCommand(0x00);
  sendCommand(0x7F);
  // Set Page Address (0x00 - 0x07)
  sendCommand(SSD1306_PAGEADDR);
  sendCommand(0x00);
  sendCommand(0x07);
  for (uint16_t i = 0;i < SSD1306_BUFFERSIZE;) {
    i2c.start();
    i2c.write(0x40);
    for (uint8_t j = 0;j < 16; ++j, ++i) {
      i2c.write(buffer[i]);
    }
    i2c.stop();
  }
}

他们为什么不直接写1024字节?

当接收设备没有足够的缓冲区 space 或者速度不够快,无法以全速率消化数据时,将数据分割成更多的帧会有所帮助。 START/STOP 方法可能会给接收设备一些时间来处理接收到的数据。在您的特定情况下,16 字节的块似乎正好是显示的一行。

分段传输的其他原因是多主机操作,但这里似乎不是这种情况。

我见过的大多数 I2C 库的源代码,包括 Aruduino 的源代码,都以这种方式对数据进行分块。虽然 I2C 标准不需要这个,但正如其他张贴者提到的那样,可能需要考虑缓冲区。此处的 .stop() 命令可能会向设备发出信号以处理刚刚发送的 16 个字节并准备更多。

无一例外地,您需要阅读设备的数据表 并了解它需要什么才能正确显示。他们在软件上说 "RTFM",但硬件至少同样无情。在连接外部硬件设备时,您必须阅读并遵循数据表。