SPI总线协议与SPI通讯的详细解析
https://baijiahao.baidu.com/s?id=1821826554008001087&wfr=spider&for=pc
串行外设接口(SPI)是一种同步外设接口,它允许单片机通过串行方式与各种外围设备进行数据交换。这些外围设备包括Flash RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线最初由Motorola提出,它是一个全双工三线同步串行外围接口,采用主从模式架构,支持一个或多个Slave设备。该接口最初出现在M68系列单片机中,因其简单实用、性能出色且无专利问题,逐渐成为行业标准,被众多厂家广泛采用。
SPI接口是一种事实上的标准,大多数厂家在设计时都会参照Motorola的SPI接口定义。然而,这也导致了一些微妙的差异可能出现,尤其是在不同厂家的产品之间。因此,在实际应用中,需要仔细阅读每个厂家的文档以确保兼容性。
利用SPI,我们可以构建出多种系统配置。例如,一个主控制器可以与多个从控制器相连,或者多个从控制器相互连接以形成多主机系统(分布式系统)。此外,一个主控制器还可以与一个或多个从I/O设备相连,构成各种不同的系统配置。在大多数情况下,主控制器负责控制数据并向一个或多个从外围器件发送数据。这些从器件仅在接收到主控器的命令时才进行数据的接收或发送,且数据的传输格式遵循高位在前、低位在后的顺序。在单主系统中,只有一台主控制器,其他设备均作为从控制器存在。

SPI系统能够与众多厂家生产的多种标准外围器件无缝连接,这得益于其简洁的接口设计,仅需四条线即可
串行时钟线(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)以及低电平有效的从机选择线(NSS)。这四条线构成了SPI的环形总线结构,其中NSS引脚作为片选引脚,允许主设备单独与特定从设备通信,从而避免数据线上的冲突。
在SPI接口中,数据以串行方式在主设备和从设备之间传输,遵循MSB位在前的顺序。SPI支持主从两种工作方式。在主模式下,主设备提供串行时钟,并通过MOSI引脚发送数据,同时从SPISOMI引脚接收数据。数据发送和接收的过程是同步且连续的,确保了高效的数据交换。
此外,SPI接口还具有出色的灵活性和可扩展性,使得构建多主系统或与多个从I/O设备相连成为可能。这些特点使得SPI成为众多单片机和外围设备之间的理想通信接口。
为了接收数据,串行外设接口在等待网络主控制器送出的SPICLK信号后,将SPISIMO引脚上的数据移入SPIDAT寄存器。若从控制器同时需发送数据,则必须在SPICLK信号起始前,将数据写入SPIRXBUF或SPIDAT寄存器。
主从设备需采用相同的工作模式,即SCLK、CPOL和CPHA,以确保顺畅通信。若存在多个从设备且采用不同工作模式,主设备在读写不同从设备时需调整其模式。
SPI总线协议的特点包括:无明确最大传输速率、无地址方案、无通信应答机制及无流控制规则。只要四根信号线连接无误且SPI模式一致,通过拉低CS/SS信号线即可实现直接通信,支持同时读写数据,一次传输一个字节。
此外,SPI设备需自行实现通信控制,而不关心物理接口的电气特性如信号标准电压。SPI还提供三种工作模式:运行模式、等待模式和停止模式。在等待模式下,通过SPICR2寄存器的SPISWAI位进行控制,可选择低功耗状态或保持运行状态。停止模式则用于进一步降低功耗,但在CPU进入运行模式后,传输会重新开始,确保从机与主机的同步。
SPI通讯的亮点:
SPI在串行通信领域独树一帜,其优势众多。它支持全双工通信,意味着数据可以同时读写,提高效率。此外,SPI还拥有高速的数据传输速率,确保信息能够迅速传递。在软件配置方面,SPI的设计简单易懂,使得数据传输更加灵活,不受限于8位,可根据需求调整为任意大小。同时,其硬件结构也相当简洁,从设备无需唯一地址,从机可利用主机时钟,无需精密时钟振荡器或晶振,进一步简化了设计。
然而,SPI也存在一些不足之处。由于缺乏硬件从机应答信号,主机可能面临无处发送数据的困境。同时,SPI通常仅支持一个主设备,且需要较多的引脚,与I2C相比,这在一定程度上限制了其应用范围。此外,SPI并未定义硬件级别的错误检查协议,可能存在数据传输风险。与RS-232和CAN总线相比,SPI的支持距离也相对较短。
接下来,我们将深入探讨SPI的时序图。
在模式0下,SPI接口输出第一位数据的时刻是关键。需要注意的是,SPI接口有四种不同的数据传输时序,这些时序由CPOL和CPHL两位共同决定。这四种时序在图1中得到了详细展示,同时,时序与CPOL、CPHL的关系也从图中一目了然。
图1展示了SPI的四种不同时序,这些时序由CPOL和CPHA两位共同决定。CPOL主要作用是设定SCK时钟信号在空闲时的电平,当CPOL=0时,空闲电平为低;而CPOL=1时,空闲电平则为高。另一方面,CPHA则决定了采样时刻,若CPHA=0,则在每个周期的第一个时钟沿进行采样;若CPHA=1,则在每个周期的第二个时钟沿进行采样。需要注意的是,我所使用的器件采用的是模式0的时序,即CPOL=0且CPHA=0,因此,在后续的分析中,我将主要关注这一模式下的时序。为了更清晰地展示模式0的时序,我将图1进一步简化为图2。

图2进一步详细展示了模式0下的时序。在SCK的第一个时钟周期中,数据采样发生在时钟的前沿,即上升沿处,而数据输出则是在时钟的后沿,也就是下降沿处进行。让我们聚焦于主器件,其输出口MOSI在SCK信号有效之前就已开始输出数据bit1,实际上,它比SCK的上升沿还要提前半个时钟周期。值得注意的是,bit1的输出与SSEL信号的时机无关。同样地,从器件在主器件采样其输出bit1的同时,也在SSEL信号有效后立即开始输出bit1,尽管此时SCK信号尚未起效。这些关于主器件和从器件输出bit1位的精确时刻的细节,可以通过图3和图4得到进一步的确认。
图3展示了CS信号有效后(即CS信号处于低电平状态时)的情况。为了观察主器件的输出情况,我们故意在CS信号下降沿后加入了一段延时,然后向数据寄存器中写入了要发送的数据。通过观察MOSI的输出,我们可以清晰地看到,bit1(其值为1)是在SCK信号有效之前的半个时钟周期就开始输出了,这一输出与CS信号的状态无关。当SCK信号进入第一个时钟周期时,其上升沿恰好捕捉到了从器件采样的bit1数据。
图4展示了CS和MISO信号在CS信号有效后的状态。从图中可以清晰地看到,一旦CS信号变为有效状态,从器件立即开始输出bit1,其值为1。这一输出过程与SCK信号的状态同步,确保了数据传输的准确性。
在实际的SPI操作中,我们通常处理的是16位的数据。图5详细记录了第一个字节和第二个字节间的衔接过程。在SCK的上升沿,第一个字节的最后一位被从器件采样,而在随后的SCK下降沿,从器件已经准备好输出第二个字节的第一位数据。这一系列的操作保证了SPI通信的高效与稳定。
SPI总线协议详解(接口定义与传输时序)
SPI,全称Serial Peripheral Interface,是一种由Motorola率先提出的全双工三线同步串行外围接口。它采用主从模式架构,支持多slave设备,但通常仅允许单master设备存在。在SPI通信中,时钟信号由master设备严格控制,数据在每个时钟移位脉冲的作用下,按照高位在前、低位在后的顺序(MSB first)逐位传输。此外,SPI接口包含两根单向数据线,实现全双工通信,其数据传输速率在实用场景中可高达几Mbps。
接下来,我们深入了解一下SPI接口的具体信号线定义。SPI接口共包含四根信号线:设备选择线、时钟线、串行输出数据线和串行输入数据线。这些信号线在SPI通信中各自扮演着至关重要的角色。
(1)MOSI(Master Out Slave In):主器件的数据输出线,同时也是从器件的数据输入线。
(2)MISO(Master In Slave Out):主器件的数据输入线,而从器件则通过这条线向主器件输出数据。
(3)SCLK(Serial Clock):时钟信号线,由主器件产生并严格控制,用于同步数据的传输。
(4)/SS(Slave Select):从器件使能信号线,由主器件控制,用于选择和激活特定的从器件。
接下来,我们将深入探讨SPI接口的内部结构及其工作原理。
传输时序
SPI接口的内部硬件实际上包含两个简单的移位寄存器,它们负责传输8位的数据。在主器件的从器件使能信号和移位脉冲的共同作用下,这些数据会逐位进行传输,其中高位在前,低位在后。具体来说,每当SCLK产生一个下降沿时,数据便会发生改变;而当SCLK产生上升沿时,一位数据会被存入移位寄存器中。
SPI接口设计时并未引入特定的流控制机制,也没有相应的应答机制来确认数据是否已成功接收。接下来,我们将深入探讨LCD1602的操作时序,这是使用任何IC芯片时都必须掌握的核心内容。时序图详细描绘了芯片在各种操作条件下的行为,包括数据传输的顺序、时序脉冲的生成等。要充分理解和掌握LCD1602的操作时序,我们首先需要详细阅读和理解其官方器件手册。由于中国在芯片设计方面的能力尚在发展阶段,市场上主流的器件往往来自国际知名的IC制造商,如TI、AT、MAXIM等,因此,在阅读和理解这些器件手册时,提升英文阅读能力显得尤为重要。尽管可能存在中文翻译版本,但建议优先阅读英文原版,并在遇到理解困难时参考中文版,这样更有助于英文能力的提升。在了解LCD1602的引脚定义时,我们需要注意其引脚排列整齐,采用SIP单列直插封装,因此器件手册中主要提供了引脚功能的数据表。

我们主要关注以下几个关键引脚:
3脚:VL,它承载着液晶显示偏压信号的职责,旨在调节LCD1602的显示对比度。通常,我们会外接一个电位器来灵活调整这个偏压信号。值得注意的是,当此脚电压为0时,LCD1602将呈现出最强的对比度。
4脚:RS,这是一个数据/命令选择端。它的电平状态决定了LCD1602是进行数据传输还是命令传输。当RS为高电平时,1602将处理数据字节,这些字节要么用于在屏幕上显示信息,要么用于设置LCD1602的工作模式;而当RS为低电平时,则进行命令字节的传输。值得一提的是,LCD1602的数据传输是8位并行的。
5脚:R/W,它作为读写选择端,决定了对LCD1602的操作类型。高电平时,可以进行读数据操作;而低电平时,则进行写数据操作。尽管此脚在某些情况下可能并不必要,例如可以直接接地以永久置为低电平进行写操作,但为了确保兼容性和灵活性,我们还是推荐按照标准时序进行操作。
6脚:E,即使能信号,它实际上是LCD1602的数据控制时钟信号。利用这个信号的上升沿,我们可以实现对LCD1602的数据传输。
7~14脚:这8位并行数据口极大地简化了对LCD1602的数据读写操作。
在此,我们不必急于读取LCD1602的数据状态或具体数据。我们主要关注的是写时序,因为它涉及到如何将数据写入LCD1602。当需要设置LCD1602的工作方式或写入显示数据时,我们遵循特定的引脚配置和数据传输流程。以下是两种关键的写时序:
若要写入指令字以配置LCD1602的工作模式,我们需将RS置为低电平,RW置为低电平,随后将数据发送至D0~D7数据口,并通过E引脚产生一个高脉冲来完成数据写入。
若要写入数据字以实现LCD1602的显示功能,则应将RS置为高电平,RW同样置为低电平,接着将数据发送至D0~D7数据口,并通过E引脚的高脉冲触发数据写入。
值得注意的是,这两种写时序的主要区别在于RS引脚的电平设置。通过正确配置RS和RW引脚,我们可以灵活地在LCD1602上执行不同的操作。
要掌握LCD1602的写时序,首先需要学会解读时序图。时序图是操作器件的关键所在,通过它,我们可以清晰地看到各个引脚电平的变化。在LCD1602的时序图中,我们需要注意以下几点:
时间轴的理解:通常,时序图的时间轴从左向右表示时间的增长。如果图中没有明确标出时间轴,那么我们也可以默认按照这个方向来理解。
引脚标识与电平变化:时序图的左侧通常会标出某一根引脚的标识,表示该行图线展示的是该引脚的变化情况。同时,有线交叉的部分表示电平的改变,而两条平行线则分别对应高低电平,与电平变化相吻合。
数据有效性的判断:在时序图中,密封的菱形部分表示数据有效,这也是我们需要注意的一个关键点。同时,“Valid Data”这个词也强调了这一点。
严格遵守时间轴:观察时序图时,我们必须严格按照时间轴的增长方向来精确地解读每一个细节。因为时序图里各个引脚的电平变化都是基于一致的时间轴来展开的。
习惯通用规则:虽然LCD1602的时序图有其特殊性,但大部分的时序图都遵循着相似的一般规则。因此,我们需要逐渐熟悉并掌握这些规则。
此外,时序图中还包含了许多关于时间的标注,这些标注对于理解某些状态所需的最短或最长时间至关重要。因为器件的工作速度有限,无法跟上主控芯片的速度,所以它们之间必须有时序上的配合。随着处理器主频的不断增长,这种时序配合的重要性也日益凸显。

懂得估算主控芯片的指令时间至关重要,这通常可以在官方数据手册中查找到MCU的相关参数。例如,当我们使用AVR M16作为主控芯片,并配备外部12MHz晶振时,其指令周期即为1/12MHz微秒级别。这为我们确定了执行单条指令的时间尺度。观察给定的时序参数,我们发现它们都是纳秒级别的,这表明即使程序中不加入延时,也能很好地满足LCD1602的时序要求。
在时序图中,我们可以找到TR1,它对应着时序参数表中的E上升沿/下降沿时间,最大值为25ns。这意味着E引脚上的电平变化必须在25ns内完成。现在,让我来详细解读一下这个时序图:
在写入命令字节时,时间从左向右推进。首先,RS引脚变为低电平,紧接着R/W引脚也变为低电平。请注意,RS引脚的状态变化是首先完成的。随后,DB0~DB7上的数据进入有效阶段。在这之后,E引脚经历一个完整的脉冲跳变,并需要维持至少tpw=400ns的脉冲宽度。最后,E引脚产生负跳变,同时RS和R/W引脚的状态发生变化。这样,就完成了一个完整的LCD1602写命令时序。
接下来,我们来看看CEPARK AVR开发板的1602显示部分原理图,以深入了解其工作原理。

如你所见,该解法直接采用了1k电阻,这确实节省了不少成本。但需注意,这样的设计使得VL脚(即偏压信号脚)的电压变得不可调,从而导致了对比度的固定。
接下来,让我们深入探讨LCD1602的一些关键细节:
LCD1602以ASCII码来识别写入的数据字节。因此,要显示的字符数据必须采用某种ASCII码。当然,如果你不希望查阅ASCII表,也可以直接使用字符常量来替代。值得注意的是,’0’和30H(0的ASCII码)在功能上是等价的。
在操作LCD1602之前,必须先进行初始化。这一点在数据手册中有详细说明,而且各个命令字的写入顺序并没有严格要求。
LCD1602还提供了自定义字符的功能,一旦你熟悉了基本操作,可以尝试进一步拓展其应用。
每次写完数据后,应确保将E引脚置为低电平,为下一次E的高脉冲做好准备。这种操作被称为释放时钟线,良好的习惯对配合时序至关重要。
可以将需要显示的字符一次性定义在字符数组中,并通过调用字符数组的方式来显示数据,这样可以使程序更加简洁且高效。
在严格遵守时序要求但结果仍不理想时,可以尝试插入延时。这并不违反时序要求,而且许多器件手册并未详细说明最小时间要求。
浙公网安备 33010602011771号