【发布时间】:2017-06-18 06:16:10
【问题描述】:
我正在使用 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字节呢?
【问题讨论】:
-
不是硬件问题。一些(Arduino)I²C 库只是缓冲您提供给它们的数据,直到您结束传输。为了避免过度使用缓冲区,发送较小的块可能是有意义的。
-
mmmmar,感谢您接受我的回答。如果您也按向上箭头来投票,您的操作将使其他人更容易找到此答案。
-
LCD 本身对 I2C 传输没有限制(限制是在 ARDUINO 端的 SW I2C 实现)您可以一次复制整个 VRAM ...但是它具有与 ARDUINO SW I2C lib 相同的硬件错误(每个数据包发送一次 ACK 信号,而不是每个字节一次)LCD 无法使用正确的硬件/软件 I2C 实现。必须自己做才能解决 AVR32 上的这个问题(花了我几周时间来分析发生了什么)而且它没有用于重置 VRAM 地址指针的命令,使其在长期使用中不可靠,因为任何传输损坏都会将图像转移到 VCC电源开/关。