SPI协议驱动开发之四种模式和时序图

    SPI通信调试要点就是根据需求设置好SPI的模式,必要的时候可以用示波器看一下波形是否和模式相符,否则很有可能读取到的数据都是0x00或者0xff,笔者在调试一款资料很少的传感器就是因为一个模式的设置没有生效,导致debug了一天多,有点惭愧,下面重点就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引脚产生的,就是接收主控(一般是单片机)发送过来的数据。

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

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

②24位地址

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

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

③单片机接收数据

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

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

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

三、单片机程序注意

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

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

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

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: ili9341是一种常用的TFT LCD控制器芯片。对于ili9341的spi驱动代码,下面是一个概括的说明。 首先,我们需要定义SPI通信的协议和控制信号。ili9341的spi通信协议需要发送命令,例如设置坐标、图像数据格式等。还需要控制DC信号,使ili9341能够识别数据或命令。CS信号用于选中ili9341设备。 其次,我们需要在代码中实现这些协议和控制信号。这需要考虑到大量的命令、功能和输入参数。 在编写代码时,还应考虑到ili9341控制器没有内置RAM。所以我们需要发送像素数据的连续流,这可以通过像素缓存来完成。 最后,我们需要测试和调试代码,以确保它能够正确地显示图像数据。测试后,我们通过软件来刷新屏幕,并关闭屏幕时移除电源。 总之,ili9341 spi驱动代码需要深入了解ili9341通信协议和信号控制,以及构建像素缓存。最后,我们需要进行测试和调试,以确保代码正常工作。 ### 回答2: ili9341spi驱动代码是一种用于控制TFT LCD显示屏的驱动程序,可以通过SPI总线通信实现。ili9341是一款常见的LCD驱动芯片,该芯片可以实现高分辨率的显示效果。 ili9341spi驱动代码需要包含以下几个方面的内容: 1. SPI通信设置:ili9341spi驱动代码需要设置SPI通信参数,包括通信时钟频率、数据传输模式、数据传输位数等。这些设置需要根据具体的硬件平台和驱动芯片的要求进行配置。 2. 时序控制:ili9341spi驱动代码需要实现LCD屏幕的时序控制,包括垂直同步信号、水平同步信号等的控制。这些控制信号是控制LCD显示的重要参数,需要精确控制才能实现正常显示。 3. 显示数据处理:ili9341spi驱动代码需要实现对待显示数据的处理和转换,包括像素点的颜色格式、显示数据的组织结构等。这些处理需要根据具体的应用场景和需要进行灵活的设计。 4. 功能实现:ili9341spi驱动代码需要实现针对特定应用场景的功能实现,包括显示图像、文本、动画等等。这些功能需要针对具体的应用场景进行定制开发,以实现最佳的用户体验效果。 在ili9341spi驱动代码的实现过程中,需要考虑到对CPU资源的占用、显示效果的优化、开发周期等方面的影响,并且需要考虑到代码的可维护性和可扩展性。因此,在编写ili9341spi驱动代码时,需要结合自己的实际情况,选择最优的解决方案。 ### 回答3: ili9341spi是一种液晶屏幕驱动器,可以用于控制各种尺寸的液晶屏幕显示。由于其使用SPI协议进行通信,因此需要编写SPI驱动代码来控制其工作。 ILI9341SPI驱动代码的主要部分包括SPI硬件初始化,ILI9341芯片的初始化和寄存器设置,以及屏幕显示函数的编写。 在SPI硬件初始化中,需要设置SPI时钟频率和SPI模式,确保与液晶屏幕的SPI通信参数一致。 在ILI9341芯片初始化和寄存器设置中,需要使用SPI协议向芯片发送特定的命令码和数据以设置其内部寄存器,例如设置显示分辨率、像素格式、像素顺序、亮度等参数。 最后,编写屏幕显示函数时,需要通过SPI总线向ILI9341芯片发送像素数据,确保在正确的位置绘制正确的像素。这就涉及到像素数据的格式和转换,如RGB565格式。 总之,ILI9341SPI驱动代码需要综合考虑SPI通信、ILI9341芯片寄存器设置以及像素数据的转换等多个方面,才能实现正确的液晶屏幕显示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI+程序员在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值