当前位置: 首页 > news >正文

基于FPGA的 SPI通信 设计(1)



引言

低速通信目前搞过 UART串口通信、IIC通信。其实 SPI 也算是中低速(有时也可以用作高速通信)串行通信的范畴,但是一直还没真正实现过,所以此系列就 SPI的协议以及FPGA设计作几篇博客记录。欢迎订阅关注~



SPI 标准协议 x1模式

SPI 是一种事实标准,由Motorola开发,支持全双工通信,并没有一个官方标准。已知的有的器件SPI已达到50Mbps,如果时序满足,FPGA的SPI通信速率可以达到100Mbps以上。具体到产品中SPI的速率主要看主从器件SPI控制器的性能限制。

设备通信框图

SPI通信主设备

SCLK:SPI 通信时钟,源:SPI 主设备。

MOSI:SPI 主设备控制器数据发送,源:SPI 主设备。Master Out Slave In

MISO:SPI 主设备控制器数据接收,源:SPI 从设备。Master In Slave Out

SS:从设备片选,源:SPI 主设备。Slave Select

SPI通信从设备

SCLK:SPI 通信时钟,源:SPI 主设备。

SIMO:SPI 从设备控制器数据接收,源:SPI 主设备。Slave In Master Out

SOMI:SPI 从设备控制器数据发送,源:SPI 从设备。Slave Out Master In 

SS:从设备片选,源:SPI 主设备。Slave Select

SPI 时序协议

SPI 串行同步时钟可以设置为不同的极性(Clock Polarity,CPOL)与相位(Clock Phase,CPHA)


CPOL(时钟极性)
决定在总线空闲时,同步时钟(SCK)信号线上的电位是高电平还是低电平。

当时钟极性为0时(CPOL=0), SCK信号线在空闲时为低电平;
当时钟极性为1时(CPOL=1) ,SCK信号线在空闲时为高电平;

CPHA(时钟的相位)
对于SPI主控制器决定了数据的更新时刻设计,对于SPI从控制器决定了数据的采样时刻。

当时钟相位为0时(CPHA=0),在SCK信号线的第一个跳变沿进行采样;
当时钟相位为1时(CPHA=1),在SCK信号线的第二个跳变沿进行采样;

以下我们给出CPOL和CPHA的共计4种情况。


1、CPOL = 0;CPHA = 0;

CPOL=0, CPHA=0默认SCLK为低电平,对于发送方,在对于第1个bit数据提前放到总线,建议提前0.5个SCK周期,对于接收方,数据在第1个SCLK跳变沿采样,并且容易满足时序约束。

2、CPOL = 0;CPHA = 1;

CPOL=0, CPHA=1默认SCLK为低电平,对于发送方,在第1个SCLK的跳变沿更新(对于第一个bit 数据可以提前放到总线)对于接收方,数据在第2个SCLK跳变沿采样,并且容易满足时序约束。

3、CPOL = 1;CPHA = 0;

 CPOL=1,CPHA=0默认SCLK为高电平,对于发送方,在对于第1个bit 数据提前放到总线(建义提前0.5个SCK周期)对于接收方,数据在第1个SCLK跳变沿采样,并且容易满足时序约束。

3、CPOL = 1;CPHA = 1;

 CPOL=1 CPHA=1默认SCLK为高电平,对于发送方,在第1个SCLK的跳变沿更新(对于第一
个bit数据可以提前放到总线)对于接收方,数据在第2个SCLK跳变沿采样,并且容易满足时序约束。

SPI 驱动模型

 一个基本的SPIl Master驱动程序至少包含用于产生SCLK的时钟分频单元,发送数据并串移位模块、接收数据串并移位模块;
一个基本的SPI Slave驱动程序至少包含接收数据的串并移位模块,和发送数据的并串转换模块。


目前只先介绍较为基础的标准 SPI 通信协议(x1模式),后续会继续添加更为复杂的模式的基本介绍~

http://www.lryc.cn/news/6102.html

相关文章:

  • 为什么西门子、美的等企业这样进行架构升级,看看改造效果就知道了
  • open3d点云配准函数registration_icp
  • HTML编码规范
  • PDF SDK for Linux 8.4.2 Crack
  • vb 模块和作用域的关系
  • Redis分布式锁
  • 京东前端经典面试题整理
  • django+mysql实现一个简单的web登录页面
  • python cartopy手动导入地图数据绘制底图/python地图上绘制散点图:Downloading:warnings/散点图添加图里标签
  • JavaScript中常用的数组方法
  • 磁疗为什么“没效果”?原来真相是这样!
  • 【直击招聘C++】5.1函数模板
  • 谈谈Java多线程离不开的AQS
  • 国际化语言,多语言三种方式
  • C++——哈希3|位图
  • 75 error
  • ESP-C3入门8. 连接WiFi并打印信息
  • 使用python将EXCEL表格中数据转存到数据库
  • 【C++】类和对象(三)
  • vTESTstudio - VT System CAPL Functions - General/Trigger Function
  • IDEA 快捷键
  • 2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过
  • 微信公众号扫码授权登录思路
  • 数据结构与算法基础-学习-10-线性表之顺序栈的清理、销毁、压栈、弹栈
  • Hazel游戏引擎(005)
  • 牛客网Python篇数据分析习题(四)
  • 盲盒如何创业?
  • 第1集丨Java中面向对象相关概念汇总
  • 高性能(二)
  • Allegro如何实现同一个屏幕界面分屏显示操作指导