如何节省GPIO
我们都知道,LCD的 8080 16-bit 接口一般需要20个IO来进行通信,如下:
DB0 ~ DB15 | 8080数据总线 |
RS | 8080寄存器选择信号 |
WR | 8080写入信号 |
CS | 8080片选信号 |
RD | 8080读取信号 |
我们的树莓派Pico上只有30个GPIO,基本上所有的GPIO都拿来驱动LCD了,那么如何节省GPIO呢?
这时候聪明的你可能想到了,8080的 CS 和 RD 接口一般用不到,直接拉低CS, 拉高RD就好了,这适用于绝大多数的8080接口LCD, 这样我们就省下了2个GPIO。
你灵光一动,产生疑问,不是还可以使用GPIO拓展芯片吗?确实如此,我们可以使用GPIO拓展芯片来节省GPIO,GPIO拓展芯片有很多,常见的有I2C接口的PCF8574,SPI接口的MAX系列,还有一些逻辑器件例如74系列芯片,从理论上来讲,这些芯片都可用,但是在我们的这个项目中,最大的问题就是速度。
因为GPIO拓展芯片一般受限于传入接口的速度,再加上价格多方面,所以综合考虑下来,74系列的逻辑芯片应该是性价比最高的了。 常见的74系列串转并芯片有很多,例如:
- 74HC595
- 74HC164
- 74HC138
74HC164和74HC138都不支持锁存功能,输入的数据会实时的反应在拓展出的IO上,不适合我们的需求。
问题来了,你能买到的最常见的74HC595应该是几毛钱一片的那种,通过查阅芯片手册可以得知,输入电压越高,74HC595的工作频率越快,在<=25摄氏度时,最小的shift clock时间是10ns, 也就是100MHz。 对于16 bit的8080接口,我们需要级联两片74HC595来使用,也就是说,需要16个clock来准备端口上的数据,等效频率也就降低到了100/16=6.25MHz,然而ILI9488的极限工作频率为50MHz,这相差了好多倍,不过我通过降低PIO的工作频率至6.25MHz,通过肉眼观察,差距并没有想象中的那么大,测试lvgl BenchMARK,平均FPS从50MHz下的147FPS, 降低至90FPS, 说明帧率的瓶颈不在于此,另一方面也说明,这个方案或许可行?
74HC595最少需要使用3个IO来控制输入数据,所以节省了16-3=13个GPIO。 到目前为止15个。 在本项目上,这应该是能削减最多的GPIO数量了,也就是说我们使用5个GPIO就能驱动16-bit 8080接口的LCD,如下:
SLCK | 595移位时钟 |
SRCK | 595锁存时钟 |
DS | 595串行输入 |
WR | 8080写操作信号 |
RS | 8080寄存器选择信号 |
大多数的面板都支持通过跳线切换接口模式,例如SPI/RGB/I80等,我们这款产品使用的面板仅支持 8080 8bit 模式和 16bit模式,我们可以通过将显示面板的R16电阻改到R8上切换为8bit模式。 这样的话又节省掉了一个595芯片。
说明:截止本文完成时,并没有对上述讨论的方案进行测试,所以没有资料和实验结果支持,如果未来有任何关于本文的进展,我们会继续更新。