STM32(十八):SPI通信

embedded/2024/10/9 14:46:48/

SPI通信:

        SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线

        四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)主机输出从机输入、MISO(Master Input Slave Output)、SS(Slave Select)

        同步,全双工

        支持总线挂载多设备(一主多从

硬件电路:

        所有SPI设备的SCK、MOSI、MISO分别连在一起

        主机另外引出多条SS控制线,分别接到各从机的SS引脚

        6输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

移位示意图:

 SPI时序基本单元

        起始条件:SS从高电平切换到低电平

        终止条件:SS从低电平切换到高电平

        交换一个字节(模式0)

        CPOL=0:空闲状态时,SCK为低电平

        CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

        交换一个字节(模式1)

        CPOL=0:空闲状态时,SCK为低电平

        CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

        交换一个字节(模式2)

        CPOL=1:空闲状态时,SCK为高电平

        CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

        交换一个字节(模式3)

        CPOL=1:空闲状态时,SCK为高电平

        CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

 SPI时序:

发送指令

向SS指定的设备,发送指令(0x06)

指定地址写

向SS指定的设备,发送写指令(0x02),

随后在指定地址(Address[23:0])下,写入指定数据(Data)

 

指定地址读

向SS指定的设备,发送读指令(0x03),

随后在指定地址(Address[23:0])下,读取从机数据(Data)

 W25Q64简介

W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景

存储介质:Nor Flash(闪存)

时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)

存储容量(24位地址):

       W25Q40:      4Mbit / 512KByte

       W25Q80:      8Mbit / 1MByte

       W25Q16:      16Mbit / 2MByte

       W25Q32:      32Mbit / 4MByte

       W25Q64:      64Mbit / 8MByte

       W25Q128:  128Mbit / 16MByte

       W25Q256:  256Mbit / 32MByte

 

         64KB为1块,一共128块。xx0000-xxFFFF

        每一块分为多个扇区Sector,每个扇区为4KB,每块一共是16个扇区。xxx000-xxxFFF.

        一页内的地址变化范围是xxxx00,到xxxxFF。

写入操作时:

        写入操作前,必须先进行写使能

        每个数据位只能由1改写为0,不能由0改写为1。例如某存储单元存储0xAA(1010  1010)

在这个存储单元里写入新的数据0x55(0101  0101) 就变成0x00了。

        写入数据前必须先擦除,擦除后,所有数据位变为1

        擦除必须按最小擦除单元进行(全部,块、扇区)最少4096个字节一起擦。

        连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入

        写入操作结束后,芯片进入忙状态,不响应新的读写操作

读取操作时:

        直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取。

这个芯片可以支持SPI模式0和SPI模式3 。

SPI外设:

        STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担

        可配置8位/16位数据帧、高位先行/低位先行   (串口是地位先行,I2C和SPI是高位先行)

        时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)

        支持多主机模型、主或从操作。

        可精简为半双工/单工通信。

        支持DMA。

        兼容I2S协议。

STM32F103C8T6 硬件SPI资源:SPI1(APB2、PCLK72M)、SPI2(APB1、PCLK36M)

        图中左上角表示移位寄存器右移,低位先行的模式。LSBFIRST控制位可以控制低位先行还是高位先行。给0先发送高位,给1先发送低位。

 接收缓冲区分为TDR和RDR,他俩共用一个地址。 发送寄存器移入到移位寄存器时候,置TXE位为1,检测到TXE位为1时,可以移入发送缓冲区。 移位寄存器完成输出和移入时候,移入的数据会整体的转入到接收缓冲区中,置RXNE为1,检测到为1后就要尽快把数据从RDR中读出来。 

        SPI是全双工,发送和接收同步进行,所以数据寄存器发送和接收分离。移位寄存器发送和接收可以共用。

        BR0、BR1、BR2三位对时钟分频进行控制。

        SPE:SPI使能。

        CPOL、CPLA:配置SPI的四种模式

        SSOE为1时,NSS作为输出引脚,并在当前设备变为主设备时,给NSS输出低电平。当主机结束后,SSOE要清零,NSS变为输入。

        SSM位决定右侧中间的数据选择器的选择哪一路,上面一路是硬件NSS模式,即:外部如果输入了低电平,那当前的设备就进入不了主模式,线路中已经有了主模式。下面一路是软件管理NSS输入,NSS是1还是0,由SSI来决定。

主模式全双工连续传输 

        效率高、程序逻辑复杂。

 非连续传输

         程序逻辑简单,效率低。

软硬件波形对比 

 


http://www.ppmy.cn/embedded/125113.html

相关文章

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互

在PGSQL中,有的类型是UUID和UUID[]这种类型,在mybatis和这些类型交互的时候,Java中的类型可以设置为UUID和List(好像也不行,后续看一下),这是兼容的,可以正常读取和更新,但是在使用mybatis-Plus…

在 deepin 上除了 Steam,还能怎么玩游戏?

查看原文 前段时间,很多朋友在 deepin 23 上实现了《黑神话:悟空》的通关,那么除了通过 Steam 玩 Windows 游戏之外,还有其他可以使用的游戏平台吗? 回答,当然是可以哒! 游戏平台介绍 今天介…

大数据行业应用实训室建设方案

摘要: 本文旨在探讨唯众针对当前大数据行业的人才需求,提出的《大数据行业应用实训室建设方案》。该方案旨在构建一个集理论教学、实践操作、技术创新与行业应用于一体的综合实训平台,以培养具备实战能力的大数据专业人才。 一、大数据课程体…

五款专业三维数据处理工具:GISBox、Cesiumlab、OSGBLab、灵易智模、倾斜伴侣深度解析

随着三维数据处理技术的广泛应用,尤其是在城市规划、地理信息系统(GIS)、工程监测等领域,处理倾斜摄影、三维建模以及大规模数据管理的需求日益增加。以下是五款我精心挑选的倾斜摄影和三维数据处理工具——GISBox、Cesiumlab、OS…

QT学习笔记1(QT和QT creator介绍)

QT学习笔记1(QT和QT creator介绍) Qt 是一个跨平台的应用开发框架,主要用于图形用户界面(GUI)应用的开发,但也支持非GUI程序的开发。Qt 支持多种平台,如Windows、macOS、Linux、iOS和Android&a…

Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:在学习了Arduino的相关基础知识后,现在做个综合应用,给旋转的电机测速。 1.实验目的 测定旋转电机的转速。 2.实验器材-编码器 …

【web安全】——SSRF服务器端请求伪造

1.SSRF漏洞基础 1.1SSRF漏洞概述与成因 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的&#xf…

Java | Leetcode Java题解之第459题重复的子字符串

题目: 题解: class Solution {public boolean repeatedSubstringPattern(String s) {return kmp(s s, s);}public boolean kmp(String query, String pattern) {int n query.length();int m pattern.length();int[] fail new int[m];Arrays.fill(fa…