精华内容
下载资源
问答
  • SPI协议规范.pdf

    2020-09-08 08:21:43
    SPI总线协议官方原文,嵌入式同事们备考。信号完整性必备基础知识、硬件测试人员必备基础知识。嵌入式软件必备基础知识。该文档描述了SPI信号采样的过程。
  • 3.1.3 SPI Baud Rate Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.4 SPI Status Register . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
  • Saleae16、Kingst LA1016等逻辑分析仪SPI协议转换工具能够将竖向显示数据转换成横向显示数据,以方便使用者查看。使用说明:解压后:将要转换的文件放到软件的目录下,双击AutoConvert.bat就会自动转换数据输出到o-...
  • Saleae16逻辑分析仪、Kingst LA1016 等逻辑分析仪在抓取SPI协议时,导出的CSV或TXT文件是竖向显示数据,这个工具可以把文件转换成横向显示数据,方便查看。 软件解压后即可使用,把要转换的文件放到软件的目录下,...
  • 0.96寸OLED显示屏(7针SPI协议) 某宝上买的OLED,IIC/SPI都可以,买来看的时候发现背面焊的是SPI。板子上又没有硬件SPI,只好用软件模拟SPI。很久之前学的了,现在把它写在CSDN上,各位大佬如有什么想法,欢迎...
  • SPI协议简介.pdf

    2020-03-12 17:51:15
    SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其...上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.
  • SPI协议详解(图文并茂+超详细)

    万次阅读 多人点赞 2020-11-03 01:23:31
    因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题...


    加入技术交流群

    领取资料

    先说串口

    因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料

    因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。

    如果要解决这个问题,UART为每个字节添加额外的起始位停止位,以帮助接收器在数据到达时进行同步;

    双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。

    传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示;

    串口传输的过程

    如果您注意到上图中的11001010不等于0x53,这是一个细节。串口协议通常会首先发送最低有效位,因此最小位在最左边LSB。低四位字节实际上是0011 = 0x3,高四位字节是0101 = 0x5

    异步串行工作得很好,但是在每个字节发送的时候都需要额外的起始位停止位以及在发送和接收数据所需的复杂硬件方面都有很多开销。

    不难发现,如果接收端和发送端设置的速度都不一致,那么接收到的数据将是垃圾(乱码)。

    下面开始讲一下SPI协议,会有哪些优点。

    SPI通讯协议

    于是我们想有没有更好一点的串行通讯方式;相比较于UARTSPI的工作方式略有不同。

    SPI是一个同步的数据总线,也就是说它是用单独的数据线一个单独的时钟信号来保证发送端和接收端的完美同步

    时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。

    产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);

    数据的采集时机可能是时钟信号上升沿(从低到高)或下降沿(从高到低)。

    具体要看对SPI的配置;

    整体的传输大概可以分为以下几个过程:

    • 主机先将NSS信号拉低,这样保证开始接收数据;

    • 接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);

      由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。

    • 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;

    • 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

    具体如下图所示;

    SPI的时序

    注意,SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;

    SPI特性

    SPI总线包括4条逻辑线,定义如下:

    • MISOMaster input slave output 主机输入,从机输出(数据来自从机);

    • MOSIMaster output slave input 主机输出,从机输入(数据来自主机);

    • SCLKSerial Clock 串行时钟信号,由主机产生发送给从机;

    • SSSlave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

    其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;

    • MISO也可以是SIMODOUTDOSDOSO(在主机端);

    • MOSI也可以是SOMIDINDISDISI(在主机端);

    • NSS也可以是CECSSSEL;

    • SCLK也可以是SCK;

    本文将按照以下命名进行讲解[MISO, MOSI, SCK,NSS]

    下图显示了单个主机和单个从机之间的典型SPI连接。

    主从连接

    时钟频率

    SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输

    主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它。

    就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据;

    从理论上讲,只要实际可行,时钟速率就可以是您想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。

    时钟极性 CKP/Clock Polarity

    除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性

    根据硬件制造商的命名规则不同,时钟极性通常写为CKPCPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;

    CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。

    • CKP = 0:时钟空闲IDLE为低电平 0
    • CKP = 1:时钟空闲IDLE为高电平1

    时钟相位 CKE /Clock Phase (Edge)

    除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKECPHA

    顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

    • CKE = 0:在时钟信号SCK的第一个跳变沿采样;
    • CKE = 1:在时钟信号SCK的第二个跳变沿采样;

    时钟配置总结

    综上几种情况,下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;

    其中黑色线为采样数据的时刻;

    蓝色线为SCK时钟信号;

    具体如下图所示;

    模式编号

    SPI的时钟极性和相位的配置通常称为 SPI模式,所有可能的模式都遵循以下约定;具体如下表所示;

    SPI ModeCPOLCPHA
    0 [00]00
    1 [01]01
    2 [10]10
    3 [11]11

    除此之外,我们还应该仔细检查微控制器数据手册中包含的模式表,以确保一切正常。

    多从机模式

    前面说到SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种:

    第一种方法:多NSS

    1. 通常,每个从机都需要一条单独的SS线。
    2. 如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。

    具体连接方式如下图所示;

    多NSS连接

    第二种方法:菊花链

    菊花链

    在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链

    1. 菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
    2. 另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

    具体的连接如下图所示;

    菊花链连接

    其中红线加粗为数据的流向;

    所以最终的数据流向图可以表示为:

    数据流图

    SCK为时钟信号,8clks表示8个边沿信号;

    其中D为数据,X为无效数据;

    所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。

    优缺点

    SPI通讯的优势

    使SPI作为串行通信接口脱颖而出的原因很多;

    • 全双工串行通信;
    • 高速数据传输速率。
    • 简单的软件配置;
    • 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
    • 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

    SPI的缺点

    • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
    • 通常仅支持一个主设备;
    • 需要更多的引脚(与I2C不同);
    • 没有定义硬件级别的错误检查协议;
    • 与RS-232和CAN总线相比,只能支持非常短的距离;

    编程实现

    下面是通过STM32的cubemx自动生成的HAL库代码,比较简单,截取了其中一部分,具体如下;

    static void MX_SPI1_Init(void)
    {
        hspi1.Instance = SPI1;
        hspi1.Init.Mode = SPI_MODE_MASTER;				//主机模式
        hspi1.Init.Direction = SPI_DIRECTION_2LINES;	//全双工
        hspi1.Init.DataSize = SPI_DATASIZE_8BIT;		//数据位为8位
        hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;		//CPOL=0
        hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;			//CPHA为数据线的第一个变化沿
        hspi1.Init.NSS = SPI_NSS_SOFT;					//软件控制NSS
        hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHz
        hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;			//最高位先发送
        hspi1.Init.TIMode = SPI_TIMODE_DISABLE;			//TIMODE模式关闭
        hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭
        hspi1.Init.CRCPolynomial = 10;					//默认值,无效
        if (HAL_SPI_Init(&hspi1) != HAL_OK)				//初始化
        {
            _Error_Handler(__FILE__, __LINE__);
        }
    }
        
    //发送数据
    HAL_StatusTypeDef  
    HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, 
                     uint8_t *pData, 
                     uint16_t Size, 
                     uint32_t Timeout);
    //接收数据
    HAL_StatusTypeDef  
    HAL_SPI_Receive(SPI_HandleTypeDef *hspi, 
                    uint8_t *pData, 
                    uint16_t Size, 
                    uint32_t Timeout);
    
    展开全文
  • 介绍了在嵌入式系统中一种基于SPI协议实现对SD卡的扩展方法,结合FatFs文件系统,使小型嵌入式系统也能容易、方便地扩展大容量存储器。并在STM32上成功移植,打开SD卡中TXT文本,并通过串口输出文本中的内容。
  • 一文看懂SPI协议

    千次阅读 多人点赞 2021-02-21 15:42:50
    4种工作模式多种传输速率SPI协议的基本时序SPI协议的升级版FPGA实现SPI协议SPI和IIC的对比总结 SPI协议简介 板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI,之前写过串口协议及其FPGA实现,今天我们来...

    SPI协议简介

    板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI,之前写过串口协议及其FPGA实现,今天我们来介绍SPI协议,SPI是Serial Perripheral Interface的简称,是由Motorola公司推出的一种高速、全双工的总线协议。

    与IIC类似,SPI也是采用主从方式工作,主机通常为FPGA、MCU或DSP等可编程控制器,从机通常为EPROM、Flash,AD/DA,音视频处理芯片等设备。一般由SCLK、CS、MOSI,MISO四根线组成,有的地方可能是:SCK、SS、SDI、SDO等名称,都是一样的含义,当有多个从机存在时,通过CS来选择要控制的从机设备。和标准SPI类似的协议,还有TI的SSP协议,区别主要在片选信号的时序上。

    4线还是3线?

    当我们谈到SPI时,默认情况下都是指标准的4线制Motorola SPI协议,即SCLK,MOSI,MISO和CS共4根数据线,标准4线制的好处是可以实现数据的全双工传输。当只有一个主机和一个从机设备时,只需要一个CS,多个从机需要多个CS,各数据线的介绍:

    • SCLK,时钟信号,时钟频率即SPI速率,和SPI模式有关
    • MOSI,主机输出,从机输入,主机数据
    • MISO,主机输入,从机输出
    • CS,从机设备选择,低电平有效。

    3线制SPI,根据不同的应用场景,主要有以下2种类型:

    • 只有3根线:SCLK,MOSI和CS,没有MISO数据线,适用于单工通讯,主机只发送或只接收从机的数据。
    • 只有3根线:SCLK,SDIO和CS,这里的SDIO作为双向端口,适用于半双工通讯,比如ADI的多款ADC芯片都支持双向传输。在使用FPGA操作双向端口时,作为输入时要设置为高阻态z。

    还有标准SPI协议的升级版,Dual SPI、Quad SPI和QPI等,这些协议不在本小节3线/4线制讨论的范围内,文章后面会提到。

    4种工作模式

    既然是进行数据传输,双方就要明确从机在什么时刻去采样主机发出的数据,主机在什么时刻去读取从机发来的数据。对于STM32等MCU自带的硬件SPI外设来说,可能没有那么重要,只需要配置一下模式就行了,但是对于使用使用GPIO模拟或者FPGA来实现SPI的时序,这一点是非常非常重要的,这就涉及到SPI标准协议的工作模式了,通过CPOL(Clock Polarity)时钟极性和CPHA(Clock Phase)时钟相位的不同组合,可以分为4种模式。

    一般从机器件的工作模式是固定的,主机需要采用一样的工作模式,双方才能正常“交流”。

    CPOL=0表示,SCK在空闲状态时为0
    CPOL=1表示,SCK在空闲状态时为1
    CPHA=0表示,在SCK第一个边沿时输入输出数据有效
    CPHA=1表示,在SCK第二个边沿时输入输出数据有效
    

    这四种模式中,应用最广泛的是模式0和3,大多数SPI器件都同时支持这两种工作模式,其实这些都不重要,具体采用什么模式,看你的器件手册就知道了。

    以我最近工作中使用到的一款Cypress的铁电存储器FM25V05为例,在其官方DataSheet上介绍同时支持SPI Mode 0和Mode 3,

    根据后面的时序图,可以得知SPI mode 0的读写时序,图中可以看出SCK空闲状态为低电平,主机数据在每个上升沿被从机采样,数据输出同理。

    对于SPI mode3,SCK空闲状态为高电平,主机数据在每个上升沿被从机采样,数据输出同理。

    模式1和模式2同理,模式1即CPOL=0,CPHA=1,SCK空闲为0,在SCK第二个边沿时数据有效,即SCK下降沿有效。

    模式2即CPOL=1,CPHA=0,SCK空闲为1,在SCK第一个边沿时数据有效,即SCK下降沿有效。

    在一些自带SPI硬件外设的MCU上,设置主机的SPI模式非常简单,只需要配置几个寄存器的值即可,而且是写了SCK高电平还是低电平,和第一个还是第二个边沿,不用去记忆等于0还是等于1。以STM32F103硬件SPI配置为例:

    SPI_InitTypeDef  SPI_InitStruct;
    
    SPI_InitStruct.SPI_Mode =SPI_Mode_Master;       //主
    .....
    SPI_InitStruct.SPI_CPOL =SPI_CPOL_High; //SCK空闲时为高电瓶
    SPI_InitStruct.SPI_CPHA =SPI_CPHA_1Edge;//SCK第一个边沿有效
    .....
    SPI_Init(SPI2,&SPI_InitStruct);
    

    而在FPGA中实现,需要严格根据时序来控制SCK和数据的输入输出。

    多种传输速率

    SCK的速率就是SPI的传输速率,SPI协议没有一个固定的速率,不像IIC标准模式100K,快速模式400K,高速模式3.4M,SPI的传输速率取决于器件本身支持多高的速率,器件手册里都有描述,以FM25V05铁电EPROM为例:2021-02-20_224213

    不同电源电压情况下的最大SCK时钟频率:

    SPI协议的基本时序

    CS为低电平时,表示对应的从机设备被使能,在每个SCLK周期可以传输1Bit数据,采样时刻取决于器件支持的SPI mode,根据不同SPI器件的控制方法,在进行正式的数据读写操作前,一般需要先写入控制字,然后是寄存器地址和数据。下图是FM25V05铁电存储器采用SPI模式0的写时序:

    读时序:

    如果要使用FPGA来实现SPI时序,在CS下降沿和SCLK第一个边沿,或CS上升沿和SCLK最后一个边沿之间要留有一定的延迟时间,一般是0.5个SCLK周期。

    一些SPI从机设备支持菊花链连接模式,即节省GPIO,又不会占据太多布线面积,但并不是所有的SPI器件都支持菊花链模式。

    控制时序:

    SPI协议的升级版

    传统标准的SPI协议,一个SCLK周期只能传输1Bit数据,能不能一个SCLK传输多个Bit数据呢?答案是可以的。Motorola公司在现有的标准4线SPI协议上,又开发出了多种SPI协议的升级版,通过增加数据线位数的方式,来提高数据传输的效率,目前很多Flash厂家都已经支持多种SPI协议。

    以比较常用的一款SPI Flash ROM W25Q128FW为例,在其器件手册上写着除了标准的4线SPI模式,还支持Dual SPI,Quad SPI,QPI等,在这几种模式下,IO0/1/2/3这些IO作为双向端口,大大增加了数据读写的速率。

    QSPI协议读写时序:

    一些支持QSPI协议的Flash芯片型号:

    FPGA实现SPI协议

    FPGA实现UART、SPI、IIC等串行时序,最常用的就是状态机大法,将各个步骤分解为各个状态,然后根据不同的状态去控制输出或读取输入,细节方面需要考虑数据的对齐、建立和保持时间、一些异常情况时状态的跳转,不能进入死循环,或卡死在某一个状态。

    下图的波形是使用Xilinx FPGA对一款铁电存储器FM25V05的驱动,采用标准4线SPI协议,和IIC接口的ERPOM操作方式类似:先写控制字,再写地址,再写数据或者读数据,SCK时钟频率40MHz,使用ChipScope抓取到的实际读写波形,在SCK低电平中间数据改变,在SCK上升沿左右数据要保持稳定。

    SPI写时序,需要注意的是先写使能命令,然后重新产生CS信号,这一块卡了好久,在官方示例的C代码中才发现了问题所在,还是对手册上的时序理解不到位。

    FM25V05写时序

    SPI读时序,先写控制字,再写16位地址,然后读8位数据。

    FM25V05读时序

    SPI和IIC的对比

    • SPI是全双工,而IIC是半双工。
    • IIC支持多主机多从机模式,而SPI只能有一个主机。
    • 从GPIO占用上来看,IIC占用更少的GPIO,更节省资源。
    • SPI的数据位宽更灵活,可以根据需要选择多位数据宽度。
    • SPI协议没有响应机制,主机无法得知从机是否接收到所发的数据,如果不采取一些方法的话可能会导致数据丢帧。
    • 正是因为没有复杂的响应机制,SPI协议可以做到非常高的速率(上百兆),每一个SCK都可以进行数据的传输,通过引入CRC校验等校验方法,可以即高速传输数据,又能保持数据的准确度。
    • IIC通过器件地址来选择从机,从机数量的增加不会导致GPIO的增加,而SPI通过CS选择从机,每增加一个从机就要多占用一个GPIO,当然也可以通过加入译码器来实现多从机控制。
    • 两者大多都应用于板内器件短距离通讯。

    总结

    使用FPGA来实现SPI时序,最大的好处就是灵活,时序可以根据需要精确的定制,可以实现非常高的速率,特别是同时驱动多片芯片上有很大的优势,在一些高速AD采集的场合必须使用FPGA来实现,难点就是做起来比较麻烦,需要一点点的调试,仿真,虽然FPGA也有一些现成的IP可以使用,但还是不够灵活。不像STM32等MCU那样有现成的库函数和寄存器简单几行代码配置一下,就可以实现主从模式、SPI模式、数据位宽、多种速率、单线双线、半双工全双工、DMA等等。总之,FPGA和MCU各有优点,也各有不足,根据需求来选择吧!无论采用什么控制器实现,只要根据数据手册严格控制时序,就没有什么协议是不能搞定的!

    展开全文
  • SPI协议详解

    万次阅读 多人点赞 2018-09-19 15:15:27
    1.SPI协议简介 1.1.SPI协议概括  SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,...

    1.SPI协议简介

    1.1.SPI协议概括

      SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.

    SPI主从模式硬件连接如下图

      SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

    • SDO     – 主设备数据输出,从设备数据输入 对应MOSI master output slave input
    • SDI      – 主设备数据输入,从设备数据输出  对应MISO master input slave output
    • SCLK   – 时钟信号,由主设备产生
    • CS        – 从设备使能信号,由主设备控制

      CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

      SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

      要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。

    这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

    在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

    最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

    AT91RM9200的SPI接口主要由4个引脚构成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整个SPI总线的公用时钟,MOSI、MISO作为主机,从机的输入输出的标志,MOSI是主机的输出,从机的输入,MISO 是主机的输入,从机的输出。/SS是从机的标志管脚,在互相通信的两个SPI总线的器件,/SS管脚的电平低的是从机,相反/SS管脚的电平高的是主机。在一个SPI通信系统中,必须有主机。SPI总线可以配置成单主单从,单主多从,互为主从。

    SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。

    2.协议举例

    如下图,是SPI的简单收发时序图。

    SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
           假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
           那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。 

    举例: 
           假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

    这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

         

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

                                                        

    3. SPI总线四种工作方式

    SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

           时序详解:

      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种工作模式波形时序如下图:

    åç§å·¥ä½æ¹å¼æ¶åº

    4.协议心得

    SPI接口时钟配置心得:

      在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。下面这段话是Sychip Wlan8100 Module Spec上说的,充分说明了时钟极性是如何配置的:

    The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.

    意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。

    又如,下面这段话是摘自LCD Driver IC SSD1289:

    SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

    意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到地位的顺序接收数据的。因此主设备的SPI时钟极性同样应该配置为下降沿有效。

    时钟极性和相位配置正确后,数据才能够被准确的发送和接收, 因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。

    5.SPI协议软件模拟

    5.1.单片机软件模拟SPI接口—加深理解SPI总线协议

            现以 AT89C205l单片机模拟SPI总线操作串行EEPROM 93CA6为例,如图1所示,介绍利用单片机的I/O口通过软件模拟SPI总线的实现方法。在这里,仅介绍读命令的时序和应用子程序。 

    5.2.93C46存储器SPI总线的工作原理

              93CA6作为从设备,其SPI接口使用4条I/O口线:串行时钟线(SK)、输出数据线DO、输入数据线DI和高电平有效的从机选择线CS。其数据的传输格式是高位(MSB)在前,低位(LsB)在后。93C46的SPI总线接口读命令时序如图2所示。 

    5.3.软件模拟SPI接口的实现方法 

              对于不带SPI串行总线接口的AT89C2051单片 机来说,可以使用软件来模拟SPI的操作,图1所示 为AT89C2051单片机与串行EEPROM 93C46的硬件 连接图,其中,P1.0模拟SPI主设备的数据输出端 SDO,P1.2模拟SPI的时钟输出端SCK,P1.3模拟 SPI的从机选择端SCS,P1.1模拟SPI的数据输入 SDI。
             上电复位后首先先将P1.2(SCK)的初始状态设置为0(空闲状态)。
             读操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(10),6位被读的数据地址(A5A4A3A2A1A0),然后通过P1.1口读1位空位(0),之后再读l6位数据(高位在前)。
             写操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(01),6位被写的数据地址(A5A4A3A2A1A0),之后通过P1.0口发送被写的l6位数据(高位在前),写操作之前要发送写允许命令,写之后要发送写禁止命令。
             写允许操作(WEN)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(11XXXX)。              

             写禁止操作(WDS)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。

            下面介绍用C51模拟SPI的子程序。

    /*例子1*/
    //首先定义好I/O口
    sbit SDO=P1^0;
    sbit SDI=P1^1;
    sbit SCK=P1^ 2;
    sbit SCS=P1^3;
    sbit ACC_7= ACC^7;
    unsigned int SpiRead(unsigned char add)
    {
        unsigned char i;
        unsigned int datal6;
        add&=0x3f;/*6位地址*/
        add |=0x80;/*读操作码l0*/
        SDO=1;/*发送1为起始位*/
        SCK=0;
        SCK=1;
        for(i=0;<8;i++)/*发送操作码和地址*/
        {
            if(add&0x80==1)
                SDO=1;
            else 
                SDO=0;
            SCK=0;/*从设备上升沿接收数据*/
            SCK=1;
            add<<= 1;
        }
        SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/
        SCK=0;
        datal6<<= 1;/*读16位数据*/
        for(i=0;<16;i++)
        {
            SCK= 1;
            _nop_();
            if(SDI==1)
                datal6|=0x01;
            SCK =0;
            datal6< < =1;
        }
        return datal6;
    }
        
    /*例子2*/
        #define SS      252                     //定义SS所对应的GPIO接口编号  
        #define SCLK    253                     //定义SCLK所对应的GPIO接口编号  
        #define MOSI    254                     //定义SCLK所对应的GPIO接口编号  
        #define MISO    255                     //定义MISO所对应的GPIO接口编号  
        #define OUTP    1                       //表示GPIO接口方向为输出  
        #define INP 0                           //表示GPIO接口方向为输入  
        
        /* SPI端口初始化 */  
        void spi_init()  
        {  
            set_gpio_direction(SS, OUTP);  
            set_gpio_direction(SCLK, OUTP);  
            set_gpio_direction(MOSI, OUTP);  
            set_gpio_direction(MISO, INP);  
            set_gpio_value(SCLK, 0);//CPOL=0 
            set_gpio_value(MOSI, 0);
        }  
        /*  
        从设备使能  
        enable:为1时,使能信号有效,SS低电平  
        为0时,使能信号无效,SS高电平  
        */  
        void ss_enable(int enable)  
        {  
            if (enable)  
                set_gpio_value(SS, 0);//SS低电平,从设备使能有效  
            else  
                set_gpio_value(SS, 1);//SS高电平,从设备使能无效  
        }  
        
        /* SPI字节写 */  
        void spi_write_byte(unsigned char b)  
        {  
            int i;  
            for (i=7; i>=0; i--) {  
                set_gpio_value(SCLK, 0);  
                set_gpio_value(MOSI, b&(1<<i));//从高位7到低位0进行串行写入  
                delay();//延时  
                set_gpio_value(SCLK, 1);// CPHA=1,在时钟的第一个跳变沿采样  
                delay();      
            }  
        }  
        /* SPI字节读 */  
        unsigned char spi_read_byte()  
        {  
            int i;  
            unsigned char r = 0;  
            for (i=0; i<8; i++) {  
                set_gpio_value(SCLK, 0);  
                delay();//延时  
                set_gpio_value(SCLK, 1);// CPHA=1,在时钟的第一个跳变沿采样  
                r = (r <<1) | get_gpio_value(MISO);//从高位7到低位0进行串行读出  
                delay();  
            }  
        }  
        /*  
            SPI写操作  
            buf:写缓冲区  
            len:写入字节的长度  
        */  
        void spi_write (unsigned char* buf, int len)  
        {  
            int i;  
            spi_init();//初始化GPIO接口  
            ss_enable(1);//从设备使能有效,通信开始  
            delay();//延时  
            //写入数据  
            for (i=0; i<len; i++)
                spi_write_byte(buf[i]);
            delay();
            ss_enable(0);//从设备使能无效,通信结束  
        }  
        /*  
        SPI读操作  
        buf:读缓冲区  
        len:读入字节的长度  
        */  
        void spi_read(unsigned char* buf, int len)  
        {  
            int i;  
            spi_init();//初始化GPIO接口  
            ss_enable(1);//从设备使能有效,通信开始  
            delay();//延时  
            //读入数据
            for (i=0; i<len; i++)
                buf[i] = spi_read_byte();
            delay();
            ss_enable(0);//从设备使能无效,通信结束  
        }

      对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。

     

    6. Linux下的SPI源码

    链接:https://pan.baidu.com/s/1Jm_gDxj-to965ZH3I16dug 密码:c9ki

    加我微信,拉进微信技术讨论群

         喜欢的可以关注微信公众号-嵌入式Linux

     

    展开全文
  • SPI协议

    2021-07-16 16:06:45
    目录SPI协议简介SPI物理层SPI协议SPI协议简介 SPI协议是由摩托罗拉公司提出的通信协议(Serial Peripheral interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间...

    前言

    本文是学习火哥的STM32教程所做的学习笔记。

    SPI协议简介

    SPI协议是由摩托罗拉公司提出的通信协议(Serial Peripheral interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

    SPI物理层

    SPI通讯设备之间的常用连接方式见图:
    常见的SPI通讯系统

    SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为SS,它们的作用介绍如下:

    • SS(Slave Select):从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下皆称为NSS。每个从设备都有独立的这一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。

    • SCK(Serial Clock):时钟信号线,用于通讯数据同步。

      它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

    • MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚。

      主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

    • MISO(Master Input,Slave Output):主设备输入/从设备输出引脚。

      主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

    SPI协议层

    SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同步性等环节。

    1. SPI基本通讯过程

      先看看SPI通讯的通讯时序,见图:
      SPI通讯时序

    2. 通讯的起始和停止信号

      • 标号①处,NSS信号线由高变低,是SPI通讯的起始信号.NSS是每个从机各自独占的信号线,当从机在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
      • 在图中的标号⑥处,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
    3. 数据有效性
      SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。MSB先行或LSB先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定, 一般都会采用图中的MSB先行模式。

    4. CPOL/CPHA及通讯模式
      CPHA=0时的SPI通讯模式

      • 时钟极性CPOL是指SPI通讯设备处于十分空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、NSS线为高电平时SCK的状态)。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时,则相反。
      • 时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时,数据线在SCK的“偶数边沿”采样。
      • NSS信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。
      • CPHA=0,MOSI和MISO数据线的有效信号在SCK的奇数边沿保存不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。

      CPHA=1时的SPI通讯模式

      • NSS信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。
      • CPHA=1,MOSI和MISO数据线的有效信号在SCK的偶数边沿保存不变,数据信号将在SCK偶数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。

      如图由于CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式0”与“模式3”。
      SPI的四种模式

    展开全文
  • 单片机外设篇——SPI协议

    千次阅读 2021-01-31 14:15:40
    文章目录前言一、SPI协议是什么?1. 优点2. 缺点3. 结构二、SPI协议1. 模式概念理解2. 通信过程分析3. SPI个人协议理解总结 前言 题目上写的是单片机,其实不管你的板子上不上系统(FreeRtos、Linux),协议都是...
  • SPI协议的Verilog_实现

    2013-04-26 14:08:42
    SPI协议的Verilog_实现,SPI接口在CPLD或FPGA中的代码实现。
  • SPI协议笔记

    2018-12-04 16:29:43
    SPI(Serial Peripheral Interface – 串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,是...本文档简要说明SPI的物理架构和协议原理,是SPI的学习笔记。
  • SPI 协议详解

    千次阅读 2020-09-21 17:20:07
    SPI 协议详解1、SPI 简介2、SPI四线3、SPI四种工作模式4、SPI时序图 1、SPI 简介 SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速...
  • SPI协议_Verilog实现

    千次阅读 多人点赞 2020-06-03 08:26:08
    SPI协议_Verilog实现 概述: 通过Verilog代码+仿真的形式来理解SPI的时序,此处只写了主机发送,从机接收的代码,后待续。。。 SPI协议简介 ●SPI接口介绍  SCK:时钟信号,由主设备产生,所以主设备SCK信号为输出...
  • FPGA SPI协议

    千次阅读 2021-01-14 11:22:47
    本篇主要介绍SPI协议在FPGA内部的实现,如何使用Verilog语言来搭建硬件描述电路,通过一款SPI通信协议的芯片ADC128S022来具体讲解,ADC128S022是一款AD转换芯片,具有8通道。 SPI概念: SPI(Serial Peripheral ...
  • 14-SPI协议及驱动讲解

    千次阅读 2019-10-31 10:54:01
    SPI协议简介1.1 SPI典型连接1.2 SPI时序1.3 SPI的四种工作模式2. Linux SPI驱动2.1 spi_device2.2 设备树2.3 spi_driver2.4 SPI驱动注册和注销函数2.5 驱动中SPI数据的传输2.6 SPI中的ioctl命令3 总结 1. SPI协议...
  • 通讯协议 - SPI协议学习笔记

    千次阅读 2019-04-26 20:21:24
    一、SPI简介 二、常见SPI标准 常见4线制 / 3线制标准 3线制&4线 SPI区别 接口介绍 SPI的四种工作模式 三、工作机制 四、SPI通信时序 SPI时序 模拟SPI 五、注意事项 一、SPI简介 SPI(Serial ...
  • SPI协议代码

    千次阅读 多人点赞 2020-06-01 09:29:17
     通过两个MCU(STM32F103)来模拟SPI的主从机,完成主机发送从机接收,便于理解SPI协议SPI协议简介 ●SPI接口介绍  SCK:时钟信号,由主设备产生,所以主设备SCK信号为输出模式,从设备的SCK信号为输入模式。 ...
  • 软件模拟SPI协议

    2021-01-12 15:47:24
    软件模拟SPI协议什么是SPISPI的通讯模式通讯协议详细程序简写程序结语 最近在学习51单片机的内容,为了防止自己学过就忘,在这里写一些平时的学习笔记,如果有错误希望大家可以给我指正一下。这里是最近学习的SPI...
  • 很详细的SPI协议 规范

    2011-05-27 14:58:48
    很详细的SPI协议 规范很详细的SPI协议 规范很详细的SPI协议 规范
  • SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 SPI...
  • 基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】-附件资源
  • MOTOROLA的SPI标准协议

    2020-12-03 14:50:51
    该文档是MOTOROLA的SPI标准协议,V3.06版本,非常适合学习SPI的工程师学习使用。如有问题请联系我。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,037
精华内容 12,814
关键字:

spi协议