当前位置: 首页 > news >正文

SPI通信过程以及 STM32的SPI特性构架

1、SPI基本的通信的通讯时许
这里写图片描述

1、通讯的起始和停止信号
NSS片选信号由高到低 表示通讯的开始
NSS片选信号由低到高 表示通讯的结束
数据只有在NSS为低电平的时候才会接收和发送

2、数据的有效性
SPI使用MOSI MISO来接收发送数据,使用SCK来进行 数据同步。MOSI 及
MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。
通过CPOL时钟极性/CPHA时钟相移来配置SPI的通讯模式。
CPOL: 0 SCK在空闲状态下为低电平
CPOL: 1 SCK在空闲状态下为高电平
CPHA: 0 数据在奇数边沿被采样
CPHA: 1 数据在偶数边沿被采样

STM32的SPI构架以及特性
这里写图片描述
1、通讯引脚
引脚 编号
SPI1 SPI2 SPI3
NSS PA4 PB12 PA15 下载口的 TDI
CLK PA5 PB13 PB3下载口的 TDO
MISO PA6 PB14 PB4 下载口的 NTRST
MOSI PA7 PB15 PB5
SPI1是APB2外设,最大传输速率为36Mbits/S
SPI2、SPI3是APB1外设,最大传输速率为18Mbits/s

2、时钟控制逻辑
CK线的时钟信号,由波特率发生器根据“控制寄存器 CR1”中的 BR[0:2]位控制,该位是对 fpclk 时钟的分频因子,对 fpclk 的分频结果就是 SCK 引脚的输出时钟频率

3、数据控制逻辑
数据发送:当向外部发送数据的时候,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去;
数据接收:当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到“接收缓冲区”中。
通过写 SPI的“数据寄存器 DR”把数据填充到发送缓冲区中,通过读“数据寄存器 DR”,可以获取接收缓冲区中的内容
其中数据帧长度可以通过“控制寄存器 CR1”的“DFF 位”配置成 8 位及 16 位模式;配置“LSBFIRST 位”可选择 MSB 先行还是 LSB 先行。

4、整体控制逻辑
主要是控制寄存器的配置以及状态寄存器的读取

通讯过程
1、控制 NSS 信号线,产生起始信号
2、把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区
3、通讯开始, SCK 时钟开始运行。 MOSI 把发送缓冲区中的数据一位一位地传输出去; MISO 则把数据一位一位地存储进接收缓冲区中;
4、当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
5、等待到“TXE标志位”为 1时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容

相关文章:

  • 通讯的基本概念以及分类
  • STM32通用同步异步收发器(USART)
  • STM32 I2C学习
  • STM32定时器学习---基本定时器
  • C语言小知识(1)
  • C语言小知识(2)
  • STM32 GPIO的几种工作模式
  • STM32高级定时器(1)
  • STM32 高级定时器(2)
  • C语言指针基础
  • 指针与二维数组
  • 单链表的学习
  • 单链表的排序+手机通讯录源码
  • QT模式对话框
  • Qlable显示文本和图片
  • 【面试系列】之二:关于js原型
  • android图片蒙层
  • Angular数据绑定机制
  • co.js - 让异步代码同步化
  • ES6之路之模块详解
  • flutter的key在widget list的作用以及必要性
  • JavaScript 基础知识 - 入门篇(一)
  • Java精华积累:初学者都应该搞懂的问题
  • Laravel5.4 Queues队列学习
  • Logstash 参考指南(目录)
  • Material Design
  • Python连接Oracle
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Vue UI框架库开发介绍
  • Vue.js源码(2):初探List Rendering
  • vue-cli3搭建项目
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 服务器从安装到部署全过程(二)
  • 精彩代码 vue.js
  • 2017年360最后一道编程题
  • Spring第一个helloWorld
  • ​iOS安全加固方法及实现
  • ​学习一下,什么是预包装食品?​
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (+4)2.2UML建模图
  • (2)STL算法之元素计数
  • (39)STM32——FLASH闪存
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (70min)字节暑假实习二面(已挂)
  • (9)目标检测_SSD的原理
  • (Java数据结构)ArrayList
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十) 初识 Docker file
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net 垃圾回收机制原理(二)