arduino怎么用spi读从机寄存器数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arduino怎么用spi读从机寄存器数据相关的知识,希望对你有一定的参考价值。

硬件SPI的MOSI,MISO,SCK是可以复用的,SS是片选信号,每个设备要单独一个引脚,低电平时可以让设备激活,同时其他设备的SS信号保持高电平,要操作那个设备,就让连接该设备的SS引脚变低即可。 同步串行外设接口总线(SPI) 参考技术A 题主解决这个问题了吗,我也有这个疑问

spi基本概念

串行外设接口(Serial Peripheral Interface,SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。

 SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。SPI接口可以是3线式或4线式。本文重点介绍常用的4线SPI接口。

 

接口

技术图片

4线SPI器件有四个信号:

时钟(SPI CLK,SCLK):串行时钟,用来同步数据传输,由主机输出;

片选(CS):片选线,低电平有效,由主机输出;

主机输出、从机输入(MOSI):主机输出从机输入数据线;

主机输入、从机输出(MISO):主机输入从机输出数据线。

 产生时钟信号的器件称为主机。主机和从机之间传输的数据与主机产生的时钟同步。与I2C接口相比,SPI器件支持更高的时钟频率。SPI接口只能有一个主机,但可以有一个或多个从机。上图显示了主机和从机之间的SPI连接。

 来自主机的片选信号用于选择从机。这通常是一个低电平有效信号,拉高时从机与SPI总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。MOSI和MISO是数据线,MOSI将数据从主机发送到从机,MISO将数据从从机发送到主机。

 

 

时钟极性和时钟相位

在SPI中,主机可以选择时钟极性和时钟相位。

时钟极性CPOL(Clock Polarity):是用来配置SCLK的电平处于哪种状态时有效。

CPOL=0:表示高电平有效,低电平处于空闲态。

CPOL=1:表示低电平有效,高电平处于空闲态。

时钟相位CPHA(Clock Phase):是用来配置数据采样是在第几个边沿,0表示第一个边沿(前沿Leading edge),1表示第二个边沿(后沿Trailing edge)。

CPHA=0:表示数据采样是在第1个边沿,数据发送在第2个边沿。

CPHA=1:表示数据采样是在第2个边沿,数据发送在第1个边沿。

主机必须根据从机的要求选择时钟极性和时钟相位,也即从机的传输模式决定了主机的传输模式。故先要了解从机的SPI是何种模式,然后再将主机的SPI的模式设置成同样的模式,即可正常通讯。根据CPOL和CPHA位的选择,有四种SPI模式可用。

技术图片

四种模式采样/输出时序图如下,其中应用比较多的是SPI0/SPI3两种模式:

技术图片

 

 

SPI数据传输与交换

要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。

SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读取MISO/SDI总线上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。

 SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)" 或者"接收者(Receiver)"。在每个Clock周期内, SPI设备都会发送并接收一个bit大小的数据(不管主设备还是从设备),相当于该设备有一个bit大小的数据被交换了。

技术图片

SPI设备通信过程中,Master设备和Slave设备之间会产生一个数据链路回环(Data Loop),SSPSR控制数据移入移出SSPBUF,Controller确定SPI总线的通信模式,SCLK传输时钟信号。

在每个时钟周期内,Master与Slave之间交换的数据其实都是SPI移位寄存器从SSPBUF里面拷贝的。我们可以通过往SSPBUF对应的寄存器 (Tx-Data/Rx-Data register) 里读写数据,间接地操控SPI设备内部的SSPBUF。

例如,在发送数据之前,我们应该先往Master的Tx-Data寄存器写入将要发送出去的数据,这些数据会被Master-SSPSR移位寄存器根据Bus-Width自动移入Master-SSPBUF里, 然后这些数据又会被Master-SSPSR根据Channel-Width从Master-SSPBUF中移出,通过Master-SDO管脚传给Slave-SDI管脚,Slave-SSPSR则把从Slave-SDI接收到的数据移入Slave-SSPBUF里。与此同时,Slave-SSPBUF里面的数据根据每次接收数据的大小(Channel-Width), 通过Slave-SDO发往Master-SDI,Master-SSPSR再把从Master-SDI接收的数据移入 Master-SSPBUF。在单次数据传输完成之后,用户程序可以通过从Master设备的Rx-Data寄存器读取Master设备数据交换得到的数据。

 

多从机配置

在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

技术图片

在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。

 技术图片

 

 

参考文档:

https://www.sohu.com/a/271099924_292853

以上是关于arduino怎么用spi读从机寄存器数据的主要内容,如果未能解决你的问题,请参考以下文章

avr单片机中spi通信 要取从机的数据,从机数据在啥时候写入SPDR寄存器?最好有例子。

SPI怎么区分主从? 两个设备之间通过SPI连接,根据啥来定义主从?

Modbus常用功能码协议

SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_软件篇

带寄存器的 Arduino Uno SPI

STM32F405 裸机 SPI 从机 - MISO 数据有时会混乱