《STM32从零开始学习历程》——SPI特性及架构

24 篇文章 1 订阅
6 篇文章 0 订阅

《STM32从零开始学习历程》@EnzoReventon

SPI特性及架构

相关链接:
SPI物理层及FLASH芯片介绍
SPI协议层
SPI固件库

参考资料:
[野火EmbedFire]《STM32库开发实战指南——基于野火霸天虎开发板》
[正点原子]STM32F4开发指南-库函数版本_V1.2
[ST]《STM32F4xx中文参考手册》
SPI协议及总线协议介绍
W25Q128产品数据手册

STM32的SPI外设简介

  • STM32的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2 (STM32F407型号的芯片默认fpclk2为84MHz,fpclk1为42MHz),完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。
  • 它还支持双线全双工、双线单向(两根数据线都做发送或者接收模式)以及单线模式。
  • 本文为以STM32F407为实验对象,经查阅手册,该芯片有3个SPI通讯接口,具体引脚请查阅手册。

STM32的SPI架构剖析

在这里插入图片描述

  1. ①为通讯引脚,连接到外部设备,引脚的介绍可以查看:《SPI物理层》
  2. ②为波特率发生器,用来产生时钟
  3. ③为数据控制逻辑,与I2C结构类似:内核将数据写入到发送缓冲区,使用移位寄存器将数据一位一位的经过MOSI发送出去;MISO接收数据写入到移位寄存器中,接收缓冲区将移位寄存器中的数据转移到数据总线中。
  4. ④为整体控制逻辑,SPI_CR2为控制寄存器;SPI_SR为状态寄存器;TXE发送缓冲区为空;RXNE接收缓冲区为非空;BR2\BR1\BR0为波特率寄存器,控制波特率。

时钟控制逻辑

SCK 线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2] 位控制,该位是对fpclk时钟的分频因子,对fpclk 的分频结果就是SCK 引脚的输出时钟频率,计算方法见下表。

BR[0:2]分频结果(SLK频率)BR[0:2]分频结果(SLK频率)
000fpclk/2100fpclk/32
001fpclk/4101fpclk/64
010fpclk/8110fpclk/128
011fpclk/16111fpclk/256

数据控制逻辑

SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。

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

整体控制逻辑

  • 整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。
  • 在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”(TXE,RXNE),只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。
  • 除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。
  • 实际应用中,一般不使用STM32 SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。
  • SSM软件从器件管理,SSM取1时,使能软件从器件管理,SSM取0时,禁止软件从器件管理。SSM为1时,可以随意指定一个GPIO引脚用来产生开始或者停止信号而非只能选用有SSM功能的引脚,使用灵活。

通讯过程

在这里插入图片描述
橙色:表示发送数据
黄色:表示发送标志,TXE的状态
紫色:表示接受标志,RXNE的状态
绿色:表示MISO输入

  1. 发送过程:
  • 内核向数据寄存器SPI_DR写入0xF1,数据写入到发送缓冲区,移位寄存器将数据一位一位的发送出去。
  • TXE=1(由于第一次数据传输,移位寄存器为空,数据很快的能够传输到移位寄存器中),表示数据寄存器为空,此时可以写入第二个数据进入发送缓冲区,等待转移至移位寄存器(此时TXE=0,表示移位寄存器还在发送数据中,非空),即等待TXE再次等于1。
  • 接下来的数据传输按照上述步骤重复执行,等待移位寄存器将数据发送结束,接受新的数据,等待发送。
  1. 接收过程:
  • 与发送过程一致,接收数据的标志位为RXNE,当RNXE为1时可以从数据寄存器中读取接收到的数据。

没有往SPI_DR寄存器写入数据的话,SCK将不会产生时钟,因此如果想要读取数据,就必须向SPI_DR寄存器写入数据。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EnzoReventon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值