• STM32 HAL SPI读取MPU6500的设备ID异常


    1、问题背景

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

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

    硬件连接如下:

    /**SPI1 GPIO Configuration   
        PA15     ------> SPI1_NSS
        PB3     ------> SPI1_SCK
        PB4     ------> SPI1_MISO
        PB5     ------> 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访问正常。

     

  • 相关阅读:
    python 抓取网页
    Vim XDebug调试PHP php远程调试
    10 条 nmap 技巧
    Linux修改文件及文件夹权限
    mysql 常用命令 汇总
    VS2010打开过多的IntelliTrace.exe进程导致虚拟内存不足的解决办法
    黄聪:MYSQL远程连接失败:ERROR 1130: mysql 1130连接错误的有效解決方法
    黄聪:WordPress搬家更换域名教程
    黄聪:使用 ALinq 实现 Linq to MySQL【转】
    黄聪:Filezilla 二进制上传设定
  • 原文地址:https://www.cnblogs.com/pingwen/p/11041151.html
Copyright © 2020-2023  润新知