linux驱动开发----SPI驱动(SPI基础知识)

注:本文针对xilinx的zynqMP系列芯片讲解SPI驱动

一、引言

        SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构。支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first)。SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。

二、SPI总线结构

linux驱动开发----SPI驱动(SPI基础知识)_第1张图片

三、SPI接口

        SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。

                                          linux驱动开发----SPI驱动(SPI基础知识)_第2张图片

MOSI

主器件数据输出,从器件数据输入

MISO

主器件数据输入,从器件数据输出

SCLK

时钟信号,由主器件产生

SS

从器件使能信号,由主器件控制

 四、SPI工作原理      

        SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。

linux驱动开发----SPI驱动(SPI基础知识)_第3张图片

在一个SPI时钟周期内,会完成如下操作:

  1. 主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;
  2. 从机通过MISO线发送1位数据,主机通过该线读取这1位数据。这是通过移位寄存器来实现的。如下图所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。

注意:SPI控制器工作时,主机每发送一个字节,从机在收到主机的一个字节后,从机将缓冲区中的一个字节也放到MISO上,传输给主机,因此不管是主机对从机进行读操作,还是写操作,都需要主机来向MOSI总线上写数据,而读操作和写操作的区别就在于,写操作是直接往MOSI总线上写就行了,对于同时从MISO上返回的数据直接丢掉,而读操作是往MOSI上写数据,同时收取MISO上返回的数据。SPI的这种工作方式决定了其收发是同时的,所以效率比232/422/485这种串口高。

linux驱动开发----SPI驱动(SPI基础知识)_第4张图片

五、SPI接口的优缺点

  • 优点:
  1. 支持全双工操作;
  2. 操作简单;
  3. 数据传输速率较高(相对的)。
  • 缺点:
  1. 多个spi设备需要占用主机较多的管脚(每个从机都需要一根片选线);
  2. 只支持单个主机;
  3. 没有指定的流控制,没有应答机制确认是否接收到数据。

六、SPI工作模式

SPI有四种工作模式,具体由CPOL(Clock Polarity 时钟极性),CPHA(Clock Phase时钟相位)决定

MODE0 CPOL=0,CPHA=0
MODE1 CPOL=0,CPHA=1
MODE2 CPOL=1,CPHA=0
MODE3 CPOL=1,CPHA=1
  • 当CPOL为0时,空闲的时候SCLK电平是低电平;
  • 当CPOL为1时,空闲的时候SCLK电平是高电平;
  • 当CPHA为0时,采集数据发生在时钟周期的前边缘(第一个边缘,可能是上升缘也可能是下降缘,由CPOL决定),这同时意味着输出数据发生在后边缘;
  • 当CPHA为1时,采集数据发生在时钟周期的后边缘(第二个边缘,可能是上升缘也可能是下降缘,由CPOL决定),这同时意味着输出数据发生在前边缘;

摘抄一张网上的图:

linux驱动开发----SPI驱动(SPI基础知识)_第5张图片
        我们编写spi接口的设备驱动程序的时候,最需要关心的就是spi控制器的部分是spi设备采用的是那种模式,确定模式后,我们得将spi控制器配置成一样的模式才能正常工作。所以说如何选择SPI控制器的工作模式,是根据从设备的工作模式来定的,一般从设备是FLASH、eeprom之类的存储介质,其工作模式是在出厂时就确定的,所以只能通过修改SPI控制器的工作模式,来适应从设备,从而实现SPI通信流程。

二、zynqMP芯片的SPI控制器

  1. 介绍

SPI总线控制器支持与各种外设的通信,例如内存,温度传感器,压力传感器,模拟转换器,实时时钟,显示器,以及任何支持串行模式的SD卡。SPI控制器可以在主机模式、从机模式或多主机模式这三种模式下工作。在ZYNQMP系列芯片中包含有两个SPI实例控制器,两个控制器完全相同,并都可以由软件独立控制驱动。这两个SPI控制器可以同时操作,以下讨论适用于两个SPI控制器的实例。

  1. 特征

  • 全双工操作可同时接收和发送。

  • 主机或从机SPI操作模式。

  • 四线bus:数据RX,数据TX,时钟和片选。

  • 支持多主机环境:如果不止一个主机被探测到,则指出错误情况

  • 内存映射的APB接口。

  • 具有独立的发送和接收FIFO的缓冲操作:APB可以读取

RXFIFO以及写入TXFIFO。

  • 在主模式下,可以从三个独立的时钟源之一来产生SPI时钟

  • 可编程的主模式时钟频率。

  • 具有可编程极性的串行时钟。

  • 可编程的传输格式。

  • 通过DUT输出或通过软件访问寄存器的方式获得FIFO级别。

  • FIFO级别状态可以通过软件查询或可以由中断驱动。

  • 可编程中断产生。

  1. 功能说明

图23-1显示了SPI控制器框图

linux驱动开发----SPI驱动(SPI基础知识)_第6张图片

3.1 FIFOs

RX和TX FIFO的深度均为128字节。 软件使用寄存器映射的数据端口寄存器来读取和写入这些FIFO。 FIFO桥接两个时钟域, APB接口(LPD_LSBUS_CLK)和控制器的SPI_REF_CLK。 软件在APB时钟域中写入TXFIFO,控制器读取SPI_Ref_Clk域中的TXFIFO。控制器在SPI_Ref_Clk域中将RXFIFO填满,然后软件会在APB时钟域读取RXFIFO。

3.1.1接收FIFO

如果控制器尝试将数据发送到已满的RXFIFO中,则内容将丢失,并且粘性溢出标志被置位。如果没有数据添加到已满的RXFIFO。 软件将写1来清除[RX_OVERFLOW]位。

3.1.2 发送FIFO

如果软件尝试将数据写入已满的TXFIFO,则该写入会被忽略,没有数据可以添加到已满的TXFIFO。[TX_FIFO_full]位被置位,直到读取TXFIFO并TXFIFO不再满。 如果TXFIFO溢出,则 [RX_OVERFLOW]位置1。

3.2 时钟

SPI控制器从PS时钟子系统接收两个时钟输入,在从模式下,时钟来自连接的SPI主设备的SCLK时钟。

  1. SPI_REF_CLK时钟操作主机模式下SCLK控制器和输入的波特率分频器。

  2. LPD_LSBUS_CLK时钟操作APB从接口来访问寄存器。

这些时钟彼此异步运行。 时钟生成在第37章PS Clock子系统中进行了介绍,时钟频率规格在数据手册中定义。

3.2.1 主模式SCLK

在主机模式下,I/O信号由控制器产生的SCLK来计时,从SPI_REF_CLK中使用spi.Config [BAUD_RATE_DIV] 字段使用波特率分频器。 波特率分频器的范围从最小4到最大256以二进制步长(即除以4、8、16,... 256)。 从机片选选择输入引脚必须被SCLK输入同步驱动。

3.2.2 从模式SCLK

在从模式下,控制器采样MOSI和SS I/O信号并驱动MISO使用来自所连接主机的SCLK发送信号。 输入信号同步到SPI_REF_CLK并由控制器处理。

注意:为了正确检测SPI总线上字传输的开始,SPI_REF_CLK频率应至少为控制器SCLK频率的2倍。

3.3复位

控制器由PS复位子系统单独复位,也可以由系统或POR复位复位。

  1. SPI控制器操作模式

SPI控制器以三种模式运行:

  1. 主机模式

  2. 多主机模式

  3. 从机模式

在多主机模式下,当控制器未处在活跃状态,且检测竞争错误机制被使能时,控制器的输出信号为三态。 复位SPI使能位可以立即将输出设置为三态。一个中断状态寄存器可以指示模式错误。

在从模式下,控制器从主设备接收串行时钟,并使用SPI_REF_CLK时钟来同步数据捕获。 从机片选(SS)信号被置位,控制器被使能,从机模式包含可编程起始检测机制。读和写FIFO在SPI I/O接口和接口之间提供缓冲区,软件可以通过APB从机接口为控制器提供服务。 FIFO用于从机和主机I/O模式。

4.1 主机模式

在主机模式下,SPI I/O接口可以将数据传输到从机或初始化一个发送操作来通过从机接收数据。 在这种模式下,通过支持SPI多主机模式的选项,控制器驱动串行时钟和从机片选。串行时钟派生来自PS时钟子系统。

控制器从三个从机选择线之一来选择一个从设备。 如果超过三个从属设备需要连接到主设备,可以添加一个MIO或EMIO接口上的3/8译码器。使用spi.Config [PERI_SEL]位来启用多路复用器。

控制器使用多达三个独立的从机片选输出信号来初始化消息,可以从外部扩展。 控制器通过将字节写入32位读/写数据端口寄存器实现读取和写入从机设备。

4.2 多主机模式

对于多主机模式,控制器被编程为主机模式[MODE_SEL],同时被初始化为在任何从机选择线上启动传输。 当软件准备好启动传输时,它使用[SPI_EN]位使能控制器。传输完成后,软件会禁用控制器。 外部主机无法选择控制器当控制器处于主模式时。

控制器通过监视漏极开路从机片选来检测总线上的另一个主机信号(低电平有效)。 通过[Modefail_gen_en]来启用检测机制。当控制器检测到另一个主机时,它将设置spi.ISR [MODE_FAIL]中断状态位并清除spi.Enable [SPI_EN]控制位。软件可以接收[MODE_FAIL]中断,以便它可以中止传输,重置控制器并重新发送传输。

  1. SPI数据传输

SPI控制器遵循一系列特定的操作来初始化和控制数据通过SPI总线传输。以下小节详细介绍了数据传输握手机制。

5.1 数据传输

SCLK时钟和MOSI信号在主机的控制下。要传输的数据是使用寄存器写操作通过软件将其写入TXFIFO,然后由控制器硬件以手动或自动启动顺序进行传输。数据是驱动到主输出(MOSI)数据引脚上。TXFIFO中有数据时会持续传输。数据在MISO数据引脚上串行接收,并一次将8位数据加载进入RXFIFO。软件通过寄存器来读取RXFIFO。在开始下一次传输之前,在TXFIFO中每写入n个字节时,必须由软件读取n个存储在RXFIFO中的字节。

5.2 自动/手动从机选择并启动

可以使用软件手动启动或自动启动I/O接口上的数据传输。另外,从机片选置位/未置位可以由控制器硬件或软件完成。

  1. 手动从机选择

软件通过设置spi.Config [Manual_CS] = 1选择手动从机选择方法。在这种模式下,软件必须明确控制从机片选置位/置低。当[Manual_CS] = 0时,控制器硬件自动判断从机在数据传输期间选择。

  1. 自动从机选择

软件通过编程spi.Config [Manual_CS] = 0来选择自动从机选择方法。SPI控制器为TXFIFO的每次传输置位/置低从机选择MOSI信号上的内容。 软件将数据写入TXFIFO,然后控制器自动选择从机,在TXFIFO中传输数据,然后使从机无效选择。传输TXFIFO中的所有数据后,从机选择将置为无效,直到这个发送结束。在自动从机选择模式下,软件需要确保以下操作。

  1. 软件连续将要发送的数据字节填充到TXFIFO中,在TXFIFO不为空的情况下,维持已声明的从机选择。

  2. 软件需要连续读取RXFIFO中接收的数据字节,以避免溢出

软件可以通过TXFIFO和RXFIFO的阈值级别来避免FIFO不满或者溢出。当TXFIFO中的字节数少于以下字节时,TXFIFO的未满条件被标志。当RXFIFO中的字节数等于128时,RXFIFO将被标志为已满。

5.3 手动启动

以下过程描述了如何以手动模式开始数据传输。

  1. 启用

软件通过设置spi.Config [Man_start_en]选择手动传输方法位=1。在这种模式下,软件必须使用手动启动来显式启动数据传输命令机制。当[Man_start_en]位= 0时,控制器硬件当TXFIFO中有可用数据时,它将自动开始数据传输。

  1. 命令

软件通过将1写入spi.Config [Man_start_com]位来启动手动传输。当软件写入1时,控制器硬件开始数据传输,然后传输TXFIFO中存在的所有数据字节。 [Man_start_com]位是自动清除的。如果[Man_start_en] = 0,则向该位写入1。不管模式如何,将0写入[Man_start_com],都没有效果。

  1. 时钟

从机选择输入引脚必须被SCLK输入同步驱动。控制器工作在SPI_REF_CLK时钟域中。输入信号已同步并在SPI_REF_CLK域中进行分析。

  1. 数据检测

在SPI_REF_CLK时钟域中检测到数据的开头。

  1. 启用控制器时进行检测:如果在从机片选处于置低状态启用了控制器(从禁用状态),控制器将忽略数据,并在捕获数据之前,等待SCLK处于非活动状态(字边界)。 控制器对SPI_REF_CLK域中的SCLK不活动进行计数。当SCLK空闲计数达到在[Slave_Idle_count]位域编程的值时,一个新数据到达。

  2. 从机选择有效时的检测:启用控制器,检测到从机选择如果为高(无效),控制器假定数据的开头出现在从机片选转变为低电平后,SCLK的下一个有效沿。

重要信息:开始条件必须至少保持四个SPI_REF_CLK周期被有效检测到。如果在主机非常接近开始数据传输时使能从机模式,错误同步的可能性很小,从而导致数据包损坏。这个问题可以通过以下任何一种设计选择来避免

  1. 确保外部主机至少在使能从机模式后十个SPI_REF_CLK周期完后才启动数据传输。

  2. 确保在启用主机之前启用了从机模式。

  3. 确保启用从机时,从机片选输入信号未激活。

详见https://download.csdn.net/download/m0_37765662/12414895

你可能感兴趣的:(linux驱动开发,嵌入式,linux,zynqMP,SPI驱动,SPI工作模式)