SPI三线制主控制器(VHDL)

逻辑主页

代码下载

spi_3_wire_master.vhd (9.1 KB)

特性

  • 串行外设接口(SPI)三线制主控器件的VHDL源代码
  • 可配置从机数量
  • 可配置指令宽度
  • 可配置数据宽度
  • 可选极性和相位
  • 可选速率

简介

本文详述了用于CPLD和FPGA的SPI三线制主控器件,采用VHDL语言编写。该器件使用Quartus II 12.1版本进行设计。资源需求取决于具体实现(即所需的从机数量和数据宽度)。图1展示了SPI三线制主控器件集成到系统中的典型示例。

1. 应用示例

背景

SPI三线制通信方案是半双工数据链路。主机通过拉低从机选择(SS)线来启动传输。由主机驱动的串行时钟(SCLK)线提供同步时钟源。串行数据输入/输出线是双向数据线,主控通过该线收发数据。典型场景中,主控通过SDIO线发送指定长度的指令。若为写入指令,主控随后会在该线上发送固定长度的数据。若为读取命令,从设备将发送固定长度的数据响应,主设备负责接收。

主设备可通过多种技术与多个从设备通信。最常见配置中,每个从设备拥有独立的SS线,但与其他从设备共享SCLK和SDIO线路。当从机的SS线未被拉低时,该从机会忽略共享线路。该拓扑结构如上图1所示。

SPI有四种工作模式,基于两个参数:时钟极性(CPOL)和时钟相位(CPHA)。主从设备必须使用相同模式才能清晰通信。若CPOL为0,则SCLK通常为低电平,首个时钟边沿为上升沿。若CPOL为1,则SCLK通常为高电平,首个时钟边沿为下降沿。CPHA定义数据对齐方式。若CPHA为0,则首个数据位在SS下降沿写入,在首个SCLK边沿读取。若CPHA为1,数据在首个SCLK边沿写入,在第二个SCLK边沿读取。图2的时序图展示了四种SPI模式。

2. SPI三线时序图

端口描述

表1描述了SPI主设备的端口。从设备数量通过ENTITY中的GENERIC参数 slaves 声明。命令总线宽度由GENERIC参数cmd_width 声明。发送与接收数据总线宽度由GENERIC参数d_width 声明。

1. 端口描述

时钟控制

clockclk_div 输入共同定义SCLK频率(即SPI数据速率)。clock 是用于驱动组件内部同步逻辑的系统时钟。clk_div 整数输入允许用户设置当前事务的相对速度。如公式1所述,clk_div 表示SCLK跳变之间的时钟周期数。

clk_div 端口设为1时,SCLK频率为时钟频率的一半,此时数据速率达到最大值。enable 引脚将clk_div 值锁存至组件以启动每个事务,因此可为不同从设备单独调整数据速率。

clk_div 端口设为常量值可永久固定数据速率。若clk_div 设为0,组件将默认采用1作为参数值。因此,将clk_div 端口拉低可配置该组件始终以最高速度运行。

极性与相位

使能 引脚在每个事务开始时锁存cpolcpha 的标准逻辑值。这使得能够使用独立的SPI模式与各个从设备通信。若所有从设备需要相同模式,只需将cpolcpha 连接到相应逻辑电平。

命令与数据宽度

ENTITY中的cmd_width GENERIC参数指定事务命令部分的长度。同理,d_width GENERIC参数指定事务数据部分的长度。图3和图4分别展示了CPOL=0和CPHA=0时写入与读取事务的信号时序图。在这些时序图中,K=cmd_width且M=d_width。如图所示,命令和数据均以最高有效位(MSB)优先发送。

3. 写入事务时序图(CPOL=0,CPHA=0)

4. 读取事务时序图(CPOL=0,CPHA=0)

事务处理

busy 输出端口的低电平表示组件已准备好接收命令。在使能输入有效的第一个时钟上升沿,组件会锁存事务的配置、地址、rw、命令和数据。随后的时钟周期中,组件将置位busy 信号并开始执行事务。完成后,若为读取事务,组件会在rx_data 端口输出接收到的数据。该数据将保持在该端口,直到组件从后续读取事务获取新数据。当事务完成且接收数据就绪时,组件通过拉低busy 通知用户。随后组件可立即接收下一条指令。

图3展示了一个典型事务的时序图。该SPI三线主控配置为单从设备、8位命令宽度和8位数据宽度。使能脉冲锁存器设置CPOL=1、CPHA=1、clk_div=0(最高速度fsclk=fclock/2),从机地址为0,rw=0(表示读取事务),命令为"10011001"。由于是读取事务,tx_data端口无关紧要。SPI三线主控随后发送命令并接收从机响应。事务完成后,将busy 输出置低,并在rx_data 端口输出接收到的数据"01010101"。

5 典型事务时序图

复位

reset_n 输入端口必须保持逻辑高电平才能使SPI三线主控组件工作。该端口的低电平信号会异步复位组件。复位期间,组件将busy 端口和所有ss_n 输出保持高电平。sdio 端口进入高阻态,rx_data 输出端口清零。复位释放后,busy 端口在下一个时钟周期解除断言,表示SPI主控已准备好通信。

结论

SPI三线主控是可灵活编程的逻辑组件,通过单一并行接口适配多种从机通信。它支持与用户指定数量的从机通信,这些从机可能需要独立的SPI模式和串行时钟速度。还允许用户配置所需的命令和数据大小。

相关主题

SPI主控(VHDL) - 这是4线制SPI主控组件。

SPI从机(VHDL) - 这是4线制SPI从机组件。

SPI转I2C桥接器(VHDL)