我一直以为SPI比IIC难的,因为可能是因为使用了比较“重型”的传感器才会搭配这个接口。
但是今天用FPGA写了一个简单的移位寄存器,感觉不一样,甚至是不对劲。
移位寄存器按照移位方向可分为左移位寄存器、右移位寄存器、双向移位寄存器。
这个图记住,菊花链也跑不了
这个是STM32F103的主从设备的示意
MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
其实最近一段时间我频繁在机器人系统里面,比如FPGA和ARM的控制核之间,发现它们之间的交互都是使用SPI。也就是说设计人员需要具有简单的设备到设备数字接口的微控制器、外设和传感器,以便可以高速处理任意长度的数据,并且省去与协议相关的复杂编程任务。
基本SPI全双工连接使用两条数据线(MOSI、MISO)、一条时钟线 (SCK) 和一条片选线 (CS)。从设备上的MOSI有时标记为从设备数据输入 (SDI)。MISO可标记为从设备数据输出 (SDO)。
两种处理多个从设备连接的配置。直接连接方式下每个从设备需要一个片选信号。菊花链连接方式仅使用一个片选信号,并将所有数据集中在一条线上。
主要看箭头,多个从机
菊花链
在菊花链模式下,所有从机的片选信号连接在一起,数据从一个 从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI 时钟。
来自主机的数据直接送到第一个从机,该从机将数据提供 给下一个从机,依此类推。使用该方法时,由于数据是从一个从机传播到下一个从机,所以 传输数据所需的时钟周期数与菊花链中的从机位置成比例。
在图所示的8位系统中,为使第3个从机能够获得数据,需要24个 时钟脉冲,而常规SPI模式下只需8个时钟脉冲。
一般Master设备就是我们的MCU,Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal) ,时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。
SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)"。
在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于该设备有一个 bit 大小的数据被交换了。一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以,Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上。
在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。
因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的(虽然发送后紧接着的读取是无意义的,但仍然需要从寄存器中读出来)。
在SPI通信期间,数据的发送 (串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/ SDI)上的数据)同时进行。
所以捏SPI没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
就像IIC一样,SPI也是需要找到谁在通讯的,比较费引脚,必须有一个片选的脚。来自主机的片选信号用于选择从机。这通常是一个低电平有效信号,拉高时从机与SPI总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。
要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。
因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别 通过MOSI和MISO线路同时发送数据。
在SPI中,主机可以选择时钟极性和时钟相位。
在空闲状态期间,CPOL位设置时钟信号的极性。空闲状态是指传输开始时CS为 高电平且在向低电平转变的期间,以及传输结束时CS为低电平且 在向高电平转变的期间。
CPHA位选择时钟相位。根据CPHA位的状态,使用时钟上升沿或下降沿来采样和/或移位数据。主机必须根据从机的要求选择时钟极性和时钟相位。根据CPOL和CPHA位的选择,有四种SPI模式可用。
数据显示在MOSI和MISO线上。传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。
SPI模式0,CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。
一采样,一移位。
由主设备控制并生成时钟。时钟的两个属性分别是时钟极性 (CPOL) 和时钟相位 (CPHA)。这些属性控制从设备相对数据进行计时的有效时钟边沿。CPOL = 0时,将时钟设为在逻辑0位置空闲。CPOL = 1时,时钟在逻辑1位置空闲。CPHA = 0时,数据在上升沿计时,CPHA = 1时,数据在下降沿计时(图3)。
SPI时钟模式选择确定了进行数据采样的有效时钟边沿。
主设备中的CPOL和CPHA线路设置决定了时钟极性以及进行数据计时的有效边沿。模式1是最常用的模式,但设计人员同样可以使用其他三种模式。
上面的轨迹是数据线,中间的轨迹是时钟,底部的轨迹是片选信号。数据轨迹上的蓝色覆盖区显示的是十六进制解码内容。
让我来带你看个MC的芯片手册,看看不一样的SPI。
一个SPI的温度计
别问咋搞,直接街上
很多的时候,我们是使用传感器直接写,但是在机器人里面我们需要自己写一个传输的协议,这个是后话。
我们先看一个电气层的参数。
首先建立这些的时间都是ns级别,怎么说呢,俺说不明白。
说说这些东西的意思,我觉得是满足不同人的需求,比如我现在就拿出一块51,我就能输出个高低电平,你能咋。
所以这些写模拟协议的时候就有用,因为对于器件来说,我才不管什么东西插了我,反正说的通就行。
片选 (Chip Enable, CE) 、串行时钟 (Serial Clock, SCK) 、串行数据输入 (Serial Data Input,SDI)以及串行数据输出(Serial Data Output, SDO )信号线。
CE 输入用于在有多个器件连接到串行时钟和数据线时选择器件。CE 为高电平有效,当 CE 等于逻辑高电平时,数据可以写入器件或从器件读出。CE 为低电平 时, SCK 输入被禁止。
抬高的时候,就是到我啦!
CE 线的上升沿启动读或写操作,而 CE 的下降沿结束读或写操作。
SCK 输入由外部单片机提供,用于同步 SDI 和 SDO 线 的数据。
SDI 输入向传感器的控制寄存器写入数据,而 SDO从温度寄存器中输出温度数据和控制寄存器关断位的状态。
传感器具有能在 SCK输入信号为有效高电平或低电平时工作的能力。当 CE 信号变成高电平时,检测到 SCK 的 无效状态,而时钟输入 (CP)的极性决定数据是在系统时钟的上升沿或下降沿移入或移出。
给出了用于传送数据到寄存器和从寄存器移出数 据的相应时钟边沿。每个时钟脉冲传送一位数据,数据位以 8 位为一组传送。
A就是地址
先发送地址字节,随后为数据。地址的最高位 A7 决定 要进行读操作还是写操作。
如果 A7 =“0”,将进行一个或多个读操作;否则 A7 = “1”,进行一个或多个写操作。
地址+L+M
数据可以采用单字节或多字节包的方式进行传送,如图所示。在 3 字节包中,数据序列包括温度数据的 MSb、温度数据的 LSb 和紧接着的控制寄存器数据。通 过向寄存器写入所需数据包的最高地址来启动多字节读功能。
这段有问题,我明天改正。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !