代码下载
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. 端口描述
时钟控制
clock 与clk_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 端口拉低可配置该组件始终以最高速度运行。
极性与相位
使能 引脚在每个事务开始时锁存cpol 和cpha 的标准逻辑值。这使得能够使用独立的SPI模式与各个从设备通信。若所有从设备需要相同模式,只需将cpol 和cpha 连接到相应逻辑电平。
命令与数据宽度
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从机组件。