stm32 模拟spi

news2024/11/26 7:45:15

目录

简介

spi物理层

连接方式

框图

协议层:

数据处理

传输模式

模式0

起始和停止信号

 发送和接收数据

模式1

模式2 

模式3

总结


简介

spi物理层

        SPI( Serial Peripheral Interface, 串行外设接口)是一种全双工同步串行通信接口,它用于MCU与各种外围设备以串行方式进行通信以交换信息,通信速度最高可达25MHz以上。SPI 总线具有三种传输方式:全双工、单工以及半双工传输方式。

        SPI通常由四条线组成,一条主设备输出与从设备输入( Master Output Slave Input, MOSI),一条主设备输入与从设备输出( Master Input Slave Output, MISO),一条时钟信号( Serial Clock, SCLK),一条从设备使能选择( Chip Select, CS)。与I²C类似,也可以使用GPIO模拟SPI时序

        SPI可以同时发出和接收数据,因此SPI的理论传输速度比I²C更快。 SPI通过片选引脚选择从机,一个片选一个从机,因此在多从机结构中,需要占用较多引脚,而I²C通过设备地址选择从机,只要设备地址不冲突,始终只需要两个引脚

连接方式

 

        CS片选线:从设备选择信号线,常称为片选信号线,也称为 NSS、 SS,无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。当主机要选择从设备时,把该从设备的 CS信号线设置为低电平,该从设备即被选中,即片选有效,为开始信号;被拉高作为结束信号

        SCK :时钟信号线,用于通讯数据同步,两个设备之间通讯,速率受限于低速设备

        MOSI:主设备输出/从设备输入引脚,即这条线上数据的方向为主机到从机

        MISO:主设备输入/从设备输出引脚,即在这条线上数据的方向为从机到主机

框图

        ①STM32F10x芯片有3个 SPI 外设,SPI1 是 APB2 上的设备,最高通信速率达 36Mbtis/s, SPI2、 SPI3 是 APB1 上的设备,最高通信速率为 18Mbits/s,除了通讯速率,在其它功能上没有差异。因为SPI3 用到了下载接口的引脚,这几个引脚默认功能是下载,第二功能才是 IO 口,如果想使用 SPI3 接口,则程序上必须先禁用掉这几个 IO 口的下载功能。

        ②波特率发生器根据“控制寄存器 CR1”中的 BR[0:2] 位控制,对 fpclk 的分频结果就是 SCK 引脚的输出时钟频率

         配置“控制寄存器 CR”的“CPOL 位”及“CPHA”位可以把 SPI 设置成的 4 种 SPI模式,后续在协议层分析

        ③通过写 SPI 的“数据寄存器 DR”把数据填充到发送缓冲区中,通讯读“数据寄存器 DR”,可以获取接收缓冲区中的内容。其中数据帧长度可以通过“控制寄存器 CR1”的“DFF 位”配置成 8 位及 16 位模式;配置“LSBFIRST 位”可选择 MSB (高位)先行还是 LSB(低位) 先行

        ④:负责协调整个 SPI 外设,工作模式根据配置的“控制寄存器(CR1/CR2)”的参数而改变,控制参数包括前面提到的 SPI 模式、波特率、 LSB 先行、主从模式、单双向模式等等;在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。

        一般不使用 STM32 SPI 外设的标准 NSS 信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。也就是用模拟方式拉低拉高片选信号

协议层:

数据处理

        在SCK时钟周期的驱动下, MOSI和MISO同时进行,数据输入输出是同时进行的

         主机和从机都有一个移位寄存器,主机移位寄存器数据经过MOSI将数据写入从机的移位寄存器,此时从机移位寄存器的数据也通过MISO传给了主机,实现了两个移位寄存器的数据交换,外设的写操作和读操作是同步完成的。无论主机还是从机,发送和接收都是同时进行的,如同一个“环”
        如果主机只对从机进行写操作,主机只需忽略接收的从机数据即可。如果主机要读取从机数据,需要主机发送一个空数据来引发从机发送数据。

传输模式

        CPOL( Clock Polarity,时钟极性) 表示SCK在空闲时为高电平还是低电平。 当CPOL=0, SCK空闲时为低电平, 当CPOL=1, SCK空闲时为高电平。
        CPHA( Clock Phase,时钟相位) 表示SCK在第几个时钟边缘采样数据。 当CPHA=0, 在SCK第一个边沿采样数据,当CPHA=1, 在SCK第二个边沿采样数据 

        实际中采用较多的是“模式 0”与“模式 3”

模式0

        CPOL=0&&CPHA=0 的时序如下图,可以看到串行时钟的奇数边沿上升沿采样:

CPOL=0:看到对应时序中当数据未发送或者发送完毕, SCL 的状态是低电平;

CPHA=0:即是奇数边沿(第一个边沿)采集,可以看到传输的数据会在奇数边沿上升沿被采集;

MOSI和 MISO :数据的有效信号需要在 SCK 奇数边沿保持稳定且被采样,在非采样时刻(下降沿), MOSI 和MISO 的有效信号才发生变化

模式0

起始和停止信号

         NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知自己被主机选中了,开始准备与主机通讯。

void spi_start(void)
{
    /*片选线高电平拉低*/
    ctrl_cs(0);
}

        NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消

void spi_stop(void)
{
    /*片选线低电平拉高*/
    ctrl_cs(1);
}
 发送和接收数据
/*数据交换(收发)*/
uint8_t spi_swap_byte(uint8_t byte_send)
{
    uint8_t i,byte_receive = 0x00;
    for(i=0;i<8;i++)
    {
        /*开始sck默认低电平,现在就可以交换数据*/
        ctrl_mosi(byte_send & (0x80 >> i));/*通过控制对应的GPIO进行高位先发*/
        ctrl_sck(1);/*控制对应的GPIO拉高sck读取数据*/
        if(1 == read_miso())/*读取对应的GPIO接收数据*/
        {
            byte_receive |= (0x80 >> i);
        }
        ctrl_sck(0);/*拉低时钟结束*/
    }
    return byte_receive;/*交换得到的数据*/
}
模式1

        CPOL=0&CPHA=1 的时序如下图,串行时钟的偶数边沿下降沿采样:

CPOL=0:所以 SCL 的空闲状态依然是低电平

CPHA=1: 数据就从偶数边沿(第二个边沿)采样,下降沿

模式1
模式2 

         CPOL=1&&CPHA=0 的时序如下图

CPOL=1:SCL 空闲状态为高电平

CPHA=0:奇数边沿采样的情况下,数据在奇数边沿下降沿要保持稳定并等待采样

模式2
模式3

          CPOL=1&&CPHA=1 的时序如下图

CPOL=1:SCL状态是高电平,奇数边沿的边沿极性是上升沿,偶数边沿的边沿极性是下降沿
CPHA=1:数据在偶数边沿上升沿被采样。

在奇数边沿的时候 MOSI 和 MISO 会发生变化,在偶数边沿时候是稳定的。

总结

        先看CPHA,时钟相位为0,第一个(奇)边沿采样;为1,第二个(偶)边沿采样;再看CPOL,时钟极性为0,说明空闲的时候是低电平,低电平第一个采样信号肯定是拉高,由此判断是上升沿还是下降沿采样;同理时钟极性为1,说明空闲的时候是高电平,高电平第一个采样信号肯定是拉低,由此判断是上升沿还是下降沿采样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1161058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vlice DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

【51单片机】LED与独立按键(学习笔记)

一、点亮一个LED 1、LED介绍 LED&#xff1a;发光二极管 补&#xff1a;电阻读数 102 > 10 00 1k 473 > 47 000 2、Keil的使用 1、新建工程&#xff1a;Project > New Project Ctrl Shift N &#xff1a;新建文件夹 2、选型号&#xff1a;Atmel-AT89C52 3、xxx…

【Linux】Linux网络总结图详解

网络是进行分层管理的应用层HTTPHTPPS 传输层&#xff08;UDP、TCP&#xff09;UDPTCPTCP和UDP对比 网络层IP 数据链路层&#xff08;MAC&#xff09;/物理层&#xff08;以太网&#xff09;以太网通信&#xff08;负责网卡之间&#xff09; 网络是进行分层管理的 应用层 HTTP…

幂等性设计,及案例分析

一、redis锁处理幂等性失效 上面代码中&#xff0c;锁起不了作用&#xff1b; ——count方法&#xff0c;和insert方法在同一事务中&#xff0c;事务中包含锁&#xff0c;锁没有作用&#xff0c;锁的范围内&#xff0c;事务没提交&#xff0c;但释放锁后&#xff0c;事务提交前…

云安全与容器安全: 探讨在云环境和容器化应用中如何保护数据和工作负载的安全。

在当今数字化时代&#xff0c;云计算和容器化应用已经成为了企业业务的主要组成部分。这两项技术的普及&#xff0c;极大地提高了开发和部署的效率&#xff0c;但也带来了新的安全挑战。在本文中&#xff0c;我们将探讨云安全和容器安全的重要性&#xff0c;以及如何有效地保护…

WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…

Spring MVC (Next-1)

1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的&#xff0c;可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种&#xff0c;包括get,post,put,delete.分别对应获取…

低代码可视化逻辑编排工具:JNPF

目录 Intro 一、是什么&#xff1f; 提供自动化的解决方案 二、为什么受欢迎&#xff1f; JNPF自身特点——安全、方便、高效、低耗 对于企业&#xff0c;更“安全” 成本“最低”&#xff0c;效率“最高” 三、JNPF开发平台功能展示 技术介绍 参考地址 近几年&#xff0c;随着…

Tomcat下载地址(详细)

Apache Tomcat - Apache Tomcat 8 Software Downloadshttps://tomcat.apache.org/download-80.cgi2.找到Archives 3.选择下载的把版本 4.选择具体下载那个版本 5. 6.一般选择tar.gz结尾的压缩包

飞桨国际化应用案例:挪威广告企业Adevinta应用PaddleOCR提质增效

Adevinta&#xff0c;位于挪威奥斯陆的跨国在线分类广告公司&#xff0c;以其全球市场的图像处理API为特色。Adevinta的主要使命是构建全球买家和卖家之间的桥梁&#xff0c;其在线市场运营覆盖11个国家&#xff0c;拥有众多备受信任的品牌&#xff0c;如荷兰的marktplaats、德…

Stream 流对象的创建与各方法

Stream 流对象的创建与各方法 目录 1.0 Stream 流的说明 2.0 Stream 流对象的创建 2.1 对于 Collection 系列集合创建 Stream 流对象的方式 2.2 对于 Map 系列集合创建 Stream 流对象的方式 2.3 对于数组创建 Stream 流对象的方式 3.0 Stream 流的中间方法 3.1 Stream 流的 …

Jupyter notebook如何加载torch环境

默认你已经安装了anaconda 和 pytorch 环境。 1&#xff0c;必须要以管理员身份打开 Anaconda prompt终端&#xff0c; 2&#xff0c;进入pytorch环境中&#xff1a; conda activate pytorch_393&#xff0c;安装必要插件&#xff1a; &#xff08;1&#xff09;conda inst…

【力扣】2003. 每棵子树内缺失的最小基因值

【力扣】2003. 每棵子树内缺失的最小基因值 文章目录 【力扣】2003. 每棵子树内缺失的最小基因值1. 题目介绍2. 思路3. 解题代码4. Danger参考 1. 题目介绍 有一棵根节点为 0 的 家族树 &#xff0c;总共包含 n 个节点&#xff0c;节点编号为 0 到 n - 1 。 给你一个下标从 0…

国密SM算法及实现加密和解密

一 引入pom <dependency><groupId>com.antherd</groupId><artifactId>sm-crypto</artifactId><version>0.3.2</version></dependency> 二 代码实现 package com.example.ytyproject.component;import com.antherd.smcrypto.…

[架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库

目录 一、数据概述 1.1 数据 1.2 企业信息系统的数据 1.3 大数据 1.4 数据与程序的分离思想 1.5 数据与程序的分离做法 1.6 数据库的基本概念 1.7 企业数据来源 1.8 企业数据架构 二、常见的数据库类型 2.1 数据库分类 2.1 数据库类型 2.2 常见的数据库类型、应用…

在前端实现小铃铛上展示消息

点击铃铛显示如下消息框&#xff1a; 如果点击消息&#xff0c;可以实现消息从列表中移除,并从铃铛总数上进行扣减对应的已读消息数。 关于以上功能的实现方式&#xff1a; <!-- 铃铛位置 --><i class"el-icon-bell" click"showPopover true"&…

torch_geometric,scatter,sparse, cluster的安装失败

首先&#xff0c;对于自己的电脑环境是 已将安装3.9版本的python&#xff0c;成功安装11.6版本的cuda和1.31.1版本的torch。 现在想要安装torch_geometric&#xff0c; -需要先安装scatter&#xff0c;sparse&#xff0c; cluster。 直接安装失败&#xff0c;报错如下&…

小程序https证书

小程序通常需要与服务器进行数据交换&#xff0c;包括用户登录信息、个人资料、支付信息等敏感数据。如果不使用HTTPS&#xff0c;这些数据将以明文的方式在网络上传输&#xff0c;容易被恶意攻击者截获和窃取。HTTPS通过数据加密来解决这个问题&#xff0c;确保数据在传输过程…

make工具的介绍,包含的显示/隐晦规则/变量定义/文件指示,使用,.PHONY的介绍+原理

目录 make--自动化构建工具 引入 介绍 包含 显式规则 隐晦规则 变量定义 文件指示 注释 使用 test:test.c .PHONY 介绍 作用 示例 原理 示例 介绍 make--自动化构建工具 引入 在软件开发过程中&#xff0c;通常需要编译、链接和构建大量的源代码文件如果全…

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称&#xff1a;guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击&#xff1a;build all 9、 右键之后&#xff0c;点击&#xff1a;Creat Boot Image 10、点击 Cr…