基于SPI的MAX7221与MCU连接
0 引 言 在仪器仪表的设计制作中常要用到数码管显示,有时数码管的数量还会很多。如果为每个数码管都单独设计驱动电路,一方面对MCU来说是一个不小的负担,另一方面大幅增加了电路板的面积成本。集成电路MAX7221单片可以驱动8位数码管,并且可以进行级联扩展,对于这个问题是一个较为妥善的解决方案。一般MAX7221与MCU的连接使用两种方法:一是使用MCU的I/O口直接模拟通信所需要的时序,此法操作较为繁琐,易出错;二是使用UART串行口,这种方法的通信速率最高仅为11.52 Kb/s。介绍第三种方法,即MAX7221通过串行外设接口(Serial PeripheralInteRFace,SPI)与MCU连接,此法具有简单和易于使用的特点,其通信速率理论上高达10 Mb/s。
1 SPI原理 SPI是一种高速、全双工、同步串行通信接口。MCU通过它可以方便地连接到存储器、A/D转换器、D/A转换器、实时时钟日历、LCD驱动器、传感器、音频芯片,甚至另一个MCU。由于SPI的成本低,实用性强,很多新推出的芯片都增加了对它的支持。 SPI以主从方式工作,这种模式通常有一个主机和一个或多个从机,使用4根信号线:主机输出/从机输入(MOSI)、主机输入/主机输出(MISO)、串行时钟SCLK和外设片选(SS)。典型的点对点SPI通信连接如图1所示。
SPI与UART的一个重要的区别就是它是一个同步通信协议。主机中有一个时钟发生器,可以在SCLK引脚上产生时钟信号,所有的数据传输都按照这个同步时钟来进行。主机和从机各有两个移位寄存器分布在各自MOSI及MISO引脚,具体的传输过程就是由这几个移位寄存器来完成的。以SS低电平有效为例,平时,主机维持SS为高电平,SCLK无信号;进行传输时,主机首先将SS引脚拉低作为从机的片选信号,然后在SCLK引脚上产生同步时钟,需要发送或接收的数据就按照这个时钟进入相应的移位寄存器。主机的数据从主机的MOSI引脚移出,移入到从机的MISO引脚;从机的数据从从机的MOSI引脚移出,移人到主机的MI-SO引脚;传输结束后,主机将SS拉高。有多个从机时,主机的SS信号可以与从机的片选逻辑进行组合,没有被选中的从机将不会参与SPI传输。
2 器件介绍 2.1 MAX7221 MAX7221是一款串行接口的数码管显示驱动器,单片最多可驱动8位数码管。它包含有七段译码器、位和段驱动器、多路扫描器、段驱动电流调节器、亮度脉宽调节器及多个特殊功能寄存器。MAX7221不仅可以很方便地与MCU相连接,还可通过级联进行扩展。它的主要功能特点有: (1)10 MHz的串行接口; (2)BCD译码/非译码模式选择; (3)耗电仅150 μA的关断模式; (4)数字和模拟双重亮度控制; (5)SPI,QSPI,Microwire等多种串行接口。 2.2 MCU 考虑了实用性、性能价格比等多种因素,实验MCU选用ATmega128,它是一种基于AVR RISC结构的8位低功耗CMOS微处理器,最高工作频率为16 MHz。它采用了先进的指令集,绝大多数指令均为单周期指令,自带128 KB的FLASH,可以通过SPI,JTAG、引导程序等多种方式多次编程,支持系统编程及调试。ATmega128的SPI接口最高工作频率为主频的50%,可达8 MHz(与MAX7221SPI口的速率上限相当)。该接口的工作方式(主/从)、时钟极性、时钟沿及工作频率均可灵活配置。
3 硬件连接 图2所示为4片级联MAX7221通过SPI与ATmega128连接的电路图。该系统最多可以驱动32位数码管。由于数据是单向传输,因此将ATmega128配置为主机,MAX7221配置为从机,可以省略从机向主机传输数据的线路。在这种级联连接方式中,所有MAX7221的CS都连接在一起,其片选是通过在要传输的数据前增加空操作指令来实现的。
例如,要向第二级的MAX7221传输数据,应当在时序到来之后首先传输一个空操作指令(0X0000),然后再传输数据。要向第三级的MAX7221传输数据时,要先传输两个空操作指令,以此类推。值得一提的是,如果要用这种级联方式设计个数不是8的整数倍的数码管显示驱动器,必须要为各个MAX7221分配平均的扫描位数。 例如,如果需要12位数码管显示,那么采用两级级联驱动,每个MAX7221驱动6个数码管;如果需要11位数码管显示,那么一级驱动6个,一级驱动5个,但扫描限位仍然都设定为6,只将其中一个空接。这么做是因为MAX7221对8位数码管的扫描能力是一定的,在相同亮度的等级下需要进行扫描的数码管个数越多,数码管看上去就越暗。如果各级MAX7221设定的扫描限位不一致,尽管设定了相同的亮度等级,实际显示的亮度也会有所差别。
4 软件设计 图3是MAX7221的SPI传输时序图。
根据MAX7221的SPI时序图及寄存器地址表,可以编制出相应的ATmega128 SPI子程序。SPI_init()用于初始化ATmega128的SPI口,设定时钟极性和频率等参数;SPI_transmit()用于在时序到来时连续传输16位数据;MAX7221_transmit()用于总体完成从CS被拉低到数据传输结束的全过程,并将级联情况也考虑了进去。
需要注意的一点是MAX7221一上电就进入到关断模式,所驱动的数码管无任何显示,必须首先退出该模式进入到正常工作模式。相应的子程序如下:
5 实 验 实验中使用上述级联系统的软硬件进行了32位数码管循环显示测试,结果正常。此外,还利用AT-mega128自带的定时器对第一级的MAX7221进行速率测试,流程如图4所示。一共进行20次测试,最终定时器的平均读数为1 430 ms。据此可计算出数据传输的速率
该速率未能达到理论上的8 Mb/s,其原因是进入和退出函数、循环以及对SS的拉低和置高都耗费了MCU的有效时间。可以推断,提高在MCU的频率时MAX7221的SPI传输速率还可进一步提高。
6 结 语 实验证明,MAX7221仅需3线即可通过SPI与MCU连接。这种SPI通信法不但通信速率高,还可用于级联的MAX7221系统,以驱动更多的数码管。
|