特别是SPI和IIC的,以前写程序都直接复制别人程序,功能实现就行了也没去研究过数据传输的时候时序具体是怎么样的。 后面项目做多了,发现最常用到的通信总线无非就是SPI、IIC、USART、CAN、单口通信。 所以,我经常和无际单片机编程的学员灌输一种理念,先学会用,用多了经验丰富了再深入就轻松了。 下面,我们进入主题。
在讲时序图之前,我们先要了解spi的四种模式,不同的模式采集数据的方式不一样。 我们拿STM32单片机来举例,可以通过结构体成员配置。 这是通过固件库直接配置,固件库底层代码也是去配置相应寄存器的。
CPOL就是决定SCLK这个时钟信号线,在没有数据传输的时候的电平状态。 CPOL=1:空闲状态时,SCLK保持高电平
CPHA=0:数据从第一个时钟(SLCK)边沿开始采集 Ok,理解CPOL和CPHA基本概念以后,下面这两个要开始”合体”了。 声明:部分图片源自网络,并非原创哈。
因为从机,从机指的是使用SPI协议通信的芯片,比如说w25q64(Flash)芯片,OLED屏等等。 这些都是需要看他们时序图去分析是用什么模式,如果模式不对,数据传输会有问题。 1.模式0(CPOL=0,CPHA=0) CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿 2.模式1(CPOL=0,CPHA=1) CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿 3.模式2(CPOL=1,CPHA=0) CPHA = 0:数据在第1个跳变沿(下降沿)采样
CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿 不知道你有没有发现,不同的模式,其实就是SCLK空闲时间电平状态和数据采样起点不同 如果不懂,先从开头继续看,这4种模式是后面分析整体时序图的前提。
看到这里恭喜你,你马上就能彻底攻破SPI协议了。 我们拿W25Q64这个Flash芯片举例,这种芯片在SPI通信里都是作为从机的角色,也就SPI Slave。 下面是W25Q64读数据指令的时序图,我们以这个例子来讲解下时序图要怎么看。
确定了用哪种模式,主控,也就是单片机这边才能确定数据采集的方式,主控和从机要保持一致。 有些芯片的数据手册,是没有告诉你的,那怎么知道用芯片哪种模式?
第二步:分析DI和DO是在CLK的上升沿还是下降沿采集数据,注意DI代表从机(W25Q64)的MISO引脚,DO代表从机(W25Q64)MOSI引脚。 什么是数据有效区?
一般数据是通过DI和DO两个引脚传输的,所以数据有效区就是,这一时刻,这两个引脚的只能是稳定高电平或者低电平。 传输8个位,代表1个字节的数据。
例如上图蓝色框的区域就是无效数据区,就是这个时刻CLK数据采集时钟还没来,所以DI和DO引脚的电平都可以任意变化。 从上图可以看出,DI和DO在数据有效区时,CLK是上升沿,下降沿的时候,DI和DO处于电平可任意变化的无效数据区。 首先上升沿采集数据,通过排除法,这样只有模式0和模式3符合条件。 所以,知道用模式0以后,单片机那边写程序就知道数据是从CLK上升沿读取,或者发送,还是从下降沿了。
分析时序,我们一定要先熟悉这个时序要实现什么功能,不同的功能虽然时序不一样,但是发送数据的顺序和定义不同。 我把整个时序按CLK脉冲顺序拆分成3个部分: 这里要注意的是,读指令数据是在W25Q64的DI引脚产生的,DI相当于W25Q64的MISO,就是接收主控(一般是单片机)发送过来的数据。 0x03被拆分成8个Bit在DI线上传输,每个CLK上升沿传输1个Bit。
发完读指令以后,单片机继续发24位的内存地址,相当于要读W25Q64哪个内存地址的数据。 ③单片机接收数据 因为数据从W25Q64的DO发出了,也就是W25Q64的MOSI引脚。 如果你是我们无际单片机编程学员,看文章还不是很理解的话,可以跟我反馈,反馈的人多就直播讲解,如果少就针对性一对一远程电话讲解。
51单片机一般没有内置SPI模块,所以整个时序需要自己写程序去模拟,简称模拟SPI。 但是如果用内置SPI有一个细节,特别容易被忽略,就是你读数据的时候,读一个字节之前要先发一个字节任意值数据。 比如我下面这个读数据函数:
不管从机怎么换,比如说不是W25Q24了,换成OLED屏了,时序原理也是一样的,只是相关的指令和寄存器不同。
|