通过I2C将数据写入SSD1306

时间:2017-06-18 06:16:11

标签: arduino avr led

我正在使用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字节?

2 个答案:

答案 0 :(得分:1)

我见过的大多数I2C库,包括Aruduino的源代码,以这种方式对数据进行分块。虽然I2C标准不要求这样做,但正如其他海报所提到的,可能存在缓冲因素。此处的.stop()命令可能会指示设备处理刚刚发送的16个字节并准备更多。

总是,您需要阅读设备的数据表,并了解其预期才能正常显示。他们在软件中说“RTFM”,但硬件至少是无情的。在与外部硬件设备连接时,您必须阅读并遵循数据表。

答案 1 :(得分:0)

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

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