谷动谷力

 找回密码
 立即注册
查看: 1854|回复: 0
打印 上一主题 下一主题
收起左侧

spi协议时序图和四种模式实际应用详解

[复制链接]
跳转到指定楼层
楼主
发表于 2022-4-23 10:59:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
spi协议时序图和四种模式实际应用详解







一、spi四种模式详解




在讲时序图之前,我们先要了解spi的四种模式,不同的模式采集数据的方式不一样。




一般内置SPI功能的单片机上,都有两个寄存器配置位CPOL和CPHA。




我们拿STM32单片机来举例,可以通过结构体成员配置。






这是通过固件库直接配置,固件库底层代码也是去配置相应寄存器的。









下面来介绍下CPOL和CPHA到底有什么用。




CPOL就是决定SCLK这个时钟信号线,在没有数据传输的时候的电平状态。




CPOL=0:空闲状态时,SCLK保持低电平




CPOL=1:空闲状态时,SCLK保持高电平






CPHA就是决定数据位传输是从第一个时钟(SCLK)边沿开始,还是第二个从二个时钟(SCLK)边沿开始。




CPHA=0:数据从第一个时钟(SLCK)边沿开始采集




CPHA=1:数据从第二个时钟(SLCK)边沿开始采集






Ok,理解CPOL和CPHA基本概念以后,下面这两个要开始”合体”了。




CPOL和CPHA合体就形成了SPI四种模式。






声明:部分图片源自网络,并非原创哈。




下面再分析下4种模式的区别,比较重要。




因为从机,从机指的是使用SPI协议通信的芯片,比如说w25q64(Flash)芯片,OLED屏等等。




很多从机没有CPOL和CPHA寄存器设置位,如果你看它们数据手册会一脸懵逼,根本找不到这两个东西。




这些都是需要看他们时序图去分析是用什么模式,如果模式不对,数据传输会有问题。




这也是为什么明明自己写了时序用在这个芯片可以,换到别的spi通信的芯片就不行。




1.模式0(CPOL=0,CPHA=0)




模式0特性:




CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿




CPHA = 0:数据在第1个跳变沿(上升沿)采样






2.模式1(CPOL=0,CPHA=1)




模式1特性:




CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿




CPHA = 1:数据在第2个跳变沿(下降沿)采样






3.模式2(CPOL=1,CPHA=0)




CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿




CPHA = 0:数据在第1个跳变沿(下降沿)采样






4.模式3(CPOL=1,CPHA=1)




CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿




CPHA = 1:数据在第2个跳变沿(上升沿)采样






不知道你有没有发现,不同的模式,其实就是SCLK空闲时间电平状态和数据采样起点不同




你学废了吗?当初我就是这几种模式看得一脸懵逼。




如果不懂,先从开头继续看,这4种模式是后面分析整体时序图的前提。




二、spi时序图详解




看到这里恭喜你,你马上就能彻底攻破SPI协议了。




Spi时序图,最好的方式就是通过实际应用去学习。




我们拿W25Q64这个Flash芯片举例,这种芯片在SPI通信里都是作为从机的角色,也就SPI Slave。




一般由单片机或者其它处理器作为主控和它通信,SLCK时钟也是由主控发出。




下面是W25Q64读数据指令的时序图,我们以这个例子来讲解下时序图要怎么看。






1.先确定芯片支持什么SPI哪种模式读写数据




确定了用哪种模式,主控,也就是单片机这边才能确定数据采集的方式,主控和从机要保持一致。




从时序图中,不难发现,W25Q64的数据手册直接告诉你支持用SPI模式0和模式3来通信。




有些芯片的数据手册,是没有告诉你的,那怎么知道用芯片哪种模式?






第一步:通过时序图分析CLK空闲时的电平状态,通过上面那个时序图,我们可以得知,高低电平都可以对吧?那我们现在先用CLK空闲时是低电平这种状态继续往下分析。




第二步:分析DI和DO是在CLK的上升沿还是下降沿采集数据,注意DI代表从机(W25Q64)的MISO引脚,DO代表从机(W25Q64)MOSI引脚。




我们主要通过DI和DO在数据有效区时CLK是上升沿还是下降沿,来判断




什么是数据有效区?






大家看上面这张图,我用红色框起来的区域就是数据有效区。




一般数据是通过DI和DO两个引脚传输的,所以数据有效区就是,这一时刻,这两个引脚的只能是稳定高电平或者低电平。




相当于数据有效区的电平就是最终要传输的数据位,低电平代表0,高电平代表1




传输8个位,代表1个字节的数据。




什么是无效数据区?






例如上图蓝色框的区域就是无效数据区,就是这个时刻CLK数据采集时钟还没来,所以DI和DO引脚的电平都可以任意变化。




理解了这两个概念以后,我们重点需要关心是的DI和DO在数据有效区的时候,CLK是上升沿还是下降沿






从上图可以看出,DI和DO在数据有效区时,CLK是上升沿,下降沿的时候,DI和DO处于电平可任意变化的无效数据区。




这样,就可以分析出模式了。




首先上升沿采集数据,通过排除法,这样只有模式0和模式3符合条件。




然后就是CLK空闲时间要为低电平,这样就只有模式0符合了。




所以,知道用模式0以后,单片机那边写程序就知道数据是从CLK上升沿读取,或者发送,还是从下降沿了。




2.分析整体时序




分析时序,我们一定要先熟悉这个时序要实现什么功能,不同的功能虽然时序不一样,但是发送数据的顺序和定义不同。




我们现在分析的这个时序是从W25Q64这个Flash芯片读取存储的数据。






我把整个时序按CLK脉冲顺序拆分成3个部分:




①读指令




这里要注意的是,读指令数据是在W25Q64的DI引脚产生的,DI相当于W25Q64的MISO,就是接收主控(一般是单片机)发送过来的数据。




所以,这个读指令(0x03)是单片机发给W25Q64的




0x03被拆分成8个Bit在DI线上传输,每个CLK上升沿传输1个Bit。






②24位地址




发完读指令以后,单片机继续发24位的内存地址,相当于要读W25Q64哪个内存地址的数据。




这个数据是由单片机程序定的,所以不是固定的,大家可以看到数据位都是可以高电平,也可以是低电平。




③单片机接收数据




这个时候通信双方的角色就变了,单片机变成了数据接收方,W25Q64变成了数据发送方。




因为数据从W25Q64的DO发出了,也就是W25Q64的MOSI引脚。




通过这个时序,单片机就可以读到存储在W25Q64指定地址的数据了。




如果你是我们无际单片机编程学员,看文章还不是很理解的话,可以跟我反馈,反馈的人多就直播讲解,如果少就针对性一对一远程电话讲解。




三、单片机程序注意




51单片机一般没有内置SPI模块,所以整个时序需要自己写程序去模拟,简称模拟SPI。




而STM32单片机一般有内置SPI,就不用自己写程序去模拟时序,直接应用。




但是如果用内置SPI有一个细节,特别容易被忽略,就是你读数据的时候,读一个字节之前要先发一个字节任意值数据。




发一个字节任意值数据是为了在CLK总线上产生时钟,给从机的SPI信号提供时钟用的,从机SPI不会自己产生CLK信号的。




比如我下面这个读数据函数:






能理解到这一步,你基本上就已经吃透SPI协议了。




不管从机怎么换,比如说不是W25Q24了,换成OLED屏了,时序原理也是一样的,只是相关的指令和寄存器不同。




如果对你有帮助,麻烦点赞 在看, 关注 转发~ 谢谢, 您的支持,是我们写着的最大动力





+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-27 23:17 , Processed in 0.120428 second(s), 42 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表