通过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",但硬件至少同样无情。在连接外部硬件设备时,您必须阅读并遵循数据表。
我正在使用 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",但硬件至少同样无情。在连接外部硬件设备时,您必须阅读并遵循数据表。