spi协议时序图和四种模式实际应用详解
大家好,我是无际。
上个章节我们讲解了spi接口定义,今天我们更加深入讲解下spi协议时序图和spi四种模式的用法。
刚开始接触单片机开发时,最怕就是看时序图,对于我来说就是奇怪的知识。
特别是SPI和IIC的,以前写程序都直接复制别人程序,功能实现就行了也没去研究过数据传输的时候时序具体是怎么样的。
那个时候经验也不足,网上搜的资料说的都太学术化了,也看不懂。
后面项目做多了,发现最常用到的通信总线无非就是SPI、IIC、USART、CAN、单口通信。
理解也慢慢深刻了,现在去分析时序图也更加清晰了。
所以,我经常和无际单片机编程的学员灌输一种理念,先学会用,用多了经验丰富了再深入就轻松了 。
不要在你没经验的时候去死磕,否则会付出很多不必要的时间成本。
下面,我们进入主题。
一、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屏了,时序原理也是一样的,只是相关的指令和寄存器不同。
如果对你有帮助,麻烦给我安排个三连趴~
单片机实例分享,简易网络测试仪
网络已经融入了当今生活的各个方面,成为绝大多数人生活中不可或缺的重要组成部分。因为职业的关系,笔者经常会接触到网线的铺设以及网络的测试等方面工作,在工作中我发现借助专业的网络测试仪,可以极大地减少网络故障的排查时间,并能很好地提高工作效率。
专业的网络测试仪功能很强大:电缆查找、扫描线序、PING功能、寻找端口以及数据包分析等。然而,不容忽视的是,尽管一个专业的网络测试仪功能很强大,但价格往往不菲,动辄上万,因此相对于国外来说,国内使用范围还很有限。能不能自己设计一个简单实用的网络测试仪呢?当然可以。
网线制作的线序可以使用网线测试仪进行测试,并且价格也很便宜,因此,暂且忽略这个功能。综合考虑常用的几个功能,笔者设计的简易网络测试仪(以下简称测试仪)支持:PING功能、DHCP功能测试以及网络访问测试,也就是说,此测试仪建立在网络数据传输之上,能直观地反映网络传输性能。
笔者的设计思路如图30.1所示。
图30.1 简易网络测试仪结构
元器件选择
图30.2所示是此测试仪所用元器件,使用的元器件清单如表30.1所示。
图30.2 元器件实物
表30.1 元器件清单
1.网络传输接口芯片
网络传输接口是本测试仪的重点,选择一款合适的接口芯片对于简化制作及日后工作的稳定性都尤为重要。在这里,笔者选择了 ENC28J60,ENC28J60 是 Microchip Technology(美国微芯科技公司)2005年推出的28引脚封装独立以太网控制器。自从推出以来,应用极其广泛,这得益于它的引脚非常少、外围电路很简单、使用3线SPI串行接口和单片机通信。由于它占用芯片引脚非常少,所以焊接容易,甚至可以直接在洞洞板上进行电路布局。
2.MCU 主控芯片
由于选定ENC28J60作为网络接口芯片,MCU的引脚只需保证以下条件即可:
(1)支持3/4线SPI接口,用于与ENC28J60通信,当然,用I/O模拟也可,只是速度会稍慢;
(2)网络需要一定的数据包RAM缓存,因此主控芯片RAM至少为1KB以上;
(3)网络协议占用大量的代码空间,考虑到扩展性,片内Flash最好大于32KB。
在此,从通用与易上手方面综合考虑,笔者选用了51内核的1T单片机STC12C5A60S2,此单片机的特点为:改进传统51单片机12T的指令运行周期,达到了1T,速度大大提高;内部Flash空间达到了60KB,不用担心因程序代码的空间过大而放不下的问题。
电路设计规划
此测试仪的电路非常简单,主体由3片IC组成,外加带网络变压器的RJ45接口座HR911105A以及少量的阻容元器件。
显示器采用最常用的LCM1602字符型液晶显示屏,虽然只能显示16×2个字符,但经过优化的主菜单看起来效果也不错。
电路图如图30.3所示。
图30.3 简易网络测试仪电路图
工作流程简介
从笔者的设计思路中可以看出,测试仪采用菜单的形式对功能进行分类,包括TCP网页测试页面、PING命令以及通过DHCP功能从路由器自动获取IP这3大功能。其中,对网络协议的数据包处理与分发是测试仪工作的重点,在此,笔者就对此进行简要的介绍。
网络数据传输中,最常用的协议组就是“TCP/IP协议”,是一个协议组。相对测试仪系统而言,用到的协议有以下几个。
(1)ARP协议:该协议为大部分数据传输的前提,用于询问对方的MAC地址,以便在后期点对点传输中发送含有正确MAC的数据包。
(2)IP 协议:该协议用于点对点数据传输过程,通过 IP 地址判别接收方的数据包,它是ICMP、UDP和TCP协议的“容器”。
(3)ICMP协议:换个通俗的说法,该协议就是PING,用于确认对方的连接状态,正常连接就能收到PING回应。
(4)UDP协议:该协议是简单的面向数据包的传输层协议,不需要通过复杂的握手协议,只需要知道对方的IP地址和MAC即可进行数据传输,因此具有高效、却不可靠的特点。
(5)TCP协议:该协议是高可靠性的包交换传输协议,通过复杂的握手、重发、回应协议机制进行传输,和UDP相反,具有冗余、可靠的特点。
(6)DHCP协议:该协议是用来实现自动从路由器上获取IP地址、子网掩码以及网关IP地址的功能,免去了手动设置IP的麻烦。
这6个常用的协议只是众多网络协议中的很小一部分,但却负担着大部分网络传输任务,因此,网络传输其实并非很多人想象得那么不可捉摸。
焊接安装与调试
由于元器件不多,电路结构比较简单,遂采用Protel 99SE设计,完成后的PCB布局如图30.4所示。只要焊接无误,上电烧写程序后即能正常工作。笔者试制了几个均一次成功。
图30.4 PCB 布局
实际效果
焊接完成之后的效果如图30.5所示,之后进行液晶显示屏装配,效果如图30.6所示。
图30.5 焊接完成图
图30.6 装配上液晶显示屏
上电初始化完成后,进入主菜单,如图30.7所示,可以按动Next按键选择相应的功能,按Enter按键确认。
选择功能1是WebServer,是运行TCP网页测试的页面,用于网络中的电脑对测试仪进行数据访问测试。与测试仪在同一网络中的电脑均可以通过IE浏览器访问测试仪,在浏览器地址栏输入测试仪的地址即可,图30.8所示为测试仪运行界面,图30.9所示为电脑访问测试仪的网页,网页上可以显示电脑的IP地址以及MAC地址。
图30.7 主菜单
图30.8 运行网页服务器
选择功能2为PING功能,它是用于测试仪对网络中的电脑进行数据交换测试,不仅可以对同一局域网内的电脑进行测试,也可对跨越路由器的远程IP地址进行PING。如果对端电脑未能对测试仪进行回应,测试仪就会显示“Response TTL= ???”;如果收到回应,则显示TTL=064(也可能是255、128、32等);如果对端的电脑跨越路由器,则每跨越一层路由器,TTL的数值就会减1,这个数据也可以粗略地估计数据包经过的路由器层数。All后的数据表示总共进行了几次PING,Succ后的数据表示成功的PING次数,All与Succ之差就是丢包的次数。网络状况良好时,一般All和Succ的数据相等。图30.10为PING功能的PING通状态。
图30.9 电脑访问网页服务
选择功能3为设置功能,可以对测试仪的IP地址、子网掩码以及网关进行设置,也可在开启DHCP功能的路由器网络内,通过打开测试仪的DHCP功能从路由器处自动获取上述3个参数,这样就更加方便使用了,图30.11所示为设置的参数。
图30.10 PING 功能的PING 通状态
图30.11 设置菜单
总结
测试仪在设计之初,就本着尽量精简的原则,在完成支持ARP、ICMP、DHCP以及TCP协议的情况下,删除不必要的协议。因此,系统代码相当精简,只占用了大约16KB的代码空间。当然,它也仅能完成菜单选择PING命令、自动获取IP和网页显示电脑参数等简单的功能,一些复杂的网络功能,例如数据协议分析显示、网络数据包存储等,由于体积和硬件所限,在本测试仪中尚未涉及。
经过一段时间的试用,该系统运行稳定,在日常工作中与网线测试仪搭配,能够完成大部分测试和故障判断工作,完全可以满足日常的应用。
■ 为了方便大家制作,下位机、上位机的代码与 PCB 文件均可从qq群657864614下载。
相关问答
会 51单片机 ,如何快速学习使用STM32单片机?单片机其实都是相通的,会了一种单片机,对着数据手册查看一下寄存器的设置可以快速的入手其他型号的单片机。会51单片机,说明有单片机的基础,再去学习STM32单...
单片机 如何通过ADC模块采集 模拟 信号?朋友们好,我是电子及工控技术,我来回答这个问题。众所周知单片机是一种超大规模的集成电路,它只能“读懂”并处理数字信号,对于连续量的模拟信号则无能为力。...
单片机 外挂一个人 spi 的Flash,怎么操作是明白的,但是具体的原理呢, 单片机 通过so,嗖嗖嗖过去?事实上Flash有一套自己定义的协议。你仔细分析一下你发送给FLASH的数据就会明白。通常的做法是需要单片机先告诉flash我需要读还是写,什么位置,多少字节,如果...
单片机 中 spi 可以实现什么功能?可以实现拓展功能。SPI全称为ServiceProviderInterface,是一种服务发现机制。SPI的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置...
SPI 怎么和SDA进行数据通讯?SDA和SCL是IIC/I2C中用到的两个线,一根是数据线,一根是时钟线。SPI也是一种通讯方式,一般为三线或者四线制。IIC和SPI都是非常常用的近距离通讯总线,一般芯片...
在嵌入式开发中,怎么开发 SPI IIC的驱动程序?SPI和IIC都是比较常用的短距离通讯方式,主要用在PCB板间或者芯片之间实现近距离通信。比如AT24C02就是通过IIC和单片机实现数据通信的,BMP280即可以通过IIC又可...
对 单片机 编程要用什么软件? 单片机 编程如何快速入门?你好,我就是做单片机嵌入式软件开发的,对于第一个问题,单片机开发一般都是用C语言,单片机的开发平台即编译器通用的有keil、IAR、eclipse等,现在eclipse也支...
基于dsp的 spi 驱动flash流程是怎样的?1、根据单片机手册编写SPI接口驱动,确保SPI接口可以正常通信,只要按照手册说明操作控制几个寄存器即可,比较简单;2、根据你选用的Flash编写FLASH读写驱动,...
单片机 如何与昆仑通态的触摸屏连接?单片机可以通过SPI或I2C通信协议与昆仑通态的触摸屏连接。因为昆仑通态触摸屏内部集成有控制器,可以通过SPI或I2C与外部单片机进行通信。在建立连接前,需要确...
器件怎样与 单片机 通讯?器件与单片机可以通过spi或者i2c通讯,目前很多传感器或者存储芯片通过这些通讯方式与单片机进行通讯。采用这些通讯方式的好处是,第一可以节省硬件资源,一般...