SPI

1.SPI总线简介

SPI(serial peripheral interface,串行外围设备接口)总线技术是Motorola公司推出的一种同步串行接口。它用于CPU与各种外围器件进行全双工、同步串行通讯。它只需四条线就可以完成MCU与各种外围器件的通讯,这四条线是:串行时钟线(CSK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)、低电平有效从机选择线CS。当SPI工作时,在移位寄存器中的数据逐位从输出引脚(MOSI)输出(高位在前),同时从输入引脚(MISO)接收的数据逐位移到移位寄存器(高位在前)。发送一个字节后,从另一个外围器件接收的字节数据进入移位寄存器中。即完成一个字节数据传输的实质是两个器件寄存器内容的交换。主SPI的时钟信号(SCK)使传输同步。其典型系统框图如下图所示。

SPI总线的特点、工作方式及常见错误解答
图1 典型系统框图

2.SPI总线的主要特点

• 全双工;

• 可以当作主机或从机工作;

• 提供频率可编程时钟;

• 发送结束中断标志;

• 写冲突保护;

• 总线竞争保护等。

3.SPI总线工作方式

SPI总线有四种工作方式,其中使用的最为广泛的是SPI0和SPI3方式(实线表示):

SPI总线的特点、工作方式及常见错误解答
图2 SPI0和SPI3方式(实线表示)

四种工作方式时序分别为:
SPI总线的特点、工作方式及常见错误解答
图3 四种工作方式时序

时序详解:

CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

工作方式1:

当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

工作方式2:

当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。

工作方式3:

当CPHA=1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

工作方式4:

当CPHA=1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。

4.SPI总线常见错误

4.1 SPR设定错误

在从器件时钟频率小于主器件时钟频率时,如果SCK的速率设得太快,将导致接收到的数据不正确(SPI接口本身难以判断收到的数据是否正确,要在软件中处理)。

整个系统的速度受三个因素影响:主器件时钟CLK主、从器件时钟CLK从和同步串行时钟SCK,其中SCK是对CLK主的分频,CLK从和CLK主是异步的。要使SCK无差错无遗漏地被从器件所检测到,从器件的时钟CLK从必须要足够快。下面以SCK设置为CLK主的4分频的波形为例,分析同步串行时钟、主时钟和从时钟之间的关系。

SPI总线的特点、工作方式及常见错误解答
图4主从时钟和SCK的关系

如图4所示,当T从<Tsck/2,即T从<2T主时,无论主时钟和从时钟之间的相位关系如何,在从器件CLK从的上升沿必然能够检测到SCK的低电平,即SCK=0的范围内至少包含一个CLK从的上升沿。

图5中,当T从≥TSCK/2=2T主时,在clk_s的两个上升沿都检测不到SCK的低电平,这样从器件就会漏掉一个SCK。在某些相位条件下,即使CLK从侥幸能检测到SCK的低电平,也不能保证可以继续检测到下一个SCK。只要遗漏了一个SCK,就相当于串行数据漏掉了一个位,后面继续接收/发送的数据就都是错误的了。

SPI总线的特点、工作方式及常见错误解答
图5主从时钟和SCK的关系

根据以上的分析,SPR和主从时钟比的关系如表1所列。
SPI总线的特点、工作方式及常见错误解答
表1 SPR的设置和主从时钟周期比值之间的关系

在发送数据之前按照表1对SPR进行设置,SPR设定错误可以完全避免。

4.2 模式错误(MODF)

模式错误表示的是主从模式选择的设置和引脚SS的连接不一致。

器件工作在主模式的时候(MSTR=1),它的片选信号SS引脚必须接高电平。在发送数据的过程中,如果它的SS从高电平跳至低电平,在SS的下降沿,SPI模块将检测到模式错误,对MODF位置1,强制器件从主模式转入从模式(即令MSTR=0),清空内部计数器counter,并结束正在进行的数据传输,如图6(a)所示。

对从模式(MSTR=0),在没有数据传送的时候,SS高电平表示从器件未被选中,从器件不工作,MISO输出高阻;在数据传输过程中,片选信号SS必须接低电平,且SS不允许跳变。如果SS从低电平跳到高电平,在SS的上跳沿,SPI模块也将检测到模式错误,清空内部计数器counter,并结束正在进行的数据传输。直到SS恢复为低电平,重新使SPEN=1时,才重新开始工作,如图6(b)所示。

SPI总线的特点、工作方式及常见错误解答
图6模式错误的检测

4.3 溢出错误(OVR)

溢出错误表示连续传输多个数据时,后一个数据覆盖了前一个数据而产生的错误。

状态标志SPIF表示的是数据传输正在进行中,它对数据的传输有较大的影响。主器件的SPIF有效由数据寄存器的空标志SPTE=0产生,而从器件的SPIF有效则只能由收到的第一个SCK的跳变产生,且又由于从器件的SPIF和主器件发出的SCK是异步的,因此从器件的传输标志SPIF从相对于主器件的传输标志SPIF主有一定的滞后。如图7所示,在主器件连续发送两个数据的时候将有可能导致从器件的传输标志和主器件下一个数据的传输标志相重叠(图7中虚线和阴影部分),第一个收到的数据必然被覆盖,第二个数据的收/发也必然出错,产生溢出错误。

SPI总线的特点、工作方式及常见错误解答
图7溢出错误

通过对从器件的波形分析发现,counter=8后的第一个时钟周期,数据最后一位的传输已经完成。在数据已经收/发完毕的情况下,counter=8状态的长短对数据的正确性没有影响,因此可以缩短counter=8的状态,以避免前一个SPIF和后一个SPIF相重叠。这样,从硬件上避免了这一阶段的溢出错误。

但是,如果从器件工作速度不够快或者软件正在处理其他事情,在SPI接口接收到的数据尚未被读取的情况下,又接收到一个新的数据,溢出错误还是会发生的。此时,SPI接口保护前一个数据不被覆盖,舍弃新收到的数据,置溢出标志OVR=1;另外发出中断信号(如果该中断允许),通知从器件及时读取数据。

4.4 偏移错误(OFST)

SPI接口一般要求从器件先工作,然后主器件才开始发送数据。有时在主器件往外发送数据的过程中,从器件才开始工作,或者SCK受到外界干扰,从器件未能准确地接收到8个SCK。如图8所示,从器件接收到的8个SCK其实是属于主器件发送相邻的两个数据的SCK主。这时,主器件的SPIF和从器件的SPIF会发生重叠,数据发生了错位,从器件如果不对此进行纠正的话,数据的接收/发送便一直地错下去。

SPI总线的特点、工作方式及常见错误解答
图8偏移错误

在一个数据的传输过程中,SPR是不允许改变的,即SCK是均匀的,而从图5可以看出,从器件接收到的8个SCK并不均匀,它们是分别属于两个数据的,因此可以计算SCK的占空时间来判断是否发生了偏移错误。经分析,正常时候SCK=1时的时钟周期数n的取值满足如下关系:
SPI总线的特点、工作方式及常见错误解答

但由于主从时钟之间是异步的,并且经过了取整,所以正常时候SCK=1时的时钟周期计数值COUNT应满足:
SPI总线的特点、工作方式及常见错误解答

比如在图5中,COUNT的最大值COUNT(max)=2或者1,都可认为是正常的。但当出现COUNT(max)=8时,可以判定出现了偏移错误。在实际设计中,先记录下第一个COUNT(max)的值,如果后面又出现与记录值相差1以上的COUNT(max)出现,可知有偏移错误OFST发生。SPI接口在“不均匀”的地方令SPIF=1,然后准备等待下一个数据的第一个SCK。其中COUNT的位数固定为8位,为了避免溢出时重新从00H开始计数,当计数达到ffH时停止计数。

4.5 其他错误

设定不当,或者受到外界干扰,数据传输难免会发生错误,或者有时软件对错误的种类判断不清,必须要有一种方法强制SPI接口从错误状态中恢复过来。在SPI不工作,即SPEN=0的时候,清除SPI模块内部几乎所有的状态(专用寄存器除外)。如果软件在接收数据的时候,能够发现数据有错误,无论是什么错误,都可以强制停止SPI的工作,重新进行数据传输。例如,在偏移错误(OFST)中,如果SPR2、SPR1和SPR0的设置适当,也可以使SCK显得比较“均匀”。SPI接口硬件本身不可能检测到有错误,若用户软件能够发现错误,这时就可以强制停止SPI的传输工作,这样就可以避免错误一直持续下去。

在应用中,如果对数据的正确性要求较高,除了要在软件上满足SPI接口的时序要求外,还需要在软件上作适当的处理。

5.设计SPI总线控制器

目前的项目中使用了SPI总线接口的FLASH存储器存储图像数据。FLASH的SPI总线频率高达66M,但MCU的频率较低,晶振频率7.3728M,SPI最大频率为主频1/2。对于320*240*16的图像读取时间为333ms,而且还忽略了等待SPI传输完成、写显存、地址坐标设定等时间。实际测试约为1s。成为GUI设计的极大瓶颈。由于TFT驱动是自己FPGA设计的,资源尚有余量,决定把SPI控制器(主)及写图像部分逻辑放入FPGA中用硬件完成。

首先接触到的是SPI的SCK时钟频率问题。FPGA的频率是48M,未使用PLL。能否以此频率作为SCK频率呢?要知道所有的MCU提供的SPI频率最大为主频的1/2!为什么呢?查过一些资料后发现,SPI从机接收数据并不是以SCK为时钟的,而是以主频为时钟对SCK和MISO进行采样,由采样原理得知SCK不能大于1/2主频,也就有了MCU提供最大master频率是1/2主频,最大slaver频率是1/4主频。FPGA在只作为主机时能否实现同主频一样频率的SCK呢??答案貌似是肯定的!但我还是有点担心,用组合逻辑控制SCK会不会出现较大毛刺影响系统稳定性呢?

转自: 极客先锋

围观 800

“串口下载”是大多数工程师最早接触的程序下载方式,尤其是一开始使用51单片机的工程师们。随着硬件集成度越来越高,芯片资源不断被压缩,工程师也想到了另一种“串口下载”方式,只需一根数据线即可。

随着半导体行业的飞速发展,芯片集成度越来越高,随之研发设计出来的PCBA大小已经能和硬币比肩,功能却一点都没有受到影响,是如何做到的呢?在不影响功能的情况下尽量裁剪硬件资源,这是每个工程师都头疼的问题,关键在于裁剪后如何保证编程能够正常进行。

编程接口多种多样,包括工程师们熟悉的UART、I2C、SPI、SWD等,一般需要2-6根线进行烧录,而其中有一种编程接口只需要一根数据线即可实现程序的烧写,这对必须尽量压缩硬件资源的工程师来说是一个很好的消息。

单线SPI的在线编程方案
图1 硬币大小的PCBA

如图硬币大小的PCBA如今并不少见,要在如此小的体积上集成完善的功能,硬件资源复用或压缩是一种可靠的手段,其中使用尽可能少的接口完成编程动作可以达到压缩硬件资源的目的。

单线串口

单纤串口是串行接口的一种通讯方式。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成。

单线SPI的在线编程方案
图 2 串行数据帧

单线串口:全称为“单线异步串行通讯接口”,本文中简称为“单线串口”。

标准串口:全称为“标准异步串行通讯接口”,本文中简称为“标准串口”。

单线串口与标准串口均使用一样的通讯协议,区别在于标准串口使用两根数据线通讯(TXD和RXD),单线串口只有一根数据线来同时兼备发送和接收功能。因此,单线串口采用半双工的通讯方式,具体的单线串口接线图可参考下图所示。

单线SPI的在线编程方案
图 3 单线串口接线示意图

从图中可以看出,只需接入四根线(MOD,/RESET,VCC,GND)就可以进行程序烧写了。其中只有一根为数据线,用于收发数据。

芯片内标示的这个通讯口(MOD/IO)还可以被用来做工作模式选择,比如在上电复位的同时,检测MOD管脚的输入时序波形,根据这个时序波形判断进入到不同的工作模式,比如进入单线串口编程模式。进入单线串口编程模式后,MOD管脚的功能即转换为数据通讯。这样可以最大化的减少程序烧写所使用的编程口线,达到进一步压缩硬件资源的目的。

来源: 快易购

围观 276

作者: 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系统的连接。

8位PIC®单片机上的串行外设接口(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可完全匹配传统设置。

8位PIC®单片机上的串行外设接口(SPI)通信

• 仅接收模式(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定义。

8位PIC®单片机上的串行外设接口(SPI)通信

对于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协议的任何应用。

8位PIC®单片机上的串行外设接口(SPI)通信
围观 843

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。

SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。

SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传 输协议之一进行数据传输。如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。 SPI主模块和与之通信的外设音时钟相位和极性应该一致。

SPI接口在模式0下输出第一位数据的时刻,SPI接口有四种不同的数据传输时序,取决于CPOL和CPHL这两位的组合。图1中表现了这四种时序,时序与CPOL、CPHL的关系也可以从图中看出。

图1

CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。

由于我使用的器件工作在模式0这种时序(CPOL=0,CPHA=0),所以将图1简化为图2,只关注模式0的时序。

图2

我们来关注SCK的第一个时钟周期,在时钟的前沿采样数据(上升沿,第一个时钟沿),在时钟的后沿输出数据(下降沿,第二个时钟沿)。首先来看主器件,主器件的输出口(MOSI)输出的数据bit1,在时钟的前沿被从器件采样,那主器件是在何时刻输出bit1的呢?bit1的输出时刻实际上在SCK信号有效以前,比 SCK的上升沿还要早半个时钟周期。bit1的输出时刻与SSEL信号没有关系。再来看从器件,主器件的输入口MISO同样是在时钟的前沿采样从器件输出的bit1的,那从器件又是在何时刻输出bit1的呢。从器件是在SSEL信号有效后,立即输出bit1,尽管此时SCK信号还没有起效。关于上面的主器件和从器件输出bit1位的时刻,可以从图3、4中得到验证。

图3

注意图3中,CS信号有效后(低电平有效,注意CS下降沿后发生的情况),故意用延时程序延时了一段时间,之后再向数据寄存器写入了要发送的数据,来观察主器件输出bit1的情况(MOSI)。可以看出,bit1(值为1)是在SCK信号有效之前的半个时钟周期的时刻开始输出的(与CS信号无关),到了SCK的第一个时钟周期的上升沿正好被从器件采样。

图4

图4中,注意看CS和MISO信号。我们可以看出,CS信号有效后,从器件立刻输出了bit1(值为1)。通常我们进行的spi操作都是16位的。图5记录了第一个字节和第二个字节间的相互衔接的过程。第一个字节的最后一位在SCK的上升沿被采样,随后的SCK下降沿,从器件就输出了第二个字节的第一位。

围观 327

作者:ce123

IICvs SPI

现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和Motorola(for SPI) 出于不同背景和市场需求制定了这两种标准通信协议。

IIC 开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互联方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互联微控制器和外围设备的。要实现内存映射,设备必须并联入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。

为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了 ‘Inter-Integrated Circuit’,IIC 或 IIC ,一种只使用二根线接连所有外围芯片的总线协议。最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps,1998的3.4Mbps。

有迹象表明,SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。SPI总线是微控制器四线的外部总线(相对于内部总线)。与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节。
SPI

对于有经验的数字电子工程师来说,用SPI互联两支数字设备是相当直观的。SPI是种四根信号线协议(如图):

§ SCLK: Serial Clock (output from master);

§ MOSI; SIMO: Master Output, Slave Input(output from master);

§ MISO; SOMI: Master Input, Slave Output(output from slave);

§ SS: Slave Select (active low, outputfrom master).

SPI是[单主设备( single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”,如下图:

SPI有四种操作模式——模式0、模式1、模式2和模式3,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA。

[主从设备]必须使用相同的工作参数——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个[从设备],并且它们使用了不同的工作参数,那么[主设备]必须在读写不同[从设备]间重新配置这些参数。以上SPI总线协议的主要内容。SPI不规定最大传输速率,没有地址方案;SPI也没规定通信应答机制,没有规定流控制规则。事实上,SPI[主设备]甚至并不知道指定的[从设备]是否存在。这些通信控制都得通过SPI协议以外自行实现。例如,要用SPI连接一支[命令-响应控制型]解码芯片,则必须在SPI的基础上实现更高级的通信协议。SPI并不关心物理接口的电气特性,例如信号的标准电压。在最初,大多数SPI应用都是使用间断性时钟脉冲和以字节为单位传输数据的,但现在有很多变种实现了连续性时间脉冲和任意长度的数据帧。

IIC

与SPI的单主设备不同,IIC 是多主设备的总线,IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用两条信号线—— ‘serial data’ (SDA) 和 ‘serial clock’ (SCL)。IIC协议规定:

§ 第一,每一支IIC设备都有一个唯一的七位设备地址;

§ 第二,数据帧大小为8位的字节;

§ 第三,数据(帧)中的某些数据位用于控制通信的开始、停止、方向(读写)和应答机制。

IIC 数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

物理实现上,IIC 总线由两根信号线和一根地线组成。两根信号线都是双向传输的,参考下图。IIC协议标准规定发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。

IIC 通信过程大概如下。首先,主设备发一个START信号,这个信号就像对所有其它设备喊:请大家注意!然后其它设备开始监听总线以准备接收数据。接着,主设备发送一个7位设备地址加一位的读写操作的数据帧。当所设备接收数据后,比对地址自己是否目标设备。如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,设备会发送一个应答信号——ACKNOWLEDGE作回应。

当主设备收到应答后便开始传送或接收数据。数据帧大小为8位,尾随一位的应答信号。主设备发送数据,从设备应答;相反主设备接数据,主设备应答。当数据传送完毕,主设备发送一个STOP信号,向其它设备宣告释放总线,其它设备回到初始状态。

基于IIC总线的物理结构,总线上的START和STOP信号必定是唯一的。另外,IIC总线标准规定SDA线的数据转换必须在SCL线的低电平期,在SCL线的高电平期,SDA线的上数据是稳定的。

在物理实现上,SCL线和SDA线都是漏极开路(open-drain),通过上拉电阻外加一个电压源。当把线路接地时,线路为逻辑0,当释放线路,线路空闲时,线路为逻辑1。基于这些特性,IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。

IIC总线设计只使用了两条线,但相当优雅地实现任意数目设备间无缝通信,堪称完美。我们设想一下,如果有两支设备同时向SCL线和SDA线发送信息会出现什么情况。
基于IIC总线的设计,线路上不可能出现电平冲突现象。如果一支设备发送逻辑0,其它发送逻辑1,那么线路看到的只有逻辑0。也就是说,如果出现电平冲突,发送逻辑0的始终是“赢家”。
总线的物理结构亦允许主设备在往总线写数据的同时读取数据。这样,任何设备都可以检测冲突的发生。当两支主设备竞争总线的时候,“赢家”并不知道竞争的发生,只有“输家”发现了冲突——当它写一个逻辑1,却读到0时——而退出竞争。

10位设备地址

任何IIC设备都有一个7位地址,理论上,现实中只能有127种不同的IIC设备。实际上,已有IIC的设备种类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高。为了突破这个限制,很多设备使用了双重地址——7位地址加引脚地址(external configuration pins)。IIC 标准也预知了这种限制,提出10位的地址方案。

10位的地址方案对 IIC协议的影响有两点:

§ 第一,地址帧为两个字节长,原来的是一个字节;

§ 第二,第一个字节前五位最高有效位用作10位地址标识,约定是“11110”。

除了10位地址标识,标准还预留了一些地址码用作其它用途,如下表:

时钟拉伸

在 IIC 通信中,主设备决定了时钟速度。因为时钟脉冲信号是由主设备显式发出的。但是,当从设备没办法跟上主设备的速度时,从设备需要一种机制来请求主设备慢一点。这种机制称为时钟拉伸,而基于I²C结构的特殊性,这种机制得到实现。当从设备需要降低传输的速度的时候,它可以按下时钟线,逼迫主设备进入等待状态,直到从设备释放时钟线,通信才继续。

高速模式

原理上讲,使用上拉电阻来设置逻辑1会限制总线的最大传输速度。而速度是限制总线应用的因素之一。这也说明为什么要引入高速模式(3.4 Mbps)。在发起一次高速模式传输前,主设备必须先在低速的模式下(例如快速模式)发出特定的“High Speed Master”信号。为缩短信号的周期和提高总线速度,高速模式必须使用额外的I/O缓冲区。另外,总线仲裁在高速模式下可屏蔽掉。更多的信息请参与总线标准文档。

IIC vs SPI: 哪位是赢家?

我们来对比一下IIC 和 SPI的一些关键点:

第一,总线拓扑结构/信号路由/硬件资源耗费

IIC 只需两根信号线,而标准SPI至少四根信号,如果有多个从设备,信号需要更多。一些SPI变种虽然只使用三根线——SCLK, SS和双向的MISO/MOSI,但SS线还是要和从设备一对一根。另外,如果SPI要实现多主设备结构,总线系统需额外的逻辑和线路。用IIC 构建系统总线唯一的问题是有限的7位地址空间,但这个问题新标准已经解决——使用10位地址。从第一点上看,IIC是明显的大赢家。

第二,数据吞吐/传输速度

如果应用中必须使用高速数据传输,那么SPI是必然的选择。因为SPI是全双工,IIC 的不是。SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式还需要额外的I/O缓冲区,还并不是总是容易实现的。

第三,优雅性

IIC 常被称更优雅于SPI。公正的说,我们更倾向于认为两者同等优雅和健壮。IIC的优雅在于它的特色——用很轻盈的架构实现了多主设备仲裁和设备路由。但是对使用的工程师来讲,理解总线结构更费劲,而且总线的性能不高。

SPI的优点在于它的结构相当的直观简单,容易实现,并且有很好扩展性。SPI的简单性不足称其优雅,因为要用SPI搭建一个有用的通信平台,还需要在SPI之上构建特定的通信协议软件。也就是说要想获得SPI特有而IIC没有的特性——高速性能,工程师们需要付出更多的劳动。另外,这种自定的工作是完全自由的,这也说明为什么SPI没有官方标准。IIC和SPI都对低速设备通信提供了很好的支持,不过,SPI适合数据流应用,而IIC更适合“字节设备”的多主设备应用。

小结

在数字通信协议簇中,IIC和SPI常称为“小”协议,相对Ethernet, USB, SATA, PCI-Express等传输速度达数百上千兆字节每秒的总线。但是,我们不能忘记的是各种总线的用途是什么。“大”协议是用于系统外的整个系统之间通信的,“小”协议是用于系统内各芯片间的通信,没有迹象表明“大”协议有必要取代“小”协议。IIC和SPI的存在和流行体现了“够用就好”的哲学。回应文首,IIC和SPI如此的流行,它是任何一位嵌入式工程师必备的工具。

文章来源: 极客头条

围观 256

页面

订阅 RSS - SPI