作者: Regine Monique Aurellano Microchip Technology Inc.
简介
串行外设接口(Serial Peripheral Interface,SPI)一直以来是PIC® MCU内核外设集的一部分。PIC18(L)F2X/4XK42单片机系列引入的最新特性之一是用于实现SPI功能的单独模块。以前的器件将SPI功能与其他串行通信协议集成,并在SPI共享寄存器和中断标志等资源的主同步串行端口(Master Synchronous Serial Port,MSSP)模块中实现。SPI的专用模块可显著改进SPI的传统功能并扩展新功能,从而提高灵活性并加强用户控制。
本技术简介旨在讨论SPI模块的实现、工作模式和其他有用的附加特性。
SPI模块概述
SPI(串行外设接口)模块具有可在全双工和半双工模式下工作的同步串行数据通信总线。器件在主/从环境下通信,在该环境下,由主器件发起通信。从器件由主器件通过从选择(Slave Select,SS)线控制。示例从器件包括串行EEPROM、移位寄存器、显示驱动器、模数转换器或其他PIC® MCU。
SPI模块支持以下模式和特性:
• 主模式
• 从模式
• 时钟极性和边沿选择
• 从选择同步
• 从器件的菊花链连接
以下是全新专用SPI模块特有的新特性:
• SDI、SDO和SS极性控制
• 独立的发送和接收使能
• 具有2字节FIFO和DMA功能的独立发送和接收缓冲区
如前文所述,SPI协议使用主从结构。如果器件配置为主器件,则它将提供并控制时钟信号。连接到主器件的所有从器件都由该主时钟控制,并且可能无法处理该时钟。当数据随时钟移出主器件或从器件时,时钟将同时驱动新数据。从选择(SS)信号控制主器件正在与哪个从器件通信,确保一次只有一个从器件工作。
无论器件的模式为主模式还是从模式,发送过程都涉及将位移入和移出寄存器。数据缓冲区寄存器用于发送和接收数据。数据通常一次移出一位,首先移出最高有效位(Most Significant bit,MSb)。较新的器件包含两个单独的寄存器,一个用于发送数据,另一个用于接收数据。主器件在编程的时钟边沿将数据移出发送寄存器和串行数据输出(Serial Data Out,SDO)引脚,在相反的时钟边沿将数据移入从器件的串行数据输入(Serial Data In,SDI)引脚和接收寄存器。图1给出了一个框图,说明了具有独立数据发送和接收缓冲区的器件中SPI系统的连接。
注: 主器件和从器件应配置为相同的时钟极性设置。
要开始通信,主器件需发出时钟信号。在每个SPI时钟周期期间,发生数据发送。当主器件通过其SDO引脚发出数据、从器件通过其SDI引脚接收该数据时,从器件还会通过其SDO引脚将一些数据发送到主器件的SDI引脚。移出8位数据后,主器件和从器件应交换了寄存器值。如果有更多数据要交换,寄存器再次装入数据并重复此过程。只要主器件发送时钟信号,发送便可能涉及任意数量的时钟周期。没有更多要发送的数据时,主器件停止发送时钟信号,从器件的SS线禁用,从而取消选择从器件。
SPI模式入门
使能和禁止SPI模块
要使能串行端口,相应寄存器的EN位必须置1。将该位置1还可以使能SPI输入和输出:SDI、SDO、SCK和SS。所有这些输入和输出均可通过外设引脚选择(Peripheral Pin Select,PPS)进行控制,并且必须正确映射才能正常工作。清零EN位将中止正在进行的传输、不允许硬件将中断标志置1并复位读写FIFO指针。
校验是否存在正在进行的传输
用户可通过一些位校验是否有传输正在进行。用户可以轮询SPIxCON2寄存器的BUSY位来校验模块的状态,即所进行的数据传输是否完成。
发送和接收寄存器
对于用于发送和接收的数据,可通过具有SPI外设模块的较新器件的只写SPIxTXB和只读SPIxRXB寄存器进行访问。这些寄存器最多可包含两个字节的信息,并且可读取和写入指向下一个执行读取或写入操作的存储单元的指针。每次读取SPIxRXB都会使读指针递增,每次写入SPIxTXB都会使写指针递增。
LSb优先和MSb优先操作
SPI外设模块允许在LSb优先和MSb优先之间进行选择。SPIxCON0寄存器的LSBF位指定数据采用LSb优先还是MSb优先的方式移入或移出器件。该位在默认情况下清零,因此MSb为实际配置。
对于新的SPI模块,有3个位可控制串行端口的极性。SDIP、SDOP和SSP位分别控制SDI、SDO和SS信号的极性。对于全部3个位而言,当该位清零时,输入或输出为高电平有效;否则,输入或输出为低电平有效。
SPI工作模式
主模式
在主模式下,器件控制SCK线并启动数据传输。它还将确定哪个从器件可发送或接收数据。新的独立SPI模块提供了主模式的4种配置,即:
• 全双工(传统)模式
• 仅接收模式
• 仅发送模式
• 传输关闭模式
该模式可由TXR和RXR位配置。表1说明了RXR/TXR位的各个配置对应于哪种模式。
• 全双工(传统)模式(RXR|TXR = 11)
在该模式下,只要接收(RX)寄存器未满并且发送(TX)寄存器中存在数据,就会发生数据传输。实际上,只要接收寄存器为空(即已读取其最新的内容),即会在数据写入发送寄存器后立即发送/接收数据。如果BMODE = 0,则BMODE位也应被视为数据传输可能取决于传输计数器。将BMODE位设置为等于1可完全匹配传统设置。
• 仅接收模式(RXR|TXR = 10)
在该模式下,如果RX寄存器未满并且传输计数器非零,则将发生数据传输。传输计数器用于控制在数据交换停止之前将发生多少次数据传输。如果TX寄存器中有任何数据,则将发送并且会重复发送该数据。如果TX寄存器中没有数据,则会发送最新接收到的数据。
• 仅发送模式(RXR|TXR = 01)
在该模式下,每当TX寄存器非空(如果BMODE= 1)或传输计数器非零(如果BMODE = 0)时,便会发生数据传输。接收到的任何数据都不会存储在RX寄存器中。当BMODE = 0时,传输计数器还必须在传输之前写入,当传输计数器达到零时,传输将停止。
• 传输关闭模式(RXR|TXR = 00)
在该模式下,SCK将不会翻转,也不会交换数据。
对于SPI外设模块,主模式还提供用于控制从选择引脚的用户选项。用户可以通过SPIxCON2寄存器的SSET位使硬件控制从选择输出,当传输计数器非零时,可选择使其始终保持有效或被驱动为有效状态。对于硬件控制,确保通过外设引脚选择分配选定的SS引脚。从选择功能也可由软件通过任何通用I/O引脚进行控制,只需确保该引脚是配置为输出的GPIO引脚。
SPI主模式的时钟输出可以从以下方式获得,通过配置SPIxCLK寄存器进行设置(有关详细配置信息,请参见数据手册):
• FOSC
• HFINTOSC
• CLKREF
• Timer0
• Timer2/4/6
• SMT
SPIxBAUD寄存器允许对该时钟进行分频。SCK输出的频率由下面的公式1定义。
对于SPI 数据采样和时钟模式,SDI 的采样由CKE 和SMP位控制,SCK行为由CKP和CKE位控制。
新的SPI模块还在SCK生成时引入了一些同步延时,以确保SS输出正确定时。默认情况下,SPI模块在第一个SCK脉冲之前插入一个1/2波特的延时,以使主从硬件的时间彼此同步。
从模式
在SPI协议中,主器件控制发送和接收数据所使用的时钟信号,从选择引脚用于同步通信。SS线保持其无效状态,直到主器件准备好进行通信。当SS线激活时,从器件即获知主器件的新传输将开始。如果从器件未接收到通信,接收器逻辑将在发送结束时复位,此时SS线返回其无效状态。
在新的SPI模块中,TXR和RXR位控制数据传输的方式。
• 当TXR置1时,将发送TX寄存器的数据,写FIFO指针递增。如果TX寄存器为空,则将发送最新接收到的数据,发送下溢(TXUIF)中断标志位置1,以指示发生此类错误。
• 当 TXR 清零时,将发送 TX 寄存器中的数据(如果可用),但写FIFO指针不会递增。如果TX寄存器为空,则将发送最新接收到的数据,但TXUIF中断将不会置1。
• 当RXR置1时,如果RX寄存器未满,则数据将存储到该寄存器中,读FIFO指针递增。如果接收到数据并且RX寄存器已满,则接收上溢(RXOIF)中断标志位将置1以指示错误,接收到的数据将被丢弃。
• 当RXR清零时,所有接收到的数据将被忽略,不会存储到RX寄存器中。
如果SS线在数据传输过程中转换到无效状态,则SPIxCON2寄存器中的从选择故障(SSFLT)位置1。SPIxCON1寄存器的SSP位控制从选择极性。当SSP位置1时,SS线为低电平有效。相反,当SSP位清零时,SS线为高电平有效。
对于从模式下的SCK 设置,SCK 引脚必须始终为输入,并配置为与主器件相同的时钟极性和边沿。与主模式类似,时钟极性由CKP位控制,时钟沿由CKE位设置,这两个位均位于SPIxCON1寄存器中。
新特性:传输计数器
在主模式下,传输计数器用于确定事务终止前SPI将发送/接收的数据传输数。传输计数器为10位宽,可通过SPIxTCTH/L寄存器对访问。在主模式下,传输计数器可以在两种模式下工作,具体由SPIxCON0寄存器的BMODE位决定。在下面要讨论的两种模式中,当传输计数器达到零时,传输计数器为零中断标志(TCZIF)将置1。
总位计数模式(BMODE = 0)
• 在该模式下,将结合SPIxTCTH/L和SPIxTWIDTH寄存器的值组合来确定要传输的总位数。发送或接收每个字节时,传输计数器均减少8,直到剩余的总数小于8。如果有任何剩余的位,TX寄存器将发出最后一个字节,其中超过剩余位的任何位都将被忽略。类似地,如果有待接收的剩余位,RX寄存器将装入包含这些剩余位的最后一个字节,并用0填充未使用的位。SPIxCON0的LSBF位决定MSb还是LSb用0填充。在该模式下,SPIxWIDTH设置仅适用于交换的最后一个字节。请注意,在该模式下,即使SS引脚由软件控制,SPIxTCNT寄存器也必须始终为非零值。
可变传输大小模式(BMODE = 1)
• 在该模式下,SPIxTWIDTH寄存器确定每次数据传输的位长。SPIxTCTH/L寄存器对指定该长度的传输的次数。如果SPIxTWIDTH = 0,每次数据传输均为一个字节宽。否则,只有指定的位数移入TX寄存器,未使用的位将被忽略。接收到的数据在未使用的区域用0 填充,然后装入RX 寄存器。
SPIxCON0的LSBF位决定MSb还是LSb用0填充。在该模式下,SPIxWIDTH设置适用于发送的每个字节。请注意,在该模式下,当SS引脚由软件控制时,SPIxTCNT寄存器无需为非零值。
在从模式下,传输计数器仍递减,但不控制数据传输。传输计数器与BMODE位一起使用时,可供从器件用来确定何时应寻找从选择故障。如果BMODE = 1,则在发送每次单独传输的最后一位之前,如果SS线转换到无效状态,SSFLT 位将置1。如果BMODE = 0,则当SS线在数据字节之间发生转换时,SSFLT位将置1。如果SS 线在消息最后一个字节的位之间发生转换,则SSFLT位也将置1。此外,SSFLT位对于初次使用的用户而言更易于想象。
SPI在休眠模式下的工作
在SPI外设模块中,如果源时钟在休眠模式下有效,则SPI主模式可在休眠状态下工作。有关休眠模式下有效的时钟列表,请参见数据手册。所有中断仍将触发,并可将器件从休眠状态唤醒。从模式仍可工作,因为时钟由外部主器件提供。中断仍会触发并可将器件从休眠状态唤醒。
SPI中断
SPI模块可在几种不同的条件下触发中断。这些中断标志位和允许位位于PIRx/PIEx特殊寄存器中。
下面是适用于SPI外设模块的新中断:
• SPI接收器数据中断(SPIxRIF/SPIxRIE)
SPI接收器数据中断在RX寄存器包含数据时置1,在RX寄存器清零时清零。该中断可实现完全由中断驱动的操作,并且兼容DMA。
• SPI发送器数据中断(SPIxTIF/SPIxTIE)
SPI发送器数据中断在TX寄存器未满时置1,在TX寄存器已满时清零。与接收器数据中断一样,它可实现完全由中断驱动的操作,并且也兼容DMA。
• 移位寄存器空中断(SRMTIF/SRMTIE)
移位寄存器空中断仅在主模式下可用,并且在数据传输完成但新传输未准备就绪时置1。
• 传输计数器为零中断(TCZIF/TCZIE)
传输计数器为零中断在传输计数器达到0时置1。该位也必须用软件清零。
• 从选择开始和从选择结束中断(SOSIF/SOSIE和EOSIF/EOSIE)
这些中断在SS输入的前沿和后沿触发,可在主模式和从模式下使用。不过,应注意的是,在主模式下,应使用PPS将SS输入连接到与SS输出相同的引脚,以便在SS线发生转换时触发这些中断。
• 接收器上溢和发送器下溢中断(RXOIF/RXOIE和TXUIF/TXUIE)
当有待接收的数据但RX寄存器已满且RXR位置1时,接收器上溢中断触发。类似地,当没有要发送的数据但TXR位置1时,发送器下溢中断触发。
这些条件仅在从模式下出现,必须由软件通过清零各个标志位或清零SPIxCON0的EN位的方式清零。
结论
由于专用协议的普及和广泛应用,SPI外设成为所有PIC® MCU器件的主要部分。PIC MCU中包含的SPI外设能够支持SPI系统可能需要的所有功能。本技术简介讨论了SPI模块的不同模式,并简要介绍了每个角色(无论是主器件还是从器件)和模式的设置以及每个设置的数据传输方式。本技术简介还概述了仅针对专用SPI模块提供的全新传输计数器功能,还讨论了可在发生与SPI活动相关的特定事件时触发的中断,这将极大地帮助理解文档中提到的事件。这些特性证明了PIC®MCU器件已成为可靠且强大的平台,适合使用SPI协议的任何应用。