如何节省GPIO

我们都知道,LCD的 8080 16-bit 接口一般需要20个IO来进行通信,如下:

DB0 ~ DB158080数据总线
RS8080寄存器选择信号
WR8080写入信号
CS8080片选信号
RD8080读取信号

我们的树莓派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,如下:

SLCK595移位时钟
SRCK595锁存时钟
DS595串行输入
WR8080写操作信号
RS8080寄存器选择信号

大多数的面板都支持通过跳线切换接口模式,例如SPI/RGB/I80等,我们这款产品使用的面板仅支持 8080 8bit 模式和 16bit模式,我们可以通过将显示面板的R16电阻改到R8上切换为8bit模式。 这样的话又节省掉了一个595芯片。

说明:截止本文完成时,并没有对上述讨论的方案进行测试,所以没有资料和实验结果支持,如果未来有任何关于本文的进展,我们会继续更新。