应用笔记 4397

MAX6960大LED显示屏编程指南

By: Walter Chen

摘要 : 本文介绍了如何级联配置多个8 x 8点阵LED驱动芯片MAX696x,实现大规模LED显示屏或点阵的驱动。该系列驱动器可最多菊链连接256个芯片,构成大规模点阵显示屏的驱动、控制和编程。该应用笔记解释了该系列芯片之间的差别,以及如何利用它们实现多层、多行、多列配置。

器件概要

LED驱动芯片MAX6960无需使用外围电路,通过其8行、16列端口可直接驱动两组单色8 x 8点阵显示模块。每个集电极开路的行端口可以从16个列端口吸取最大40mA的固定电流。8个行端口在时间上可以复用;某一时刻,只有一个行端口吸取电流。因此,从每个列端口吸取的平均电流为5mA。

MAX6960也可以驱动一组双色(红、绿) 8 x 8点阵显示模块。点阵的每个节点都可以独立控制开、关,或支持4级的亮度调节(包括关闭)。所有显示模块的亮度由PWM信号控制,共有256个亮度级。能够将最多256个MAX6960级联在一起,组成一个大规模显示控制系统;而主控制器可通过4线串口(DIN、DOUT、CLK和/CS)对所有显存进行寻址访问。所有级联芯片通过3线串口(ADDCLK、ADDIN和ADDOUT)连接,无需主控制器介入即可完成芯片间级联的自行配置。

该系列的其它LED驱动芯片和MAX6960功能相似。MAX6961只能对点阵中节点进行开、关操作;MAX6962只能驱动单色显示模块;MAX6963可对点阵节点进行开、关操作,只能驱动单色显示模块。

应用示例

图1所示电路采用两片MAX6960驱动4个单色显示模块,LDM-24288NI是由Lumex®公司生产的8 x 8点阵、绿色LED显示模块。4个显示模块(D1、D2、D3和D4)由左到右排列,组成一个8行32列的显示屏。因为U1和U2的RISET0和RISET1均连接到GND,所以,所有列的电流都设置成固定40mA。

U1和U2的4线接口采用并行连接而不是由DIN和DOUT进行串行级联。每个芯片指令都只能选中一个芯片,这是因为上电后通过3线接口配置每个芯片的专有地址。当两个或多个MAX6960级联到一起时,全局命令可同时控制所有MAX6960。所有芯片的4线接口都以并联方式连接。

每个MAX6960都有一个3线接口,所有MAX6960通过这个3线接口级联。通常,会有一个MAX6960被选为主芯片。这个主芯片的地址为0,并为其余MAX6960提供时钟信号。所有MAX6960的ADDCLK引脚连接在一起。只有主芯片的ADDIN引脚连接到V+,其余MAX6960的ADDIN引脚连接到前一芯片的ADDOUT引脚,而芯片地址较前一级联芯片加1。最后一个芯片的ADDOUT引脚悬空。

图1. 多个MAX6960驱动4个单色显示屏
图1. 多个MAX6960驱动4个单色显示屏

上电时,所有MAX6960的0x00驱动器地址寄存器被初始化为全0,ADDOUT引脚被置成逻辑低。因为在没有时钟信号输入时,主芯片的ADDIN引脚为逻辑高电平,所以MAX6960主芯片需要自检测其状态。上电后,主芯片生成时钟信号,并将其ADDOUT引脚置为逻辑高。主芯片其后级联的每一片MAX6960在其ADDIN引脚变成逻辑高之前,会通过计数时钟周期数设置芯片地址,然后将ADDOUT引脚设置成逻辑高。因此,所有MAX6960驱动地址寄存器将在256个ADDCLK时钟周期内完成初始化。

显存地址的配置

每个MAX6960内有64字节显存,显存可以划分为2层或4层。某一时刻,只选中一层驱动芯片端口。这种多层结构使用户可以在某一层驱动LED时更新其它层;也可在多层之间切换,实现动画功能。

当应用配置为4层时,每层包含16字节;如果每一像素占用1位,那么16列、8行像素将占用128位。应用配置为2层时,每层包含32字节;如果每像素占用2位,那么16列、8行像素将占用256位。一个单色显示模块有8行、8列;一个双色显示模块有8行、16列,因此,一层可支持2个单色显示模块或一个双色显示模块。

显存一次仅支持8位访问。对1位/像素的应用,显存执行写操作的第一个8位数据是写第一列,第二个8位的数据是写第二列,以此类推。因此,一个8 x 8像素的1位/像素的显示模块,需要写入8字节。这就是说,第一个显示模块的第一列地址是0,第一个显示模块的第二列地址是1,第二个显示模块的第一列地址是8,以此类推。当使用多个MAX6960芯片时,所有的显存组合在一起,而显存地址由下式确定:

显存地址 = (驱动器数 - 1) × 16 + (显示模块数 - 1) × 8 + (列数 - 1)

对于2位/像素应用,一个8位显存访问只能更新半个列的显存。如上所述,驱动芯片数在上电后由3线接口自动完成配置并存储在0x00寄存器。其中,有14位用来区分组合显存的哪一个字节。对于1位/像素的应用,开始的2位用来标识哪一层,其余12位用来定位256个MAX6960的2048个列中的哪一列。对于2位/像素应用,开始的1位用来标识哪一层,其余13位用来定位256个MAX6960的4096个半列中的哪一列。

MAX6960的4线接口只能识别8位、16位或24位传输命令,完成寄存器寻址访问。因此,在片选信号/CS有效期间,如果传输数据不是8位、16位或24位格式,数据都将被忽略。

间接访问寄存器的方法

使用8位传输命令间接访问显存时无需显存地址。在每片MAX6960中,都有两个全局显示屏间接地址寄存器(0x09和0x0A)。每个这样的寄存器都能跟踪同一个全局间接显存地址。上电时,这些寄存器地址的初始值都为0。在每个8位间接显存访问完成后,所有MAX6960寄存器值都加1。使用间接访问显存时,每片MAX6960会将这两个间接地址寄存器的值与自己芯片的地址进行比较,以确定显存是否需要更新。

用户也可以用24位传输命令直接访问组合显存中的某一个字节。24位中,第一个位表示写操作(0)还是读操作(1);第二位无意义,可忽略;接下来的14位用来确定是显存中的哪个字节;而最后8位是数据字节。

16位传输命令用来访问MAX6960的16个寄存器。16位中,第一位表示写操作(0)还是读操作(1);第二位用来确定是否激活地址自动增加功能;第三位标识寄存器访问是本地访问(0)还是全局访问(1);第四位始终为0;随后四位确定要访问的是哪个寄存器;最后八位是数据字节。对本地寄存器访问,驱动芯片的地址被存储在全局驱动间接地址寄存器0x08。所有MAX6960的0x08寄存器在上电后默认为0,其值可通过16位传输命令更改。如果设置了第二位,这些0x08寄存器的值可在每个16位传输命令后同时自动增加。

如果上电时默认值不能满足显示屏尺寸、颜色和亮度的要求,所有的MAX6960都需进行初始化。对256个MAX6960,寄存器上电默认状态是单色、1位/像素、全屏显示、50%的面板亮度。

使用间接访问时,一次只能从左列像素至右列像素访问一个显示模块(8 x 8)的显存。然后,从左至右,逐个访问显示模块(8 x 8),直到访问完该行最后一个MAX6960驱动的显示模块为止。依照同样方式,间接访问会从上至下、按照行扫描的顺序访问所有MAX6960驱动芯片。间接方法会先访问整个显示屏的红色显存部分,然后再访问绿色显存部分。地址为0x0E的全局驱动器件寄存器需要首先进行初始化,这样显示屏间接地址计数器才能够自复位至正确值。以上过程如图2图3所示,其中,DAN代表显示模块的访问顺序数。每个显示模块需更新8字节的显存(8 x 8显示点阵对应1位/像素或4 x 8的显示点阵对应2位/像素)。需初始化的全局驱动器件寄存器的总数为系统中MAX6960的总数减去1。

图2. 单色、1位/像素、显存访问序列
图2. 单色、1位/像素、显存访问序列

图3. 双色、1位/像素、显存访问序列
图3. 双色、1位/像素、显存访问序列

同样,如果像素的分辨率是2位,那也需要初始化地址为0x0F的全局驱动行寄存器。这个初始化过程能够确保MAX6960的某一行能够在访问下一行之前被访问,如图4图5所示。需要初始化的全局驱动行寄存器的总数为系统中MAX6960的总数减去1。

图4. 单色、2位/像素、显存访问序列
图4. 单色、2位/像素、显存访问序列

图5. 双色、2位/像素、显存访问序列
图5. 双色、2位/像素、显存访问序列

亮度控制寄存器

MAX6960有16个寄存器,可通过写这些寄存器完成各种操作。这些寄存器包括像素亮度比例(0x01)、面板亮度(0x02)、显示模块0的亮度(0x03)、显示模块1的亮度(0x04)、故障寄存器(0x05)和全局面板配置寄存器(0x0D)。每个亮度控制寄存器包含8位。

初始化全局驱动器件

以下列出了一些16位传输命令,用来初始化图1所示应用电路的全局驱动器件寄存器和全局驱动行寄存器。
0x0E, 0x01, 		// Write to global driver devices register with two total devices.
0x0F, 0x01, 		// Write to global driver rows register with two MAX6960s in a row. 
以下列出的8位和16位传输命令,用来点亮显示屏的边沿。显示屏由4个8 x 8显示模块构成一个8 x 32显示点阵,电路配置如图1所示。
0xFF, 		// Light up the left edge.
0x81, 		// Light up top and bottom pixels of the second column.
0x81, 		// Light up top and bottom pixels of the third column.
...
0x81, 		// Light up top and bottom pixels of the fourteenth column.
0x81, 		// Light up top and bottom pixels of the fifteenth column.
0xFF, 		// Light up the right edge.
0x0D, 0x31, 	// Turn on the shutdown bit.