多块 8x8 LED Matrix 的级连方法#
电路连接图#
这是 SPI 菊花链式的连接方法,能够在不增加 CS 连的情况下,同时连接多个 SPI 从设备。
工作时序#
为了让叙述更简洁,先从2块级连屏开始。如何将两块屏的不同的控制字分别发送到不同的 SPI 从设备?其工作注程为:
CS拉低;
发送第1块屏的16 bit 控制字;
发送第2块屏的16 bit 控制字;
CS拉高
对应的时序图为:
附: 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块屏为例,发送流程是:
CS拉低;
发送第1块屏的16 bit 控制字;
发送第2块屏的16 bit 控制字;
发送第3块屏的16 bit 控制字;
发送第4块屏的16 bit 控制字;
发送第5块屏的16 bit 控制字;
发送第6块屏的16 bit 控制字;
发送第7块屏的16 bit 控制字;
发送第8块屏的16 bit 控制字;
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)在左边”这种设计。
讨论#
菊链虽然比较节省连接线的数量,但是却会有较大的数量延迟。例如,对于8块 Dot Led Matrix,更新屏幕显式内容时,要发送的控制字的长度为 16 字节,远高于单独控一个屏时的发送长度。
当只需要更新指定屏幕的显示内容时,使用 No-op 控制字。
如何先程序能够通用于1块、2块、4块、8块屏需要一些技巧。同时可能还要考虑到种种不同的屏幕的连接顺序,以及字模的方向是如休定义的。