一、STM32F4xx系列的SPI特点:

1. 支持全双工的3线SPI模式(即SCK, MISO, MOSI)

2. 支持单工2线传输,同时数据线可以设置成单向或者双向模式

3. 8-bit, 16-bit可选的数据长度

4. 可选主从模式,并且支持多主模式

5. 主模式8种波特率选择(最高波特率fPCLK/2),从模式最高频率为fPCLK/2

6. 主从模式下,片选线(NSS)可以设置为硬件控制或软件控制,同时支持主/从操作下的动态转换

7. 时钟线的极性和相位可以通过寄存器设置

8. 移位寄存器可以设置成高位先出(MSB-first)或者低位先出(LSB-fisrt)

9. 具有SPI 总线忙碌(bus busy)标志位

10. 支持 SPI TI 模式

11. 支持硬件CRC

  • 可以在数据流后传输CRC(发送模式)
  • 自动校验校验CRC(接收模式)

12.具有主模式错误标志位,溢出标志位,CRC错误校验标志位,同时可触发中断

13. 1-byte发送/接受缓存,并且支持DMA请求。

二、传输过程中的状态标志位(BSY, TXE, RXNE)

1. 全双工主模式连续传输

图1. 全双工主模式连续传输时序图

  • BSY 在传输时硬件置1,传输完成后硬件清0,图1方框①所示
  • 当Tx缓存器无数据时,TXE置1;对DR(数据寄存器,下同)进行写操作将使TXE清0,图1方框②所示
  • 当SPI接收到完整的数据后(Rx 缓存器不为0),RXNE将置1;对DR进行读操作将使RXNE清0,图1方框③所示

2. 全双工从模式连续传输

图2.  全双工从模式连续传输

  • BSY在传输期间硬件置1,在下一次传输的第一个SPI时钟周期硬件清0,然后再由硬件置1,图2方框①所示
  • 当Tx缓存器无数据时,TXE置1;对DR进行写操作将使TXE清0,图2方框②所示
  • 当SPI接收到完整的数据后(Rx 缓存器不为0),RXNE将置1;对DR进行读操作将使RXNE清0,图2方框③所示

3. 单工发送主模式连续传输

图3. 单工发送主模式连续传输时序图

  • BSY在传输期间硬件置1,在传输完成后硬件清0,图3方框①所示
  • 当Tx缓存器无数据时,TXE置1;对DR进行写操作将使TXE清0,图3方框②所示

4. 单工发送从模式连续传输

图4. 只发送从模式连续传输时序图

  • BSY在传输期间硬件置1,在下一次传输的第一个SPI时钟周期硬件清0,然后再由硬件置1,图4方框①所示
  • 当Tx缓存器无数据时,TXE置1;对DR进行写操作将使TXE清0,图4方框②所示

5. 单工接收模式连续传输

图5. 单工接收模式连续传输时序图

  • 当SPI接收到完整的数据后(Rx 缓存器不为0),RXNE将置1;对DR进行读操作将使RXNE清0,图5方框①所示

6. 非连续传输

图6. 非连续传输时序图

  • BSY 在传输期间硬件置1,在每次传输完成后置0,如图6方框①所示
  • 当Tx缓存器无数据时,TXE置1;对DR进行写操作将使TXE清0,图6方框②所示

三、连续传输与非连续传输的定义

主模式下,假如程序能很快地检测TXE的上升沿或TXE中断(即发送缓存器为空),在当前数据还未发送完成时(即移位寄存器还有数据尚未发送完),对DR寄存器进行写操作,这种情况称作连续传输,传输过程中SPI CLK是连续的,如图1~图5所示。

反之,假如在对DR寄存器进行写操作时,上一次的数据已发送完(即移位寄存器为空),这种情况称为非连续传输,传输过程中SPI CLK是断续的,如图6所示。

/×××××××××××××××××××××××××××××××××××××××× THE END××××××××××××××××××××××××××××××××××××××××××××/

[STM32F4xx 学习] SPI小结的更多相关文章

  1. [STM32F4xx 学习] SPI与nRF24L01+的应用

    前面已经总结过STM32Fxx的特点和传输过程,下面以nRF24L01+ 2.4GHz无线收发器为例,来说明如何使用SPI. 一.nRF24L01+ 2.4GHz无线收发器的介绍 1. 主要特性 全球 ...

  2. openresty 学习笔记小结:综合应用实例

    openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...

  3. [asm] 小菜汇编基础和学习技巧小结(一)

    以下小结纯属小菜自学过程产生的dump,大神请飘过! 汇编是一门庞大复杂的学问,在计算机的世界里差不多无所不入.很多编程领域都会或多或少跟汇编打交道.本人不是科班出身的程序员,所以很多基础都为零,学历 ...

  4. z-index学习知识小结

    一.z-index七阶层叠顺序表 1.层叠顺序的大小比较: background/border < 负z-index < block块状水平盒子 < float浮动盒子 < i ...

  5. HAL驱动库学习-SPI

    如何使用SPI库1 声明SPI hanlde, 例如: SPI_HandleTypeDef hspi2 通过实现HAL_SPI_MspInit()函数初始化底层资源 以下两个必须进行初始化 a 使能s ...

  6. HTTP协议——学习资料小结

    嗯,这几天回头再次的学习Servlet的知识点,觉得HTTP协议的内容是相当重要的,现在虽然知道浏览器与应用程序的交互离不开它,但是怎么将信息从浏览器传输到服务器的这个知识点还是一个盲点.于是从网上找 ...

  7. Python几周学习内容小结

    环境配置 学习python首先是要配置环境,我们选择了Anaconda. 什么是Anaconda:专注于数据分析的python发行版本. 为什么选择Anaconda:省事省心,分析利器 至于下载和安装 ...

  8. 初学c# -- 学习笔记 小结

    学了到了好些东西, 做了一些练习. 一.C# winform Socket 1.程序主要部分只是用了 Panel.Picturebox.Label.RicheditBox四个组件,滚动条.编辑框什么的 ...

  9. 2017年7月ROS学习资料小结

    <孙子兵法·谋攻篇>:"上兵伐谋,其次伐交,其次伐兵,其下攻城:攻城之法为不得已." 任何发生在自己国土上的战争,即便胜利,也饱含屈辱. ----~~~~----Gaz ...

随机推荐

  1. 『学了就忘』Linux系统定时任务 — 87、只执行一次的定时任务

    目录 1.at服务管理 2.at命令的访问控制 3.at命令 4.其他at管理命令 5.总结 定时任务是在服务器上常用到的一个工作. 在你指定的时间,系统会自动执行你指定的程序(脚本或者命令). Li ...

  2. Git的基本使用(只是基本使用)

    git上传 1.克隆到本地 git clone + git项目地址 2.添加文件 git add * 添加所有文件到本地仓库 3.查看状态 git status 4.标记 git commit -m ...

  3. LuoguP6850 NOI 题解

    Content 小 L 参加了 \(\texttt{NOI}\),现在他告诉你九个数 \(a,b,c,d,e,f,g,h,i\),分别表示--笔试作对的题数.D1T1.D1T2.D1T3.D2T1.D ...

  4. CF831B Keyboard Layouts 题解

    Content 给你 \(26\) 个字母的映射(都是小写,大写的映射方式相同),再给你一个字符串 \(s\),求它的映射结果(如果有非字母的字符保持不变). 数据范围:\(1\leqslant |s ...

  5. CF1455A Strange Functions 题解

    Content 定义一个函数 \(f(x)\) 为 \(x\) 翻转并去掉前导零之后的数,现在有 \(t\) 组询问,每组询问给定一个整数 \(n\),请求出对于所有的 \(1\leqslant x\ ...

  6. 【科普】.NET6 泛型

    本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...

  7. call this的范围

    var f1=function(){this.a="类f1的实例的a属性"}; f1代表一个类: f1.a='对象f1的a属性'; var f2=function(){};//类f ...

  8. birt分组时,如何让居中

    birt分组时,如何让居中,如下图,选择cell格,然后调整属性为all,如下图所示,

  9. flink使用命令开始、停止任务

    命令操作 进行flink的安装目录 动态上传jar包启动job ./bin/flink run -c com.test.CountMain -P 3 Test-1. 0-SNAPSHOT.jar -- ...

  10. JAVA获取本机的MAC地址

    /** * 获取本机的Mac地址 * @return */ public String getMac() { InetAddress ia; byte[] mac = null; try { // 获 ...