OpenEdv-开源电子网

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

关于STM32读取6050数据的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-8-10
在线时间
0 小时
发表于 2015-8-10 14:01:03 | 显示全部楼层 |阅读模式
5金钱
{这是 主函数}

#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
#include "sys.h"
#include "Usart.h"
#include "MPU6050.h"
uint8_t DataBuffer[14];
int main(void)
{
uint8_t counter;
short value; //16位整型数据,与数据寄存器相符
delay_init(72);//系统SysTick初始化
Usart_Configuration();
I2C_Congiguration();
MPU6050_Init();
while (1)
{
//读取MPU6050数据,一次性读取14个字节
//3轴加速度+温度+3轴角速度 高低字节 共14字节
I2C_ReadBuffer(DataBuffer, 0x3b, 14);
for(counter=0;counter<7;counter++)
{
value=(DataBuffer[counter]<<8)+DataBuffer[counter+1]; //合成高低各八位数据
printf("%d ",value); //数据输出
}
USART1_Send_Enter();
delay_ms(1000); //延时1s
}
}

关于6050的函数:


#include "stm32f10x.h"
#include "MPU6050.h"
#include "delay.h"
void I2C_Congiguration(void)
{

  GPIO_InitTypeDef  GPIO_InitStructure; 
  I2C_InitTypeDef  I2C_InitStructure; 

/* 使能与 I2C2 有关的时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
 
   
   
   

  /* PB10-I2C2_SCL、PB11-I2C2_SDA*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;       // 开漏输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* I2C 配置 */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_MPU6050;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  
  /* 使能 I2C2 */
  I2C_Cmd(I2C2, ENABLE);

  /* I2C2 初始化 */
  I2C_Init(I2C2, &I2C_InitStructure);

/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C2, ENABLE);    


}


void MPU6050_Init(void)//MPU6050初始化
{
delay_ms(100);
I2C_WriteByte(0x00,0x6B);
delay_ms(10);
I2C_WriteByte(0x00,0x19);
delay_ms(10);
I2C_WriteByte(0x03,0x1A);
delay_ms(10);
  I2C_WriteByte(0x08,0x1B);
delay_ms(10);
  I2C_WriteByte(0x09,0x1C);
delay_ms(1000);


}

void I2C_WriteByte(uint8_t Write_Data, uint8_t REG_Address)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
  /* Send STRAT condition */
  I2C_GenerateSTART(I2C2, ENABLE);

  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));  

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(I2C2, I2C1_MPU6050, I2C_Direction_Transmitter);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(I2C2, REG_Address);
  
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  /* Send the byte to be written */
  I2C_SendData(I2C2, Write_Data); 
   
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  /* Send STOP condition */
  I2C_GenerateSTOP(I2C2, ENABLE);
I2C_WaitEepromStandbyState();

}

uint8_t I2C_ReadByte(uint8_t REG_Address)
{
uint8_t data_byte;
  //*((u8 *)0x4001080c) |=0x80; 
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
    
    
  /* Send START condition */
  I2C_GenerateSTART(I2C2, ENABLE);
  //*((u8 *)0x4001080c) &=~0x80;
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(I2C2, I2C1_MPU6050, I2C_Direction_Transmitter);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  
  /* Clear EV6 by setting again the PE bit */
  I2C_Cmd(I2C2, ENABLE);

  /* Send the EEPROM's internal address to write to */
  I2C_SendData(I2C2, REG_Address);  

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  /* Send STRAT condition a second time */  
  I2C_GenerateSTART(I2C2, ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
  
  /* Send EEPROM address for read */
  I2C_Send7bitAddress(I2C2, I2C1_MPU6050, I2C_Direction_Receiver);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  
  /* While there is data to be read */
       /* Disable Acknowledgement */
      I2C_AcknowledgeConfig(I2C2, DISABLE);
      
      /* Send STOP Condition */
      I2C_GenerateSTOP(I2C2, ENABLE);

    /* Test on EV7 and clear it */
    if(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))       
      /* Read a byte from the EEPROM */
      data_byte = I2C_ReceiveData(I2C2);


  /* Enable Acknowledgement to be ready for another reception */
  I2C_AcknowledgeConfig(I2C2, ENABLE);
//I2C_EE_WaitEepromStandbyState();
return data_byte;
}

void I2C_ReadBuffer(uint8_t* Data_Buffer, uint8_t REG_Address, uint8_t Num_Byte)
{  
  //*((u8 *)0x4001080c) |=0x80; 
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
    
    
  /* Send START condition */
  I2C_GenerateSTART(I2C2, ENABLE);
  //*((u8 *)0x4001080c) &=~0x80;
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(I2C2, I2C1_MPU6050, I2C_Direction_Transmitter);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  
  /* Clear EV6 by setting again the PE bit */
  I2C_Cmd(I2C2, ENABLE);

  /* Send the EEPROM's internal address to write to */
  I2C_SendData(I2C2, REG_Address);  

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  /* Send STRAT condition a second time */  
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
  
  /* Send EEPROM address for read */
  I2C_Send7bitAddress(I2C2, I2C1_MPU6050, I2C_Direction_Receiver);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  
  /* While there is data to be read */
  while(Num_Byte)  
  {
    if(Num_Byte == 1)
    {
      /* Disable Acknowledgement */
      I2C_AcknowledgeConfig(I2C2, DISABLE);
      
      /* Send STOP Condition */
      I2C_GenerateSTOP(I2C2, ENABLE);
    }

    /* Test on EV7 and clear it */
    if(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))  
    {      
      /* Read a byte from the EEPROM */
      *Data_Buffer = I2C_ReceiveData(I2C2);

      /* Point to the next location where the byte read will be saved */
      Data_Buffer++; 
      
      /* Decrement the read bytes counter */
      Num_Byte--;        
    }   
  }

  /* Enable Acknowledgement to be ready for another reception */
  I2C_AcknowledgeConfig(I2C2, ENABLE);
//I2C_EE_WaitEepromStandbyState();
}







void I2C_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    /* Send START condition */
    I2C_GenerateSTART(I2C2, ENABLE);
    /* Read I2C1 SR1 register */
    SR1_Tmp = I2C_ReadRegister(I2C2, I2C_Register_SR1);
    /* Send EEPROM address for write */
    I2C_Send7bitAddress(I2C2, I2C1_MPU6050, I2C_Direction_Transmitter);
  }while(!(I2C_ReadRegister(I2C2, I2C_Register_SR1) & 0x0002));
  
  /* Clear AF flag */
  I2C_ClearFlag(I2C2, I2C_FLAG_AF);
    /* STOP condition */    
    I2C_GenerateSTOP(I2C2, ENABLE); // Added by Najoua 27/08/2008
}
     




配置串口的输出






#include "stm32f10x.h"
#include <stdio.h>
#include "Usart.h"
void Usart_Configuration(void) //配置Usart1 Tx->A9 Rx->A10
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO库函数结构体
USART_InitTypeDef USART_InitStructure;//USART库函数结构体
USART_ClockInitTypeDef USART_ClockInitStructure;
//使能串口1,GPIOA,AFIO总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);

/* Configure USART1 Tx (PA9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//PA9时钟速度50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
USART_InitStructure.USART_BaudRate =115200; //波特率115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶使能
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制失能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送、接收使能

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;//空闲时钟为低电平
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;//时钟第二个边沿进行数据捕获
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;//最后一位数据的时钟脉冲不从SCLK输出

//使能串口1接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 

USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Init(USART1, &USART_InitStructure); //初始化结构体
USART_Cmd(USART1, ENABLE); //使能串口1
}

//加入以下代码,支持printf函数,而不需要选择use MicroLIB  
/***************************START*********************/
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

int handle; 
/* Whatever you require here. If the only file you are using is */ 
/* standard output using printf() for debugging, no file handling */ 
/* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 

x = x; 

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
USART1->DR = (u8) ch;      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
return ch;
}
#endif 
/***************************END*********************/


void USART1_Putc(uint8_t data) //利用Usart1发送一个8位数据
{
    USART1->DR = (uint8_t)data; //要发送的字符赋给串口数据寄存器  
while((USART1->SR&0X40)==0); //等待发送完成  
}
void USART1_Send_Enter(void)//利用串口1发送一换行符
{
USART1_Putc(0x0d);
USART1_Putc(0x0a);
}
void USART1_Puts(uint8_t * buffer) //利用Usart1发送一个字符串
{
    while(*buffer)
    {
        USART1->DR= *buffer++;
while((USART1->SR&0X40)==0);//等待发送完成  
    }
}
/******************配置串口1中断服务函数************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //采用组别2  
 
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先式优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
NVIC_Init(&NVIC_InitStructure);//中断初始化
}

/******************串口1中断服务函数*******************************/
void USART1_IRQHandler(void)
{
USART_ClearITPendingBit(USART1,USART1_IRQn);//清除中断标志位
if(USART1->SR&(1<<5)) //如果是接收中断

// USART1_Putc(USART1->DR);  //发送串口1接收到的数据
GPIO_Write(GPIOC,USART1->DR);

}






但是在打开串口助手之后,总是接受不到数据,搞得头都大了,是在没招啊,大神麻烦帮看看,   哪里有问题啊,会出现这样的情况

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-10 22:28:17 | 显示全部楼层
都说了硬件IIC是个鸡肋,楼主还是这么情有独钟....

活该头大啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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