多块 8x8 LED Matrix 的级连方法#

电路连接图#

这是 SPI 菊花链式的连接方法,能够在不增加 CS 连的情况下,同时连接多个 SPI 从设备。

wiring generic max7219 led display module with arduino

工作时序#

为了让叙述更简洁,先从2块级连屏开始。如何将两块屏的不同的控制字分别发送到不同的 SPI 从设备?其工作注程为:

  1. CS拉低;

  2. 发送第1块屏的16 bit 控制字;

  3. 发送第2块屏的16 bit 控制字;

  4. CS拉高

对应的时序图为:

image-20230609085209711

附: WaveDrom 绘图原代码 [1]

{signal: [
  {name: 'CLK', wave: 'p.................................'},
  {name: 'CS', wave:  '10...............................1'},
  {name: 'DIN', wave: 'z=.......=.......=.......=.......z', data:"BLK1-addr BLK1-data BLK2-addr BLK2-data"}
]}

分析说明

控制一个LED 矩阵需要 16 bit [2],控制两个LED 矩阵需要 32 bit。需要注意的是,CS 信号在发送32 bit 之前拉低,发送完32bit 后拉高,中间不能拉高。这样,前后各16bit的控制字正好分别到达 BLK1 和 BLK2,此时 CS 拉高,两个控制字各写入自己的 16 bit 控制字,实现了两个不同控制字的写入。

反之,如果每发送16位将CS拉高一次,那么会造成第二个 CS 信号有效时,覆盖上一次发送的控制字。这样的结果是,两个控制字交替控制第一块屏,第2块屏只是第一块屏的 16 bit 延时镜象。

8 块 LED 屏级连#

如果是更多块 LED 屏,方法将和两块屏的级连方法相似。以8块屏为例,发送流程是:

  1. CS拉低;

  2. 发送第1块屏的16 bit 控制字;

  3. 发送第2块屏的16 bit 控制字;

  4. 发送第3块屏的16 bit 控制字;

  5. 发送第4块屏的16 bit 控制字;

  6. 发送第5块屏的16 bit 控制字;

  7. 发送第6块屏的16 bit 控制字;

  8. 发送第7块屏的16 bit 控制字;

  9. 发送第8块屏的16 bit 控制字;

  10. CS拉高

屏幕连接与显示顺序#

此图是第1幅图逆时针旋转 90 度之后的结果,并用 1,2,3,4标注了每块屏的序号。在这种连接顺序下,顺序发出内容分别为 1,2,3,4 的控制字,那么它们将正好分别按图中标注的顺序显示,即第1块屏显示数字1,最后1块屏显示数字4。

这是因为,屏幕 1 离 Arduino 最远(中间间隔了3块屏),同时内容 1 也最先发出。当顺序发完内容分别为 1,2,3,4 的控制字后,控制字1正好通过多次移位 (比第1块屏多移3块屏的距离) 到达了屏幕1,控制字2正好到达了屏幕2,控制字3正好到达了屏幕3,最后发送的控制字4刚好到达了屏幕4,达到了一一对应的效果。于是,如果在连接上按照这个顺序,那么程序代码中发送的第1块内容就会显示在最左边的第1块屏,与人的阅读习惯一致,不用再在代码中费力调整顺序,更加方便。这也就解释了市面上已合并在一起的屏幕为什么者是“数据入口(DIN)在右边,出口(DOUT)在左边”这种设计。

Wiring-Generic-MAX7219-LED-Display-Module-with-Arduino-2

讨论#

菊链虽然比较节省连接线的数量,但是却会有较大的数量延迟。例如,对于8块 Dot Led Matrix,更新屏幕显式内容时,要发送的控制字的长度为 16 字节,远高于单独控一个屏时的发送长度。

当只需要更新指定屏幕的显示内容时,使用 No-op 控制字。

如何先程序能够通用于1块、2块、4块、8块屏需要一些技巧。同时可能还要考虑到种种不同的屏幕的连接顺序,以及字模的方向是如休定义的。