新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2021-1-10
- 在线时间
- 6 小时
|
本帖最后由 velonica 于 2021-4-16 10:43 编辑
昨天搞了一天,到晚上终于调好了。发出来防止后人踩坑
MPU6000和MPU6050的区别在于,MPU6000支持最高1MHz的SPI通信,另外两者都支持I2C通信,但速率较低(但我还是要说,我用SPI真是闲得蛋疼)
SPI读写配置:
模式3:高电平空闲,第二个边沿采样
SPI通信速率要小于等于1MHz
流程:
->片选
->写第一个字节:R/W+7位地址(write 0, read 1)
->读/写第二个字节:读/写8位数据
->取消片选
(一定要注意不是每个字节都片选,不是每个字节都片选!每个字节都片选可能导致能读不能写,我就是栽在这里了)
注意事项
- MPU6000支持的SPI最高速率是1MHz
- SPI模式是模式3(即时钟空闲极性为高,第二个边沿采样)
- 使用软件片选,没试过NSS_OUTPUT(NSS_OUTPUT是个坑,建议真正测过时序后使用,可能会有问题)【SPI通讯模式太复杂。 比如常见的SPI flash,需要一个CS拉低,然后连续几个字节,才能拉高CS。 而SPI DAC类的,需要每个字节后,都拉高CS来确认输出。 所以,当初设计SPI硬件NSS的时候,就没法实现主动CS拉低拉高了。——引自[某网友](http://www.armbbs.cn/forum.php?m ... id=86291&fromuid=58)的回答,不保证正确性,仅供参考】
- 检查是否按照上面的流程操作
- 时钟引脚的初始状态最好配置为高(即时钟空闲),以防万一
- 片选引脚我用的是开漏加外接上拉电阻,推挽应该问题也不大吧,没试过
- 剩下两个引脚就是推挽复用
如何测试SPI读
上电后什么都不做,延时1s后,直接读取0x75寄存器看它等不等于0x68,读取0x6B寄存器看它等不等于0x40。都等于则SPI读大概率没问题(见下)。
但还有一种情况需要注意:就是用SPI模式0(空闲极性低,第一个边沿采样),然后采用片选->第一个字节->取消片选->片选->第二个字节->取消片选.....这种流程。这种流程可能会导致读没问题,但写寄存器无效
如何测试SPI写
上电后,延时1s(看数据手册没理解错的话4ms就够了,但1s肯定没问题,测试没问题再缩小),然后写0x6B这个寄存器(上电后初始值是0x40,睡眠模式,不解除睡眠模式其他寄存器也没法写入,解除睡眠模式的方法就是给这个寄存器赋值),赋值为0x00,延时1s后读,看是不是等于0x00,如果还是等于0x40那么SPI写就有问题
用的是STM32F405RGT6,如果芯片频率较快的话,要注意一下时序图里面片选信号有效(低电平)后8ns时钟才可以开始下拉,最后一个时钟上拉后500ns,片选信号才可以设为无效(高电平)。我的板子没有用延时也通过了,我就没管了
|
|