
SPI优化-电子纸屏墨水屏显示模块-CALE-IDF
https://github.com/martinberlin/cale-idf/wiki/About-SPI-optimization
通常如何在每个GxEPD的电子纸墨水屏模组上完成
独立于Epaper模块,update()方法中发生的情况在某种程度上类似:
调用_wakeup()私有方法。在大多数epaper控制器模型中,在开始时发送一个Power on(0x04 CMD),然后发送一些LUT初始化表(通常为4个42-44字节,每个为SPI CMD+DATA)
发送一个命令,表示我们开始发送缓冲区(CMD 0x13)。像素缓冲区被发送{0到sizeof(_buffer)的末尾}。它从生成的GFX_buffer逐字节读取,并使用IO.data(字节)发送
调用一个命令,通知我们的显示从属设备需要刷新(通常为0x012)
刷新发生,新像素在epaper中呈现
IO.data(byte) turns the CS Gpio Low-> transmits -> CS high again
Good display epaper IC drivers
显著的SPI优化效果
当数据被过度设计时,在发送的每个字节上切换芯片选择。即使每次传输后需要几纳秒才能将GPIO调低或调高,当我们为一个大的epper发送一个完整的缓冲区时,这将极大地影响性能。很明显,这不是一种有效的方法。
例如,Wave12I48显示器具有1304*984像素。所以总的来说,它们是128.3万像素。测量我们通过SPI通过CS引脚发送的字节数很简单:
1283136/8 = 160392 bytes
因此,我们正在切换CS GPIO 16万次,低->传输->高,以发送像素缓冲区。这需要一些优化,对吧?
与其这样做,我们可以使用另一个数据函数:
EpdSpi::data(const uint8_t *data, int len) {}
只需通过SPI发送一条完整的线路,切换CS引脚,每Y行只发送一次。这可以在单个SPI从显示器上完成。但在Wave12I48中,将整条线发送到每个epper比按字节发送要高效得多。根据SPI文件,在每次数据传输中,每个SPI最多可以发送4Kb的数据。这表明它可能还有进一步优化的空间。
因为我们在这个epaper中有一个复杂的网格结构,所以对于4个网格中的每个epaper控制器,它足以将Gpio CS切换减少至少80次(80*8640),每个显示器发送一条完整的X线。但对于其他单个SPI显示器,我们打算尽可能优化它,使其达到SPI限制,前提是它仍然是一个稳定的实现。
在编程界,有一句话说“过早优化是万恶之源”。但这并不为时过早,这是明显的优化。特别是在缓冲区较小的较小epaper中进行过多的优化不会产生明显的差异,但在这种较大的epaper上,这是可以做到的。因此,它将被应用于所有可行的新模型类。
关于SPI优化的其他有趣阅读
Official ESP-IDF documentation
https://github.com/krzychb/esp-epaper-29-ws
扫二维码用手机看

2023-05-31

2023-04-11

2023-04-03

地址:辽宁省大连市甘井子区中华西路18号 邮编:116033
©2021 大连点墨电子科技有限公司版权所有