在设计应在彩色 LCD 上显示简单图形的基于 ARM 的设备时,如何最好地设计允许快速更新的东西,最好不要与特定的 ARM 或 LCD 供应商绑定?我当前的项目使用黑白显示器,可以通过 PIC 上的 SPI 端口快速驱动(在 1/60 秒内重新绘制复杂的显示器)。普通的彩色 LCD 显示器似乎有一个 SPI 端口,但即使用纯色填充 160x120 LCD 也需要 30 毫秒,而 320x240 的最佳情况下需要 120 毫秒(10MHz 移位时钟)。
如果可以节省控制器引脚,并行模式可能会更好,但我不知道有任何与家庭无关的方法来连接并行接口,而不需要为每个像素提供三个单独的内存存储指令(一个用于设置数据,一个将时钟输出设置为高电平,一个将其时钟设置为低电平)。一些 ARM 芯片具有内存总线接口,但这些芯片通常想做多路复用地址和数据之类的事情,或者使用很多引脚来输出不相关的地址位(LCD 只需要一个地址位)。
看看 ILITEK 的 ILI9320 或 Renesas 的 HD66789,一种看起来很有趣的方法是使用 CPLD 将 SPI 转换为并行数据,并包括一种每比特输出一个像素的模式。查看 Renesas 数据表,通过使所有并行端口数据位跟踪串行数据引脚,对除像素以外的所有内容使用串行模式,可能以最少的硬件(不需要 CPLD)获得每比特像素写入写入,并使用比较/掩码函数,以便全零像素透明且全一像素设置 GRAM 中的选定位,或者全一像素透明且全零像素清除选定位。IKITEK 数据表的“功能”部分表明它具有类似的功能,但寄存器映射没有
假设代码将主要显示纯色文本和图形,理想的方法似乎是使用 CPLD 将 ARM 的 SPI 端口连接到显示器的并行端口,并允许 CPLD 加载前景色/背景色。如果有一种写“透明”像素的方法,这将特别好。给定一种字体作为双色位图,可以简单地将字体数据直接加载到 SPI 端口;这将允许以每两个 ARM 时钟一个像素的速率显示字体数据。另一方面,一个足以处理这种显示控制任务的 CPLD 将花费大约 2 美元。
如果目标主要是显示纯色文本或简单(例如 16 色或 64 色)图形,那么将 ARM 与彩色 LCD 接口的最佳方式是什么?
编辑
我已经完成了许多 LCD 显示项目,包括多种类型的 LCD,包括字符模式 LCD、使用我自己的驱动方法的自定义 3:1 多路复用段、带有内置控制器的黑白图形 LCD 和黑白- 我设计了自己的基于 CPLD 的控制器来与微控制器的通用 DMA 接口(甚至提供四级灰度)的白色 LCD。我为自己制作活泼的显示器而感到自豪。其中一个图形控制器有点像狗,即使在写入常量数据时,全屏刷新也需要大约 1/10 秒,但我的大多数显示器甚至可以在 1/50 秒内渲染相当复杂的图像。
我做的许多项目都是电池供电的,所以电流消耗是一个问题。我使用的基于 DMA 的显示控制器运行良好,但它是用于线路供电的项目。我相信从图形 LCD 获得合理电流消耗的唯一方法是使用结合了显示缓冲区和列驱动器的控制器。即使在单个每像素位的显示器上,每帧在芯片之间发送大量显示也会浪费大量能量;在每像素十六位的彩色显示器上,情况会更糟。
我才刚刚开始查看彩色 LCD 数据表;许多显示器似乎使用类似于 ILITEK ILI9320 的控制器,尽管我找到的基于该通用设计的控制器的所有数据表都已标记为“初步”。有些像 ILITEK 一样声称具有屏蔽和透明功能,但没有列出任何寄存器;我不知道真正的芯片是否具有这些功能,但“初步”数据表忽略了它们,或者它们是否省略了这些功能但忘记提及它们。如果实际上所有这些芯片都具有透明特性,那么为它们设计似乎是合理的;如果不是,不是。
我希望对于大多数项目而言,典型的屏幕将由任意放置的文本和中等数量的任意大小的纯色字体组成。字体最有可能存储为每像素位数据。使用 Cortex-M3,如果我想用并行数据编写显示,那么编写两个像素的代码“内循环”可能最终会是这样的:
滚 r0,r0,#2 ; 在 C 中获取一位,在 N 中获取另一位 国际贸易中心 strhcs r1,[r3,#DATA_OFS] ; 写入数据 strhcc r2,[r3,#DATA_OFS] ; 写入数据 strb r4,[r3,#CLOCK_SET_OFS] ; 设置时钟高 strb r4,[r3,#CLOCK_CLR_OFS] ; 将时钟设置为低 伊米 strhmi r1,[r3,#DATA_OFS] ; 写入数据 strhpl r2,[r3,#DATA_OFS] ; 写入数据 strb r4,[r3,#CLOCK_SET_OFS] ; 设置时钟高 strb r4,[r3,#CLOCK_CLR_OFS] ; 将时钟设置为低
不完全是世界上最快的东西。消除对设置/清除时钟指令的写入会有所帮助。我的猜测是没有很好的独立于架构的方法来消除两个时钟写入,但可能有一种非常常见的方法可以消除一个(例如,许多芯片可能有一个计数器/PWM,可以用来脉冲输出简要地响应单个内存存储操作)。
使用 SPI 端口并添加硬件来为每位一个像素提供时钟将大大加快显示访问速度。如果使用没有掩蔽和透明的显示器,CPLD 必须包括一个地址计数器,并且对于每个像素,要么时钟一个像素数据字,要么为下一个像素的位置设置地址命令(为此它需要一个计数器)。相比之下,如果显示器有遮蔽和透明度,我需要做的就是让 CPLD 支持一种模式,在它以 16 位计时后,每个额外的位都会将一个数据字输出到显示器,并带有LSB 跟踪 SDI 引脚(甚至可能不需要使用 CPLD——只需几个普通逻辑芯片)。我会将透明度颜色设置为我想写的颜色,但 LSB 翻转了。
我不想想出一个依赖遮罩和透明度的漂亮设计,然后发现唯一具有此类功能的显示器有 30 周的交货时间。另一方面,如果这样的显示器易于并且仍然可以从许多供应商处广泛使用,我不想让对可用性的偏执驱使我使用劣质设计。