欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档)

发布时间:2024/10/14 编程问答 20 豆豆
生活随笔 收集整理的这篇文章主要介绍了 17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

第17章 SPI控制器

注:本文为笔者自己翻译的XILINX ZYNQ-7000 SOC UG-585官方文档,文档版本UG585 (v1.12.2) July 1, 2018


文章目录

  • 第17章 SPI控制器
  • 17.1 简介
    • 17.1.1 功能
    • 17.1.2 系统结构
    • 17.1.3 模块框图
  • 17.2 功能描述
    • 17.2.1 主机模式
    • 17.2.2 多主机兼容
    • 17.2.3 从机模式
    • 17.2.4 FIFO
    • 17.2.5 FIFO中断
    • 17.2.6 中断寄存器位和逻辑流
    • 17.2.7 SPI-to-SPI互连
  • 17.3 配置步骤
    • 17.3.1 启动顺序
    • 17.3.2 控制器配置
    • 17.3.3 主机模式数据传输
    • 17.3.4 从机模式数据传输
    • 17.3.5 中断服务规程
    • 17.3.6 寄存器概述
  • 17.4 系统功能
    • 17.4.1 复位
    • 17.4.2 时钟
  • 17.5 I/O接口
    • 17.5.1 协议
    • 17.5.2 背靠背传输器
    • 17.5.3 MIO/EMIO映射
    • 17.5.4 接线说明


17.1 简介

SPI总线控制器支持与各种外围设备的通信,如存储器、温度传感器、压力传感器、模拟转换器、实时时钟、显示器和任何支持串行模式的SD卡。SPI控制器可以在主模式、从模式或多主模式下工作。Zynq-7000设备包括两个基于Cadence-SPI内核的SPI控制器。

在主模式下,控制器驱动串行时钟,从机选择支持SPI的多主模式。串行时钟来自PS时钟子系统。控制器使用最多3个单独的从选择(SS)输出信号(可从外部扩展)来启动消息。控制器通过向32位读/写数据端口寄存器写入字节来读取和写入从设备。

在多主机模式下,在控制器未激活时其输出信号为三态,当使能时会检测竞争错误。通过重置SPI使能位,输出被立即设定为三态。中断状态寄存器会显示模式故障。

在从机模式下,控制器从外部设备接收串行时钟,并使用SPI_Ref_Clk来同步数据捕获。从机模式包括一个可编程启动检测机制,当片选信号SS变得有效时启用控制器。

读写FIFO通过APB从接口为SPI I/O接口与为控制器服务的软件之间提供缓存。FOFO在主机和从机I/O模式都可以使用。

本章包含以下部分:

17.1 简介
17.2 功能描述
17.3 配置步骤
17.4 系统功能
17.5 I/O接口

17.1.1 功能

每个SPI控制器的配置和控制都是独立的,它们包含以下功能:

  • 四线总线 ---- MOSI,MISO,SCLK和SS
    主机模式下最多3个从机选择
  • 全双工操作提供同时接收和发送
  • 通过APB从机接口进行32位寄存器编程
  • 用于Rx/Tx FIFO的内存映射读/写数据端口(字节宽)
    128字节读和128字节写FIFO
    可编程的FIFO阈值状态和中断
  • 主机I/O模式
    手动和自动启动数据传输
    手动和自动从机选择(SS)模式
    从机选择信号可以直接连接到从机设备或从外部扩展
    可编程的SS和MOSI延时
  • 从机I/O模式
    可编程的启动检测模式
  • 多主机I/O兼容
    当控制器未使能,I/O缓存驱动到三态
    当检测到其他主机时产生模式错误中断
  • 当I/O信号映射到MIO引脚时,SCK时钟频率50MHz
    当I/O信号通过EMIO映射到PL引脚时,SCLK时钟频率25MHz
  • 可编程时钟相位和极性(CHPA,CPOL)
  • 可编程中断驱动设备或轮询状态

17.1.2 系统结构

SPI控制器的系统结构框图如图17-1所示

SPI接口控制器

有两个独立的SPI接口控制器(SPIx,x为0或1)。每个独立的SPI控制器的I/O信号都可以映射到MIO引脚或EMIO接口。每个控制器同样有送到PS中断控制器的独立中断信号和各自的复位信号。每个控制器有各自的一系列控制和状态寄存器

时钟

PS时钟子系统给SPI控制器提供参考时钟。SPI_Ref_Clk用于控制器的逻辑和主机模式下通过波特率生产期产生SCLK时钟。

MIO-EMIO

如<Figure 17.5 I/O interfaces >所示SPI的I/O信号可以映射到MIO引脚或通过EMIO映射到PL引脚。信号的基本映射方法在 < 第二章信号、接口和引脚 > 中有介绍。

17.1.3 模块框图

SPI控制器的功能模块框图如图17-2所示,


APB从机接口

32位APB从机接口对寄存器读写做出响应,包括用于从FIFO读写命令和数据的数据端口。所有的寄存器数据传输都是32位的。数据接口使用这些接口的bits[7:0]。配置和状态寄存器在 Appendix B, Register Details 中介绍。

SPI主机模式

当控制器在主机模式下工作时,其驱动SCLK时钟和最多3个从选择输出信号。从机选择和MOSI上的传输启动可以由软件手动控制,也可以由硬件自动控制。

SPI从机模式

当控制器在从机模式下工作时,它使用一个单独的从机选择输入(ss0)。SPI信号如 图17-2 所示,其I/O接口在 <第17.5节> 中列出。SCLK与控制器参考时钟(SPI_Ref_Clk)同步。详细信息参考 <第17.2.3节从机模式 >。

发送和接收FIFO(Tx and Rx FIFOs)

每个FIFO有128个字节。软件通过使用寄存器映射数据端口寄存器读取和写入这些FIFO。主机模式的FIFO管理在 <17.3.3主模式数据传输> 中有介绍,从机模式的FIFO管理在 <17.3.4从模式数据传输> 中有介绍。

FIFO桥接两个时钟域:APB接口和控制器的SPI_Ref_Clk。软件写入APB时钟域中的TxFIFO,控制器读取在SPI_Ref_Clk域中的TxFIFO。

控制器填充SPI_Ref_Clk域中的RxFIFO,软件读取APB时钟域中的RxFIFO。

17.1.4 注意

7z007s和7z010 CLG225设备

7z007s单芯和7z010双核CLG225设备支持32个MIO引脚(不是54个)。这在<第2.5.4节MIO-at-a-Glance表>的MIO表中显示。这些设备限制了可用的MIO引脚,因此应考虑通过EMIO的连接。<第1.1.3节 “注意事项”>中列出了所有这些CLG225设备限制。

17.2 功能描述

17.2.1 主机模式
17.2.2 多主机兼容
17.2.3 从机模式
17.2.4 FIFO
17.2.5 FIFO中断
17.2.6 中断寄存器位和逻辑流
17.2.7 SPI-to-SPI互连

17.2.1 主机模式

在主机模式下,SPI的I/O接口可以向从机发送数据或发起传输以便从机接收数据。控制器使用三个从选择线中的一个选择一个从设备。如果需要将三个以上的从设备连接到主设备,可以在板上添加外部外围选择设备 – “3-8译码器”。

数据发送

SCLK时钟和MOSI信号由主机控制。待传输的数据由软件使用寄存器写入TxFIFO,然后由控制器硬件以手动或自动启动顺序下载传输。数据被驱动到主输出(MOSI)数据引脚上。当TxFIFO中有数据时,传输将连续进行。数据在MISO数据引脚上串行接收,一次加载8位到RxFIFO中。软件使用寄存器读取读取RxFIFO。对于写入TxFIFO的每“n”字节,RxFIFO中存储的“n”字节必须在开始下一次传输之前从软件读取。

自动或手动从机选择(SS)和启动

I/O接口上的数据传输可以使用软件手动启动,也可以由控制器硬件自动启动。此外,从机选择激活/释放也可以由控制器硬件或软件完成。这四种组合如<Table 17-1>所示。

手动从机选择

软件通过将spi.Config_reg0 [Manual_CS] 位 = 1 来选择手动从机选择模式。在这种模式下,软件必须显式地控制从机选择激活/释放。当[Manual_CS] 位 = 0 时,控制器硬件可以在数据传输过程中自动激活从机选择。

自动从机选择

软件通过配置spi.Config_reg0 [Manual_CS] 位 = 0来选择自动从机选择模式。SPI控制器在每次TxFIFO内容传输到MOSI信号的过程中激活/释放从机选择。软件将数据写入TXFIO,控制器自动激活从机选择,TxFIFO中的数据发送后自动释放从机选择。在发送完Tx FIFO中的所有数据后,从机选择被释放。传送到此结束。

软件确保在自动从机选择模式下实现以下功能。

  • 软件不断地将要传输的数据字节填充TxFIFO,而TxFIFO就不会变为空,以此保持激活的从机选择。
  • 软件连续读取RxFIFO中接收的数据字节,以避免溢出。

软件使用TxFIFO和RxFIFO阈值级别来避免FIFO流量不足和过量。当TxFIFO中的字节数小于TxFIFO阈值级别时,将标记TxFIFO Not Full标志。当RxFIFO中的字节数等于128时,将标记RxFIFO full标志。

手动启动
使能

软件通过设置spi.Config_reg0 [Man_start_en] 位 = 1来选择手动启动模式。在此模式下,软件必须使用手动启动命令机制来显式地启动数据传输。当[Man_start_en] 位 = 0时,当TxFIFO中有可用数据时,控制器硬件自动启动数据传输。

命令
软件向spi.Config_reg0 [Man_start_com]位写1,即可启动一次手动传输。当软件写入1时,控制器硬件启动数据传输并传输TxFIFO中存在的所有数据字节。[Man_start_com]位是自动清除的。如果[Man_start_en]=0,则忽略向该位写入1。无论是什么模式,向[Man_start_com]位写0都是无效的。

17.2.2 多主机兼容

对于多主模式,控制器编程为主机模式[MODE_SEL],并且可以在任何从机选择上启动传输。当软件准备好启动传输时,它使用[SPI_EN]位启用控制器。事务处理完成后,软件将禁用控制器。当控制器处于主机模式时,外部主机无法选择控制器。

控制器通过监测开漏从选择信号(低电平有效)来检测总线上的另一个主机。检测机制由[Modefail_gen_en]使能。当控制器检测到另一个主机时,它设置spi.Intr_status_reg0 [MODE_FAIL]中断状态位并清除spi.En_reg0 [SPI_EN]控制位。软件可以接收[MODE_FAIL]中断,因此可以中断传输、复位控制器,或者重新发送传输。

17.2.3 从机模式

在从机模式下,控制器从外部主机接收消息并同时输出应答。控制器在以下情况下进入从机模式:spi.Config_reg0[MODE_SEL] = 0 和 spi.En_reg0 [SPI_EN] = 1。

SCLK将数据锁存在MOSI输入上。如果从机选择输入信号高(未激活),控制器将忽略MOSI输入。当从机选择激活时,它必须在传输期间保持活动状态。如果从机选择SS在传输期间被释放,控制器会将spi.Intr_status_reg0 [MODE_FAIL]中断位置位。软件可以接收[MODE_FAIL]中断,因此可以中断传输、复位控制器,或者重新发送传输。

错误机制由[Modefail_gen_en]位使能。

发送到主设备的数据由软件写入TxFIFO,然后由控制器序列化到主输入(MISO)信号。传输继续,且TXFIO中仍有数据,从机选择信号保持激活(低电平有效)。

时钟

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

字检测

字的开头是在SPI_Ref_Clk时钟域中检测到的。

  • 控制器使能时的检测:如果在SS为低(有效)时启用控制器(从禁用状态),则控制器捕获数据前,将忽略数据并等待SCLK处于非活动状态(字边界)。控制器统计SPI_Ref_Clk域中SCLK的不激活状态。当SCLK空闲计数达到[Slave_idle_coun]位字段中编程的值时,将假定一个新字。
  • 当从机选择激活时检测:当控制器使能且SS检测到高电平(非有效)时,控制器将假设单字的开始出现在SS转换为低(激活)之后SCLK的下一个活动边缘。

注意:启动条件必须保持激活状态至少四个SPI_Ref_Clk循环才能检测到。

如果在外部主机非常接近开始数据传输时才启动从机模式,有较小的可能性发生错误同步,从而导致数据包损坏。可通过以下任何方法避免此问题:

  • 确保在启用从机模式后,至少经过10个SPI_Ref_Clk周期后,外部主机才启动数据传输。
  • 确保在启用外部主设备之前启用从机模式。
  • 当从机启用时,确保从机选择输入信号未激活。

17.2.4 FIFO

接收和发送FIFO各有128字节深度。

接收FIFO

如果控制器试图将数据推送到已经满了的RxFIFO中,则内容将丢失、粘滞溢出标志将置位。没有数据可以添加到满了的RxFIFO。软件将1写入[RX_OVERFLOW]位以清除该位。

发送FIFO

如果TxFIFO已满,[TX_FIFO_full] = 1,则不要写入更多数据。TX_FIFO_Full位保持激活状态,直到TxFIFO级别低于[TxFIFO_Not_Full]阈值级别。向满了的TxFIFO写入的数据可能会丢失而没有任何指示。

17.2.5 FIFO中断

Rx和Tx FIFO中断如图17-3所示。

17.2.6 中断寄存器位和逻辑流

中断状态位(粘滞和动态)由掩码寄存器过滤,然后发送到系统中断控制器。屏蔽寄存器由使能/禁止中断控制寄存器控制(见图17-4)。

17.2.7 SPI-to-SPI互连

当slcr.MIO_LOOPBACK [SPI_LOOP_SPI1]为被设置为 = 1时,PC中两个SPI控制器的I/O信号连接在一起。在该模式下,一个控制器的时钟、从机选择、MISO、MISO信号分别连接到另一个控制器的时钟、从机选择、MISO、MISO信号。

限制

SPI控制器寄存器需要单32位读/写访问,不使用字节、半字或双字引用。

17.3 配置步骤

17.3.1 启动顺序
17.3.2 控制器配置
17.3.3 主机模式数据传输
17.3.4 从机模式数据传输
17.3.5 中断服务规程
17.3.6 寄存器概述

17.3.1 启动顺序

实例:启动顺序

  • 复位控制器:对Ref和CPU_1X复位进行激活和释放,请参阅<第17.4.1节 复位>。
  • 配置时钟:对SPI_Ref_Clk进行配置,参见<第17.4.2节 时钟>。
  • Tx/Rx信号映射:参考<第17.5节 I/O接口>。
  • 控制器配置:参考<17.3.2 控制器配置>。
  • 中断配置:配置ISR以处理中断状况。最简单的ISR是从RxFIFO读取数据并将内容写入TxFIFO。PS中断控制器在<第7章 中断>中描述。SPI控制器的中断机制在<第17.3.5节中断服务程序>中描述。
  • 启动数据传输:
    • 主机模式操作选择:手动/自动启动和SS,参见<第17.3.3节主模式数据传输>。
    • 从机模式操作,参考<第17.3.4节从模式数据传输>。

    17.3.2 控制器配置

    通过写spi.Config_reg寄存器来配置控制器:

    • 设置波特率 [BAUD_RATE_DIV]。
    • 设置时钟相位[CLK_PH]和极性[CLK_POL]。
    • 设置主机/从机模式[MODE_SEL]。
    • 配置多主机模式系统的模式失败产生[Modefail_gen_en]。
    • 将SS设置为0b1111以在传输开始之前取消激活所有从机选择。

    实例:SPI0主机模式配置

    这个例子使用单片选,波特率为12.5 Mb/s,时钟相位设置为非激活,时钟极性为静态高。

  • 配置控制器:向spi.Config_reg寄存器写0x0002_FC0F。
    a.释放所有的片选(现在): [CS] = 1111。
    b.不使用外部3-8译码器:[PERI_SEL] = 0。
    c.波特率设置为 12.5 Mbps. [BAUD_RATE_DIV] = 1。
    实例配置SPI_Ref_Clk为50MHz。波特率发生器说明见<第17.3.3节主模式数据传输>。
    d.将时钟相位[CLK_PH]和极性[CLK_POL]设置为1。这些参数在<第17.5.1节协议>中讨论。
    e.设置主机模式: [MODE_SEL] = 1。
    f.查看是否有总线碰撞:[Modefail_gen_en]=1。
    g.不要启动传输。[Man_start_com]=0。
  • 17.3.3 主机模式数据传输

    主机操作模式的四种组合在<第17.2.1节主机模式>中进行了说明。下面的例子说明了每种模式的编程步骤。

    示例:主机模式 – 手动SS和手动启动

  • 使能手动SS:向spi.Config_reg [Manual_CS]写1。

  • 选择手动启动:向spi.Config_reg [Man_start_en]写1。

  • 激活从机选择:设置spi.Config_reg [CS] = 1101,激活从机选择1。

  • 使能控制器:向spi.EN_reg0 [SPI_EN]写1。

  • 向发送FIFO写字节:
    a. 使用pi.Tx_data_reg寄存器向发送FIFO写数据。
    b. 持续向发送FIFO写入数据,直到其深度装满或没有数据需要写入。
    c. 将每个字节写入TxFIFO后,驱动程序软件中的数据字节计数器将加1。

  • 使能中断:向spi.Intrpt_en_reg写入0x27,以使能接收FIFO满、接收FIFO溢出、发送FIFO空和故障状况。

  • 启动数据传输:设置spi.Config_reg0 [Man_start_com] = 1。

  • 等待中断

  • 中断处理:使用中断处理程序将任何附加数据传输到从机,并将所需数据传输到SPI从机。

  • 禁止中断: 向spi.Intrpt_dis_reg 写0x27,以禁止接收FIFO满、接收FIFO溢出、发送FIFO空和故障状况。

  • 禁止控制器:设置spi.En_reg0 [SPI_EN] = 0。

  • 释放从机选择:设置spi.Config_reg0 [CS] = 1111。

  • 示例:主机模式 – 手动SS和自动启动

  • 使能手动SS:向spi.Config_reg [Manual_CS]写1。
  • 激活从机选择:设置spi.Config_reg [CS] = 1101,激活从机选择1。
  • 使能控制器:向spi.EN_reg0 [SPI_EN]写1。
  • 向发送FIFO写字节:
    a. 使用pi.Tx_data_reg寄存器向发送FIFO写数据。
    b. 持续向发送FIFO写入数据,直到其深度装满或没有数据需要写入。
    c. 将每个字节写入TxFIFO后,驱动程序软件中的数据字节计数器将加1。
  • 使能中断:向spi.Intrpt_en_reg写入0x27,以使能接收FIFO满、接收FIFO溢出、发送FIFO空和故障状况。
  • 等待中断
  • 中断处理:使用中断处理程序将任何附加数据传输到从机,并将所需数据传输到SPI从机。
  • 禁止中断: 向spi.Intrpt_dis_reg 写0x27,以禁止接收FIFO满、接收FIFO溢出、发送FIFO空和故障状况。
  • 禁止控制器:设置spi.En_reg0 [SPI_EN] = 0。
  • 释放从机选择:设置spi.Config_reg0 [CS] = 1111。
  • 示例:主机模式 – 自动SS和手动启动

  • 选择手动启动:向spi.Config_reg [Man_start_en]写1。

  • 激活从机选择:设置spi.Config_reg [CS] = 1101,激活从机选择1。

  • 使能控制器:向spi.EN_reg0 [SPI_EN]写1。

  • 向发送FIFO写字节:
    a. 使用pi.Tx_data_reg寄存器向发送FIFO写数据。
    b. 持续向发送FIFO写入数据,直到其深度装满或没有数据需要写入。
    c. 将每个字节写入TxFIFO后,驱动程序软件中的数据字节计数器将加1。

  • 设置FIFO阈值等级:设置spi.TX_thres_reg0和spi.RX_thres_reg0阈值等级。可以参考<自动模式操作>部分的介绍。

  • 使能中断:向spi.Intrpt_en_reg写入0x27,以使能接收FIFO满、接收FIFO溢出、发送FIFO空和故障状况。

  • 启动数据传输:设置spi.Config_reg0 [Man_start_com] = 1。

  • 中断处理:使用中断处理程序将任何附加数据传输到从机,并将所需数据传输到SPI从机。

  • 禁止中断: 向spi.Intrpt_dis_reg 写0x27,以禁止接收FIFO满、接收FIFO溢出、发送FIFO空和故障状况。

  • 禁止控制器:设置spi.En_reg0 [SPI_EN] = 0。

  • 释放从机选择:设置spi.Config_reg0 [CS] = 1111。

  • 17.3.4 从机模式数据传输

    示例:从机模式 – 中断驱动

    确保控制器配置完毕后,在执行以下步骤:

  • 从机配置:向spi_Config_reg0写0。
  • 使能中断:向spi.Intrpt_en_reg 写入0x37,以使能接收FIFO非空、接收FIFO满、接收FIFO溢出和故障状况等中断。
  • 使能控制器:向spi.EN_reg0 [SPI_EN]写1。
  • 中断处理:使用中断处理函数从主机接收数据。
  • 禁止中断:向spi.Intrpt_DIS_reg写入0x37,以使能接收FIFO非空、接收FIFO满、接收FIFO溢出和故障状况等中断。
  • 禁止控制器:向pi_En_reg0 [SPI_EN]写0。
  • 注意:在从机模式操作中,建议将spi.RX_Thres_reg0[Threshold_of_RX_FIFO设置为1,以将接收FIFO阈值设置为1.

    17.3.5 中断服务规程

    示例:中断服务规程
    这个例子处理RxFIFO溢出/下溢、多主冲突(模式失败)以及处理Rx和Tx数据传输。

  • 禁止除了发送FIFO满和接收FIFO空以外的所有中断:向spi.Intr_dis_REG写0x27。

  • 检测中断源:从中断状态寄存器spi.Intr_status_reg0中读取。

  • 清除中断:向中断状态寄存器spi.Intr_status_reg0对应位写1。

  • 检查模式错误中断:(多主机模式)。在模式错误状态,当前发送中止:
    a. 复位控制器。
    b. 重新配置控制器。
    c. 重新发送数据。

  • 清空接收FIFO:读取spi.Intr_status_reg0 [RX_FIFO_full]位:
    a. 从pi.Rx_Data_reg 寄存器中读取数据。持续读取字节数等于数据字节计数器。

  • 填充发送FIFO:如果需要,可以向发送FIFO写入更多数据:
    a. 向spi.Tx_Data_reg0寄存器写入数据。
    b. 持续写入数据,直至达到FIFO的深度或不在需要写入数据。
    c. 在数据压入FIFO后,数据字节计数器增加。

  • 检查溢出或下溢:读取TX_FIFO_underflow] 或 [RX_OVERFLOW]状态位。按需要处理溢出或下溢情况。

  • 使能中断:如果还有更多数据需要发送或接收,把spi.Intrpt_en_reg0 [TX_FIFO_not_full] 和 [RX_FIFO_full] 都设置 = 1。

  • 如果有数据传输(发送或接收)则启动数据传输:

    • 当处于主机模式,且使用手动启动的数据传输已经完成(手动/自动的SS皆可),设置spi.Config_reg [Man_start_en] = 1。

    17.3.6 寄存器概述

    SPI寄存器的详细介绍参见<附录 B,寄存器数据(Appendix B, Register Details)>。寄存器概览参见<Table 17-2>。

    17.4 系统功能

    17.4.1 复位
    17.4.2 时钟

    17.4.1 复位

    控制器有两个复位域:APB接口和控制器自身。两个复位域必须一块使用。每个复位类型的作用汇总在<Table 17-3>。

    示例:复位APB接口和SPI0控制器

  • 为SPI写入slcr复位寄存器。向slcr.SPI_RST_CTRL [SPI0_REF_RST] 和 [SPI0_CPU1X_RST] 位域中先写1,等待几个延时之后再写0。
  • 17.4.2 时钟

    每个SPI控制器的核心由同一参考时钟(SPI_Ref_Clk)驱动,该基准时钟由PS时钟子系统生成,详见<第25章 时钟>。APB接口由CPU 1x时钟计时。CPU 1x时钟与参考时钟异步运行。说明书(data sheet)中定义了控制器时钟的工作频率规格。I/O信号由SCLK同步计时。

    注意:时钟选通用作SPI的电源管理功能。有关详细信息,请参阅<第24.3.2节外设>。

    CPU_1x

    CPI_1x时钟是CPU时钟域的一部分,详细介绍在<15.2 CPU时钟>。

    SPI_Ref_Clk

    使用slcr.SPI_CLK_CTRL寄存器设置时钟使能、PLL选择和分频,详细介绍在<25.6.3 SDIO、SMC、SPI、Quad-SPI和UART时钟>。

    频率限制注意:SPI_Ref_Clk必须始终设置为高于CPU 1x时钟频率的频率。

    主机模式SCLK

    SCLK是主机模式的控制器驱动的。其通过设置spi.Config_reg0 [BAUD_RATE_DIV]位域将SPI_Ref_Clk分频得到。

    频率比例说明:波特率分频的以二进制步长覆盖从最小的4到最大的256的范围(比如分频为,4,8,16,…,256)。

    示例:主机模式SCLK

    该示例介绍了如何将100MHz的SPI_Ref_Clk配置为25MHz的SCLK。该示例假设I/O PLL为1000 MHz。CPU U 1x时钟频率必须小于100 MHz。

  • 配置SPI_Ref_Clk:选择PLL源,使能分频器:向slcr.SPI_CLK_CTR寄存器写入0x0000_0A01。
    a. 选择I/O PLL:SRCSEL] = 00。
    b. 将I/O PLL 10分频: [DIVISOR] = 0x0A。
    c. 使能SPI 0参考时钟: [CLKACT0] = 1。
  • 配置波特率发生器:当配置控制器时,向spi.Contro_reg0 [BAUD_RATE_DIV]写入001。
  • 从机模式SCLK

    控制器使用来自外部主机的SCLK作为MOSI和SS信号的时钟。这些信号与SPI_Ref_Clk同步,并由控制器进行处理。

    频率比例说明:SPI_Ref_Clk频率至少是SCLK的2倍(2x),以便控制器可以很好地检测SPI总线上的字传输。

    17.5 I/O接口

    17.5.1 协议
    17.5.2 背靠背传输
    17.5.3 MIO/EMIO映射
    17.5.4 接线方式
    17.5.5 MIO/EMIO信号表

    17.5.1 协议

    主机模式

    控制器支持主模式的各种I/O信令关系。通过设置相位和极性控制位spi.Config_reg0 [CLK_PH] 和 [CLK_POL],可以得到四种组合。这些参数影响串行时钟的激活边沿、从属选择的激活和SCLK的空闲状态。时钟相位参数定义了字与字之间SS的状态,以及控制器不传输位时SCLK的状态。相位和极性参数汇总在<Table 17-4>中,如<Figure 17-5>所示。

    时钟相位设置,CPHA(CLK_PH)

    在主机模式下,时钟相位控制位spi.Config_reg0 [CLK_PH]的值会影响使用spi.Delay_reg0寄存器中参数的I/O协议(见 Figure 17-5):

    CLK_PH = 0

    • SS激活:主机会自动驱动SS输出无效(高电平),保持时间由spi.Delay_reg0 [d_nss]位定义: Time = (1 + [d_nss]) * SPI_Ref_Clk 时钟周期。最小的时间是2个SPI_Ref_Clk时钟周期。
    • 字间延时:当前字的最后一个字节周期与下一个字第一个字节周期之间的延时:Time = (2 + [d_btwn]) * SPI_Ref_Clk时钟周期。最小的延时是3个SPI_Ref_Clk时钟周期。该延时使发送FIFO(TXFIFO)可以卸载并准备下一次并行到串行的转换,也会将从机选择翻转为无效的高电平。

    CLK_PH = 1

    • SS激活:在字和字之间,SS输出信号不会驱动为无效。
    • 字间延时:当前字的最后一个字节周期与下一个字第一个字节周期之间的延时采用默认值 – 一个SPI_Ref_Clk循环(由spi.Delay_reg0寄存器配置)。该延时使发送FIFO(TXFIFO)可以卸载并准备下一次并行到串行的转换。

    17.5.2 背靠背传输器

    (见 Figure 17-6)

    从机模式需求

    在从机模式下,控制器可以接收背靠背传输器。

    主机模式选项

    • 自动SS,自动启动(从重要性开始对这四个进行排序,并包含每一个列的交叉引用)
    • 自动SS,手动启动
    • 手动SS,自动启动
    • 手动SS,手动启动

    17.5.3 MIO/EMIO映射

    SPI接口信号既可以映射到MIO引脚,可以映射到EMIO接口。当系统复位时(例如,PS_POR_B、PS_SRST_B和其他方法),默认情况下,所有I/O信号都路由到EMIO接口。

    当SPI总线通过MIO映射时,其最高可以允许在50MHz下。当信号通过EMIO映射PL引脚时,正常的时钟速率是25MHz。更多关于频率的介绍可以参考说明书(data sheet)。

    要使用EMIO接口,用户必须在PL创建逻辑,以直接连接SPI EMIO接口到的PL引脚的PL I/O缓存。EMIO映射支持最高25MHz的I/O时钟。

    SPI信号可以映射到特定的MIO引脚。其接线图在<如17.5.4 接线说明>有介绍。<第2.5节PS-PL MIO-EMIO信号和接口>中解释了一般映射概念和MIO I/O缓冲器配置。

    示例:配置I/O。使SPI0映射到MIO引脚16-21

    该示例使能主机模式SPI0映射到MIO引脚16-21,使用多达3个从机选择。

  • 配置MIO引脚16为时钟输出。向slcr.MIO_PIN_16 register写0x0000_22A0。
    a. 映射SPI0时钟到引脚16.
    b. 使能输出,[TRI_ENABLE] = 0。
    c. LVCMOS18: [IO_TYPE] = 001。
    d. 慢速CMOS驱动边沿。
    e. 禁止内部上拉电阻。
    f. 禁止HSTL接收器。

  • 配置MIO引脚17为MISO输入。向slcr.MIO_PIN_17写入0x0000_02A0。
    a. 映射SPI0 MISO到引脚17.
    b. 禁止输出,[TRI_ENABLE] = 1。
    c. LVCMOS18: [IO_TYPE] = 001。
    d. 慢速CMOS驱动边沿。
    e. 禁止内部上拉电阻。
    f. 禁止HSTL接收器。

  • 配置MIO引脚18、19和/或20用于从机片选输出。向slcr.MIO_PIN_18、19 和/或 20寄存器写入0x0000_32A0。内部上拉使能。
    a. 映射SPI0从机选择信号到引脚18、19和/或20。在主机模式下,某个或全部的从机选择都可以被激活。在从机模式下,SS0必须使用。
    b. SPI三态控制:[TRI_ENABLE] = 0。
    c. LVCMOS18: [IO_TYPE] = 001。
    d. 慢速CMOS驱动边沿。
    e. 使能内部上拉电阻。
    f. 禁止HSTL接收器。

  • 配置MIO引脚21作为MOSI。向slcr.MIO_PIN_21寄存器写入0x0000_22A0。
    a. 将SPI0 MOSI映射到引脚21。
    b. SPI三态控制:[TRI_ENABLE] = 0。
    c. LVCMOS18: [IO_TYPE] = 001。
    d. 慢速CMOS驱动边沿。
    e. 禁止内部上拉电阻。
    f. 禁止HSTL接收器。

  • 17.5.4 接线说明

    用户可以通过MIO引脚或EMIO接口到PL引脚,将每个SPI控制器连接到外部SPI从机或SPI主机。接线示例为,

    • 通过MIO的主机模式,如<Figure 17-7>。
    • 通过EMIO的主机模式,如<Figure 17-8>。
    • 通过MIO的从机模式,如<Figure 17-9>。

    在PS中两个SPI控制器的I/O信号可以按照<第17.2.7节“SPI到SPI连接”>中的说明连接在一起。


    重要声明:在主机模式下,如果不适用SS0则需要将其连接到Vcc。这一点很重要,因为控制器在主机模式下监听此信号以检测多主模式情况;如果SS0是逻辑低电平,则控制器将采用多主模式,并在发出事务之前等待SS0释放。


    通过MIO的主机模式


    重要声明:当使用MIO引脚时,SS0一直被使用。对于不使用SS0的现有设计,请参考<Xilinx AR58294>。


    通过EMIO的主机模式


    重要声明:当使用EMIO引脚时,需要将SSIN在PL bitstream中拉高。请确定PS-PL电平转换器已经使能,且PL已经上电、配置完毕。否则SPI控制器将无法正常工作。有关使能电压移位寄存器的更多信息,请参阅<PS–PL voltage Level Shifter Enables,第46页>。


    通过MIO的从机模式

    17.5.5 MIO/EMIO信号表

    SPI I/O接口信号映射有一些选项。映射选项包括MIO管脚中的多个位置。选项见<2.5.4 MIO-at-a-Glance 表>和<Table 17-5>。

    默认输入信号映射:如果I/O信号未被映射到一组MIO引脚(MIO_PIN_xx寄存器配置),则EMIO接口输入信号被启用。

    MIO引脚限制

    小封装注意事项:基于设备版本的MIO引脚限制见<2.5.4 MIO-at-a-Glance 表>中的MIO表。每个SPI I/O接口被选为一个组。

    EMIO信号
    SPI I/O接口信号可用的EMIO接口在<Table 17-6>中有定义。


    说明:纯人工翻译费时费力、而且意义不大。大多数翻译采用的是翻译软件+人工校对,对于笔者本人的学习和理解已经足够。如果需要准确理解,请看官方英文原始文档。


    总结

    以上是生活随笔为你收集整理的17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。