很多初学者可能会不明白为什么发送函数(如下面的代码片段所示)里发送数据后通过接收数据的方式来判断发送的数据是否已发送完毕,也不解为什么接收数据前要发送一个任意数据到从机,那是因为在全双工模式下,发送和接收数据是同步进行的,即你发送数据给从机的同时,从机也会发送数据给你,而这个接收到的数据有效还是无效,完全是看相应芯片所制定的协议,但一定会发送,所以可以通过接收从机数据的方式来判断数据是否已发送完毕;而接收数据因为从机没有时钟信号,需要主机提供,所以通过给从机发送数据(任意数)的方式提供时钟信号,正如前面所述,发送一个数据意味着接收到一个数据,将接收到的数据保存即可。

1 #define Dummy_Byte 0xFF
2 /**
3 * @brief 使用SPI 发送一个字节的数据
4 * @param byte:要发送的数据
5 * @retval 返回接收到的数据
6 */
7 u8 SPI_FLASH_SendByte(u8 byte)
8 {9 SPITimeout = SPIT_FLAG_TIMEOUT;
10
11 /* 等待发送缓冲区为空,TXE 事件 */
12 while (SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_TXE) == RESET)
13 {14 if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
15 }
16
17 /* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
18 SPI_I2S_SendData(FLASH_SPIx, byte);
19
20 SPITimeout = SPIT_FLAG_TIMEOUT;
21
22 /* 等待接收缓冲区非空,RXNE 事件 */
23 while (SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_RXNE) == RESET)
24 {25 if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
26 }
27
28 /* 读取数据寄存器,获取接收缓冲区数据 */
29 return SPI_I2S_ReceiveData(FLASH_SPIx);
30 }
31
32 /**
33 * @brief 使用SPI 读取一个字节的数据
34 * @param 无
35 * @retval 返回接收到的数据
36 */
37 u8 SPI_FLASH_ReadByte(void)
38 {39 return (SPI_FLASH_SendByte(Dummy_Byte));
40 }

参考文章:
这篇文章介绍的非常清楚

SPI全双工模式下收发字节的理解相关推荐

  1. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)...

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...

  2. MSP432的SPI通信模式

    目录 2.3 MSP432的SPI通信模式 2.3.1 SPI的主机模式 2.3.2 SPI的从机模式 2.3.3 串行时钟控制 2.3.3 SPI中断 2.3.4 SPI模式--eUSCI寄存器 2 ...

  3. 全双工模式和半双工模式的区别

    在双工模式下,HiPER 的所有物理端口都支持全双工和半双工模式. 双工器的方式 在串行通信中,数据通常在两个站点(如终端和计算机)之间传输. 根据数据流向,可分为三种基本传输方式:全双工.半双工和单 ...

  4. CSMA/CD在全双工和半双工模式下的区别

    谈谈以太网中何时使用CSMA/CD冲突检测机制 关于以太网何时使用CSMA/CD检测机制,这个问题前两天刚和朋友做了讨论.在网络上搜索和很久,也有一些同行们不太理解,特别是一些初学CCNA的,没有工作 ...

  5. SPI模式下MCU对SD卡的控制及操作命令

    一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...

  6. 使用STM32在SPI模式下读写SD卡

    使用STM32在SPI模式下读写SD卡 代码分享 一.实验原理图 二.SD卡 三.实验操作 1.在stm32cubemx建立工程 2.根据上面的原理图连接硬件 3.keil编译和烧录 四.实验结果 总 ...

  7. 理解严格模式下JavaScript的this指向的变化

    全局代码中的this 全局中的代码不管是否处于严格模式下,它的this都执行Window console.log(this) // Window 复制代码 箭头函数的this 箭头函数的this由上下 ...

  8. SPI全双工与半双工

    目录 SPI全双工 SPI半双工 SPI全双工 SPI全双工,参考<野火STM32库开发指南> 四线模式(NSS, SCK, MOSI, MISO)的基本通信时序见下图 图1 SPI全双工 ...

  9. 大端模式、小端模式、高字节序、低字节序、MSB、LSB

    摘要:你知道内存是怎么读取数据的吗?知道数据是怎么一个一个字节发送的吗?是低字节先发还是高字节先发?是bit0先发还是bit7先发?是从低地址开始读还是从高地址开始读?看完本篇比应该就明白了~ 内存的 ...

  10. 计算机和打印机是全双工吗,全双工模式

    要理解全双工,就得与半双工一起比较讨论. 全双工:[1] 指可以同时(瞬时)进行信号的双向传输(A→B且B→A).指A→B的同时B→A,是瞬时同步的. 半双工:指一个时间内只有一个方向的信号传输(A→ ...

最新文章

  1. 技术图文:02 创建型设计模式(上)
  2. 新手求助,关于添加隐式intent程序崩溃问题
  3. 直流电路相关计算机,计算机专业用复杂直流电路习题(各种方法运用).doc
  4. 科沃斯扫地机器人阿尔法_科沃斯扫地机器人app
  5. mysql 主主+ Keepalived 高可用
  6. google android广告异步加载,谷歌广告异步代码和同步代码的解决方法
  7. java栈编程题_Java实现栈和队列面试题
  8. 第2节 storm实时看板案例:10、redis的安装使用回顾
  9. thinkpython2e电子书下载_《Think Python 2e》中译版电子书分享
  10. 实战MEF(4):搜索范围
  11. Serv-u6.0提权新玩法
  12. 基于FPGA的车牌识别
  13. FFmpeg入门详解之74:FFmpeg转码器Java版之需求规格说明书
  14. 关于-宏碁4741G换固态硬盘SSD的一些注意事项
  15. 关于初级安全工程师的培训思路或大纲整理
  16. Symbian手记【四】 —— Symbian的容器
  17. java int和Integer的区别
  18. 芯片数据分析步骤1 芯片数据下载-GEO
  19. excel学习-文本函数(left+right+len)
  20. Verilog语言菜鸟教程知识关键点记录

热门文章

  1. QT5.12.1 ARM开发环境搭建 并 移植到RK3399 ubuntu16.04系统运行【完整版】
  2. SAP 未审批的采购订单(PO)提交到OA去审批,最后OA审批结果回写到SAP。
  3. CRA对于IE9的兼容性设置
  4. html 简繁转换 批量,繁简文件批量互转程序
  5. 游戏策划在游戏的开发过程中扮演什么角色?——游戏策划入门
  6. 怎么压缩PNG图片的大小?如何对PNG图片进行压缩
  7. 一分钟入门typescript
  8. Scrum板与Kanban如何抉择?prwnfivgd板与按照pgvhzd
  9. Java编写五线谱上的音符_在五线谱上怎么写音符
  10. android 模拟器后缀名,apk是什么文件?apk文件模拟器是什么?