一、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××××××××××××××××××××××××××××××××××××××××××××/

最新文章

  1. AVAudioPlayer
  2. PHP变量入门教程(4)PHP 的外部变量
  3. 转:Log4j使用
  4. 【原】javascript最佳实践
  5. linux添加字体的过程
  6. HDU 4576
  7. 连接db2数据库时NumberFormatException异常的解决方式
  8. NodeJS路径的小问题
  9. jgroups 入门
  10. 中文man帮助安装
  11. MD5和SHA512Managed ——哈希算法
  12. 【转】vs2010下创建webservice
  13. html系列教程--header head iframe img
  14. javascript笔记整理(对象的继承顺序、分类)
  15. html5存储相关 coookie localstorage session storage
  16. 201521123084 《Java程序设计》第10周学习总结
  17. ORACLE表数据误删除的恢复方法(提交事务也可以)
  18. JS事件(一)事件流&事件处理程序
  19. Altera FPGA SoC搭建步骤
  20. c++ 面试题(海量数据篇)

热门文章

  1. CF935B Fafa and the Gates 题解
  2. 遇到奇葩的现象,给input的id为10的value属性赋值为6,但是怎么显示的时候值还是原先的9的
  3. ARTS Week 18
  4. 【LeetCode】967. Numbers With Same Consecutive Differences 解题报告(Python & C++)
  5. 【LeetCode】941. Valid Mountain Array 解题报告(Python)
  6. 【LeetCode】36. Valid Sudoku 解题报告(Python)
  7. hdu-5569matrix(dp)
  8. 『学了就忘』vim编辑器基础 — 95、命令模式中的相关命令
  9. 慢 SQL 优化
  10. Dubbo为什么要用Go重写?