1、问题背景

近前,使用STM32F4 HAL库的SPI读取MPU6500出现异常。

现象:读取ID失败,返回0,以为硬件焊接问题,各种排查,最后为了示波器测试方便,把读取ID的函数放到While(1)里,反复的读然后抓波形,奇迹出现了,第一次读取出现错误,后面的都返回了正常的ID号。既然问题已经清楚,能够反复重现,那么排查起来也就容易多了,为了找到这个问题,花费了1天的时间,搞得都毛了,真是服了自己,之前想过反复读抓波形,但是不想改代码,每次都点击复位然后再抓波形,竟然完美的错过了后面的正常数据。

硬件连接如下:

/**SPI1 GPIO Configuration   PA15     ------> SPI1_NSSPB3     ------> SPI1_SCKPB4     ------> SPI1_MISOPB5     ------> SPI1_MOSI
*/ 

2、解决之路

根据手册MPU6500设备ID寄存器WHO AM I, 地址0x75,默认值0x70。 第1次读取的波形。MOSI输入地址:0x75正确,但是MISO设备没有返回数据。

第2次读取的波形。MOSI输入地址:0x75正确,MISO设备返回数据0x70,一切正常。

对比2个图,发现第一次读取CLK为低,并不是高电平,明显不符合datasheet的时序图规定。

查看初始化,发现所有IO都是NOPULL模式,改为GPIO_PULLUP模式后所有读取都正常。

 1     __HAL_RCC_GPIOB_CLK_ENABLE();
 2     /**SPI1 GPIO Configuration
 3     PB3     ------> SPI1_SCK
 4     PB4     ------> SPI1_MISO
 5     PB5     ------> SPI1_MOSI
 6     */
 7      GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
 8      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 9      GPIO_InitStruct.Pull = GPIO_NOPULL;
10     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
11     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
12     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

但是出现新的问题,MOSI平时都是低电平,一旦强行拉高,每次发送地址时候就会出现一个边低的脉冲,然后再次拉高。所以改为只把SCK设置为GPIO_PULLUP模式,其他的不变,波形正常。 至此,MPU6500通过SPI访问正常。

转载于:https://www.cnblogs.com/pingwen/p/11041151.html

STM32 HAL SPI读取MPU6500的设备ID异常相关推荐

  1. STM32软硬件SPI读取MAX31865 PT100温度支持shell功能

    PT100的温度读取硬件是利用TB的MAX31865现成模块,也可以自己做相应的PCB.原理图可以查看美信官方文档作为参考.传送门:https://www.maximintegrated.com/en ...

  2. stm32中spi可以随便接吗_STM32的SPI模式读写FLASH芯片全面讲解

    例程完整代码: SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,S ...

  3. RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决

    硬件:stm32f103rct6最小系统板, Rtthread V4.0.1 问题说明:参考RTthread官网SPI例程,刚开始报错无法查找到"spi10",读取到的全部是ff或 ...

  4. SPI中断方式读取MPU6500数据

    学习背景 MPU6500是MPU6050的升级版同时支持IIC和SPI通讯协议:IIC协议相对于SPI协议读取速率更低,并且在STM32的平台下硬件IIC存在更多地不确定性.因此选择采用SPI的方式读 ...

  5. STM32 HAL库 STM32CubeMX -- SPI

    文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...

  6. Linux内核机器ID,linux-如何强制内核重新读取/重新初始化PCI设备ID?

    我的机器(正在运行Linux内核3.2.38的计算机)在引导时具有错误的PCI设备的子系统ID(子设备和子供应商ID).如果我然后在系统仍处于启动状态(即热插拔)时物理地拔出PCI设备并重新插入,则它 ...

  7. STM32基于HAL工程读取DHT11数据

    STM32基于HAL工程读取DHT11数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!

  8. STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC

    STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC 本博客完整代码下载地址:https://download.csdn.net/download/qq15347150 ...

  9. STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏

    STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏 电子纸墨水屏具有断电界面不失和低反光度的护眼效果.QYEG0213RWS800是2.13寸黑白红三色墨水屏,分辨率为250*122. STM3 ...

  10. stm32 hal库 AS5600磁编码器IIC通信读取角度

    stm32 hal库 AS5600磁编码器IIC通信读取角度 下载

最新文章

  1. python基础之day1
  2. 乔布斯成功的七条秘诀
  3. Java 进阶—— super 和 this 的用法
  4. 最近写的一个qt应用软件
  5. 软考网络工程师笔记-综合知识2
  6. Oracle数据库imp
  7. 如何查看centos安装了哪些程序
  8. python revit二次开发_Revit怎么二次开发?Revit开发问题汇总
  9. 左连接只匹配一条数据_数据库左连接、右连接、内连接、全连接区别
  10. Atitit timer tech定时器技术总结目录1.1. 程序语言timer dbtimer ,os tiemr 11.2. Atitit timer定时框架api 11.3. 相关技术
  11. 计算身份证号码的校验码Python
  12. 蓝桥杯官网练习系统基础练习(八)
  13. java怎么打印课程表_自明排课系统如何打印?教你打印课表的方法
  14. 怒肝最新保姆级前端学习路线,速成贴心全面!
  15. DNS污染,配置DNS
  16. java修改文件只读_java修改文件为只读权限
  17. 查找WebSphere Application Server 管理控制台端口号
  18. Linux高性能服务器架构
  19. android studio最新教程pdf下载,android studio教程pdf下
  20. 树莓派 Raspberry Pi 3B+ 无线路由器, WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集

热门文章

  1. 「手把手带你学算法」本周小结!(动态规划系列七)
  2. 本周小结!(回溯算法系列三)
  3. leetcode [209]长度最小的子数组/Minimum Size Subarray Sum 【暴力解法】【滑动窗口解法】
  4. hdu 动态规划46题
  5. indesign教程,如何使用共享交互式文档?
  6. Mac电脑如何添加管理员账户?
  7. 苹果电脑如何正确断网?macOS操作系统断网方法
  8. Spring 切面 注解模式-练习Demo
  9. 深入浅出,解读阿里云云盾WAF防护功能
  10. 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 问题(转)