OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4934|回复: 5

STM32F1通过SPI读取MPU6000数据,一直测不出数据

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-1-17 17:01:25 | 显示全部楼层 |阅读模式
5金钱
最近做实验室一个项目,用STM32F103CBT6通过SPI读取MPU6000的六轴数据,本身是一个小白,因为这个项目才开始学习这方面的知识。在网上找了很多资料,基于能找到的资料、程序自己写了程序,但是始终测不出数据(偶尔出现测出的一直是255不变化)。调试了好多天还是不知道问题出在哪里。

求助各位大神,帮忙看看程序哪里有问题。
1)主程序main.c
#include "stm32f10x.h"
#include "spi.h"
#include "MPU6000.h"
#include "SysTick.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
extern uint32_t RunningTime;
long LastTime=0,NowTime;
//int16_t ax,ay,az;
//int16_t gx,gy,gz;
double ax,ay,az;
double gx,gy,gz;
int main(void)
{
SystemInit();
delay_init();
SPI1_Init();
MPU6000_Init();
SysTick_Init();
TimeStart();

while(1)
{
  ax=SPI_MPU_ReadReg(MPUREG_ACCEL_XOUT_H);
  ay=SPI_MPU_ReadReg(MPUREG_ACCEL_YOUT_H);
  az=SPI_MPU_ReadReg(MPUREG_ACCEL_ZOUT_H);
  gx=SPI_MPU_ReadReg(MPUREG_GYRO_XOUT_H);
  gy=SPI_MPU_ReadReg(MPUREG_GYRO_YOUT_H);
  gz=SPI_MPU_ReadReg(MPUREG_GYRO_ZOUT_H);
  
  NowTime=RunningTime;
  LastTime=NowTime;
  
  delay_ms(500);
}
}

2)SPI.c
#include "spi.h"
#include "MPU6000.h"
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

MPU_CSN_HIGH();
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);

//SPI1_ReadWriteByte(0xff);
}

void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler;
SPI_Cmd(SPI1,ENABLE);
}

u8 SPI1_ReadWriteByte(u8 TxData)
{  
u8 retry=0;      
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
  {
   retry++;
   if(retry>200)return 0;
  }     
SPI_I2S_SendData(SPI1, TxData);
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
  {
   retry++;
   if(retry>200)return 0;
  }            
return SPI_I2S_ReceiveData(SPI1);         
}

3)MPU6000.c
#include "MPU6000.h"
#include "spi.h"

double SPI_MPU_WriteReg(u8 reg,u8 dat)
{
  double status;
    MPU_CSN_LOW();   
status = SPI1_ReadWriteByte(reg);
    SPI1_ReadWriteByte(dat);
   MPU_CSN_HIGH();
    return(status);
}

double SPI_MPU_ReadReg(u8 reg)
{
  double reg_val;
//MPU_CE_LOW();
  MPU_CSN_LOW();   
SPI1_ReadWriteByte(reg);
reg_val = SPI1_ReadWriteByte(reg);           
MPU_CSN_HIGH();
return reg_val;
}

void MPU6000_Init(void)
{
SPI_MPU_WriteReg(MPUREG_PWR_MGMT_1,0X80);
SPI_MPU_WriteReg(MPUREG_PWR_MGMT_1,0x00);

SPI_MPU_WriteReg(MPUREG_INT_ENABLE,0X00);
SPI_MPU_WriteReg(MPUREG_USER_CTRL,0X00);
SPI_MPU_WriteReg(MPUREG_FIFO_EN,0X00);   
SPI_MPU_WriteReg(MPUREG_INT_PIN_CFG,0X80);
SPI_MPU_WriteReg(MPUREG_PWR_MGMT_1,0X01);
SPI_MPU_WriteReg(MPUREG_PWR_MGMT_2,0X00);
  
SPI_MPU_WriteReg(MPUREG_SMPLRT_DIV,0x07);
SPI_MPU_WriteReg(MPUREG_CONFIG,0x06);
SPI_MPU_WriteReg(MPUREG_GYRO_CONFIG,0xF8);
SPI_MPU_WriteReg(MPUREG_ACCEL_CONFIG,0xE0);
}

有关的宏定义为:
#define MPUREG_ACCEL_XOUT_H                             0x3B
#define MPUREG_ACCEL_XOUT_L                             0x3C
#define MPUREG_ACCEL_YOUT_H                             0x3D
#define MPUREG_ACCEL_YOUT_L                             0x3E
#define MPUREG_ACCEL_ZOUT_H                             0x3F
#define MPUREG_ACCEL_ZOUT_L                             0x40
#define MPUREG_TEMP_OUT_H                               0x41
#define MPUREG_TEMP_OUT_L                               0x42
#define MPUREG_GYRO_XOUT_H                              0x43
#define MPUREG_GYRO_XOUT_L                              0x44
#define MPUREG_GYRO_YOUT_H                              0x45
#define MPUREG_GYRO_YOUT_L                              0x46
#define MPUREG_GYRO_ZOUT_H                              0x47
#define MPUREG_GYRO_ZOUT_L                              0x48
#define MPUREG_USER_CTRL                                0x6A

#define MPU_CSN_HIGH()      GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define MPU_CSN_LOW()       GPIO_ResetBits(GPIOA, GPIO_Pin_4)  
#define MPU_CE_HIGH()     GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define MPU_CE_LOW()     GPIO_ResetBits(GPIOA,GPIO_Pin_4)   
#define MPU_Read_IRQ()  GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_5)

另附上整个文件,跪求大神解答,前前后后折腾了一周多了,我能找到的资料、能想到的问题都试过了。。。。。

STM32F103.jpg
MPU6000.jpg

MicroHelicopter.zip

6.77 MB, 下载次数: 123

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
 楼主| 发表于 2018-1-17 17:09:55 | 显示全部楼层
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-1-17 18:18:43 | 显示全部楼层
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
 楼主| 发表于 2018-1-18 09:17:17 | 显示全部楼层
求大佬帮忙看看程序,哪里有问题!!!
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
 楼主| 发表于 2018-1-18 09:29:13 | 显示全部楼层
Acuity 发表于 2018-1-17 18:18
看这个,保证会用spi,遇到spi器件不再怕
http://blog.csdn.net/qq_20553613/article/details/78998617
h ...

大佬能帮忙看看程序哪里有问题吗,我看了看你这个帖子,我觉得没什么出入啊
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2023-5-15
在线时间
23 小时
发表于 2023-5-15 16:33:41 | 显示全部楼层
我是新手我看手册寄存器最后以为是决定读写寄存器的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 09:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表