看起来SPI好像挺简单,连上四根线,设置好极性相位,速率等等就可以通信了,但实际上这不仅仅是SPI的通信,还有更多嵌入式所带来的问题,同样值得思考。

文章目录

  • 1.硬件连接的问题
    • 1.1 逻辑分析仪
    • 1.2 原理图
      • 1.2.1 上拉电阻
      • 1.2.2 电容
      • 1.2.3 复位
  • 2.HAL库的使用
  • 3.深入底层驱动

1.硬件连接的问题

1.1 逻辑分析仪

最开始收到12个FF的时候,没有多想,拿了一块F1的板子简单改了改代码又跑了一次,结果是一样的,然后问了导师,导师说他也不会SPI,我直接栓Q,后来有人建议用逻辑分析仪试一下,看看发送的指令是不是发出来了,然后就用来逻辑分析仪,得到的结果是这样的:

左边上面前七位是我发的指令,收到的是FF,这很正常,因为就是要把指令发完才会有应答,之前的数据无所谓,后面发送12个0用来接收应答,可以看出还是那熟悉的12个FF。

给人的感觉是这块芯片压根就没有工作嘛,在这期间真的是看了很几天的代码,觉得是代码出了问题,但这恰恰就是我第一次做项目的问题所在,在分析软件方面是否出现问题之前,一定要先检查硬件连接是否出了问题!
在分析软件方面是否出现问题之前,一定要先检查硬件连接是否出了问题!
在分析软件方面是否出现问题之前,一定要先检查硬件连接是否出了问题!

1.2 原理图

1.2.1 上拉电阻

硬件连接包括引脚之间的线是否连对了,线是否有损坏,还有就是电源供电是否正常,有没有共地,还有还有就是原理图是不是对的,在检查了前几个都没有问题后,我开始检查原理图是否正确:

从原理图中可以看出,SDA,SCL接了上拉电阻,于是我开始百度看看是否合理,因为之前画原理图的时候以为是用IIC通信,所以上拉了SDA和SCL,但这两根线也是SPI的MOSI和MISO,而实际上正常来讲,SPI的输入输出是不需要上拉电阻的,但是呢,接了上拉电阻只会增强信号,并没有什么问题,有益无害, 那么这个问题被排除了。

1.2.2 电容

在这里我看到电源和GND之间接了一个电容,思考再三想明白了,应该是用来滤波的,又查了一下,专业一点叫做“退藕”,作用是为高频信号提供通路,减小电源内阻,去除电源和地线在敷铜板上“走长线”的影响,防止公用电源的各部分电路之间的“有害交连”等等。

1.2.3 复位

复位这里就出现了问题,看了芯片的手册发现,芯片是低复位,而原理图中将复位引脚直接拉低,当成高复位了,这一发现让我重新燃起了希望,我将电阻取下来,在C38电容两端飞了一根线,结果还是12个FF,蚌埠住了。。。

但是至少硬件方面的没有问题了。

2.HAL库的使用

秉着先硬件后软件的思想,我又把矛头对准软件上的问题,我问了一个搞过SPI的师兄,他用的是HAL库驱动,在发数据和接收数据的时候是分开的,于是我又了CuBeMX生成了一个STM32F4的HAL库,在stm32f4xx_hal_spi.c中找到了分别发送和接收的SPI接口:

HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

但是HAL也有同时发送和接收数据的接口:

 HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)

然后我又都试过一遍,结果依然是12个FF,那为什么师兄会用HAL库分别发送和接收,我开始仔细研究这些接口有什么不同。

3.深入底层驱动

底层驱动说起来可能要说很多,但是抛开其他的不谈,只看接收和发送的过程可以看出:收发同步就是设置一个标志位,先将数据放进SPI_DR数据寄存器中发送,改变标志位,暂停发送,然后接收DR寄存器返回的值。

而单独发送(接收)则是设置要收到(发送)的字节大小和字节数为0,相当于发送之后就不管接收到的是什么,和之前标准库发送数据没有设置返回值是一样的。

看了很久之后发现,单独发送和接收之间的不同点就是,接收的时候需要发送Dummy数据在CLK上产生时钟,这让我对单独收发的时序产生了怀疑:

嵌入式第四课(继续SPI之路)相关推荐

  1. 【STC单片机学习】第十四课:SPI通信-实时时钟DS1302

    [朱老师课程总结 侵删] 第一部分.章节目录 1.14.1.RTC有关的背景知识 1.14.2.原理图和接线 1.14.3.数据手册带读 1.14.4.时序图的读法1​ 1.14.5.编程实践1 1. ...

  2. 【Python的自学之路】(六):案例分析第四课-小工具2.0

    目录 序言 背景 思路 代码及解析 跋文 序言 小工具1.0版本,备份oracle存储过程的小工具上篇文章已经都了解完毕了,下面继续进行功能升级,2.0版本-表数据的导出功能. 背景 案例分析第四课- ...

  3. 第四课 建站准备—配置文件修改

    第四课 建站准备-配置文件修改 时间:2011-06-18 23:51来源:未知 作者:admin点击: 103 次 这一节课,我们来给大家说一下织梦CMS配置文件的修改.为什么要修改呢?我们先来看一 ...

  4. 孙鑫mfc学习笔记第十四课

    第十四课 网络的相关知识,网络程序的编写,Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过bind与驱动程序建立关系.此后,应用程序送给Socket的数据,由Sock ...

  5. 第四课.LinuxShell编程

    第四课目录 什么是Shell Shell编程 创建脚本 注释 Shell变量 基本运算 字符串,数组,分支循环,函数 应用实例 猜数字 获取CPU使用情况 探测本地网络 什么是Shell 有人说Lin ...

  6. 第四课:算法效率的度量和存储空间需求

    第四课 本课主题: 算法效率的度量和存储空间需求 教学目的: 掌握算法的渐近时间复杂度和空间复杂度的意义与作用 教学重点: 渐近时间复杂度的意义与作用及计算方法 教学难点: 渐近时间复杂度的意义 授课 ...

  7. NeHe OpenGL第二十四课:扩展

    NeHe OpenGL第二十四课:扩展 扩展,剪裁和TGA图像文件的加载: 在这一课里,你将学会如何读取你显卡支持的OpenGL的扩展,并在你指定的剪裁区域把它显示出来.   这个教程有一些难度,但它 ...

  8. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  9. Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”

    Coursera公开课笔记: 斯坦福大学机器学习第四课"多变量线性回归(Linear Regression with Multiple Variables)" 斯坦福大学机器学习第 ...

最新文章

  1. 20135202闫佳歆-第二章家庭作业-2.69
  2. 域控 正在应用计算机设置,域控制器下发的用户组策略在ou内的用户上没有应用...
  3. java的add方法的使用_Java HashSet add()方法与示例
  4. python3.7.1中IDLE突然打不开;spyder3打不开解决方案
  5. confluence启动不起来_“一键启动”只能点火?还有这5个“隐藏”功能,你都知道吗?...
  6. Spring Cloud+Spring Boot高频面试题解析
  7. PM_我们是怎么做Code Review的
  8. MSDN精选:Lambda 表达式(C# 编程指南)
  9. MATLAB的最速下降法实现
  10. php开源代码推荐,非常好用的源代码网站推荐,用这些开源代码就够了
  11. linux mtd手动烧写固件,路由器固件的几种烧写方式
  12. SPSS进行问卷量表信度检验【SPSS 082期】
  13. 数独基本规则_数独基本规则(数独游戏规则和技巧)
  14. python代码格式化工具下载_python 代码格式化工具:autopep8
  15. Windows进行磁盘碎片化整理
  16. SDNU QLU 2022.10.15 新生赛
  17. numpy 矩阵求和小技巧
  18. 阿里巴巴资深DBA的职业生涯总结
  19. 电脑显示U盘,但是读取不了
  20. ChatGPT版必应疑似「发疯」?微软紧急限制回答数目

热门文章

  1. canvas绘制星空底图
  2. 近50年前500部精品电影合集
  3. 获取当天或某天的开盘价
  4. 【Android学习日记】
  5. 2017 7 12 测试
  6. 【编程生活】自动化数据均分助手
  7. C# AD域账号登录验证,获取域用户信息
  8. 槛外人观察 :语义和语用
  9. 一张图看懂苹果MacBook所有屏幕分辨率
  10. GA遗传算法及相关代码