OpenEdv-开源电子网

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

使用 硬件I2C DMA方式读取ADXL345

[复制链接]

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-9-9 13:29:59 | 显示全部楼层 |阅读模式
5金钱
求源程序

最佳答案

查看完整内容[请看2#楼]

回复【7楼】fanghuiopenedv: --------------------------------- 用起来了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-9-9 13:30:00 | 显示全部楼层
回复【7楼】fanghuiopenedv:
---------------------------------
用起来了
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-9-9 13:30:19 | 显示全部楼层
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-9-9 22:07:34 | 显示全部楼层
自己写吧。没有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-9-10 11:58:55 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥每帖必回啊!我贴出我的代码的,不知道为什么DMA读不出来
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-9-10 11:59:28 | 显示全部楼层
回复【4楼】cornrn:
---------------------------------
#include "myiic.h"
#include "adxl345.h"
#include "STM32F10X.h" 
#include "STM32F10X_DMA.h" 
#include "STM32F10X_I2C.h"

u8 I2C2_Buffer_Rx[6];  //RETURN       READ
u8 I2C2_Buffer_Tx;     //TRANSPORT    WRITE



//config the I2C using the DMA mode fpr send and receive
 
void I2C2_Config(void)
{
    I2C2_MasterConfig();
    I2C2_RcvDMAConfig();
    I2C2_SendDMAConfig();
    I2C2_GPIOInit();
}

 
//use DMA1 Channel5 for I2C receive:RRP read
 
void I2C2_RcvDMAConfig(void)
{
    DMA_InitTypeDef    DMA_InitStructure;
    
    /* Disable the selected DMAy Channelx */
    DMA1_Channel5->CCR &= 0xF0;
    /* Reset DMAy Channelx control register */
    DMA1_Channel5->CCR  = 0;  
    /* Reset DMAy Channelx remaining bytes register */
    DMA1_Channel5->CNDTR = 0;  
    /* Reset DMAy Channelx peripheral address register */
    DMA1_Channel5->CPAR  = 0;  
    /* Reset DMAy Channelx memory address register */
    DMA1_Channel5->CMAR = 0;
    /* Reset interrupt pending bits for DMA1 Channel5 */
    DMA1->IFCR |= 0x000F0000;

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)I2C2_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)I2C2_Buffer_Rx;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 6;        /* Just for initialization */
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);

}

//
//use DMA1 Channel4 for I2C send:RRP write
//
void I2C2_SendDMAConfig(void)
{
    DMA_InitTypeDef    DMA_InitStructure;
    
// Deinit the DMA1 Channel5 for I2C revieve
    DMA1_Channel4->CCR &= 0xF0;
    /* Reset DMAy Channelx control register */
    DMA1_Channel4->CCR  = 0;  
    /* Reset DMAy Channelx remaining bytes register */
    DMA1_Channel4->CNDTR = 0;  
    /* Reset DMAy Channelx peripheral address register */
    DMA1_Channel4->CPAR  = 0;  
    /* Reset DMAy Channelx memory address register */
    DMA1_Channel4->CMAR = 0;
    /* Reset interrupt pending bits for DMA1 Channel4 */
    DMA1->IFCR |= 0x0000F000;

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)I2C2_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&I2C2_Buffer_Tx;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = 1;      
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority =  DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);

}


/* @brief  Configures I2C2 */

void I2C2_MasterConfig(void)
{
    I2C_InitTypeDef  I2C_InitStructure;
    I2C_DeInit(I2C2);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x30;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 200000;
    I2C_Init(I2C2, &I2C_InitStructure);
    I2C_ITConfig(I2C2, I2C_IT_ERR|I2C_IT_EVT, DISABLE);
}

void I2C2_GPIOInit(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure; 
    /* Configure I2C2 pins: SCL and SDA */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

}

 

 
 




















/*
//??????IIC
void IIC_Init(void)
{      
GPIO_InitTypeDef GPIO_InitStructure;
//RCC->APB2ENR|=1<<4;//?????????èIO ORTB?±?? 
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);   //PE.5 ?????? 
 
IIC_SCL=1;
IIC_SDA=1;

}
//?ú?úIIC????????
void IIC_Start(void)
{
SDA_OUT();     //sda??????
IIC_SDA=1;      
IIC_SCL=1;
delay_us(4);
  IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
delay_us(4);
IIC_SCL=0;//??×?I2C×?????×?±?·????ò???????? 
}   
//?ú?úIIC????????
void IIC_Stop(void)
{
SDA_OUT();//sda??????
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  delay_us(4);
IIC_SCL=1; 
IIC_SDA=1;//·???I2C×????á??????
delay_us(4);    
}
//????????????????
//·???????1???????????§°?
//        0??????????????
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();      //SDA?è????????  
IIC_SDA=1;delay_us(1);    
IIC_SCL=1;delay_us(1);  
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//?±??????0     
return 0;  

//?ú?úACK????
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//???ú?úACK????     
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}        
//IIC·???????×???
//·??????ú????????
//1????????
//0????????   
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
SDA_OUT();      
    IIC_SCL=0;//?????±??????????????
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;    
delay_us(2);   //??TEA5767?????????±????±?????
IIC_SCL=1;
delay_us(2); 
IIC_SCL=0;
delay_us(2);
    }  
}      
//??1??×?????ack=1?±??·???ACK??ack=0??·???nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA?è????????
    for(i=0;i<8;i++ )
{
        IIC_SCL=0; 
        delay_us(2);
IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
delay_us(1); 
    }  
    if (!ack)
        IIC_NAck();//·???nACK
    else
        IIC_Ack(); //·???ACK   
    return receive;
}

 */
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-9-10 12:01:34 | 显示全部楼层
下面注释的部分是原子开发板原来程序,源程序是模拟I2C不能实现DMA。请大神指点怎么I2C DMA配置
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2014-9-20 14:54:42 | 显示全部楼层
顶,我也想用DMA来操作硬件IIC
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
发表于 2016-1-21 11:45:09 | 显示全部楼层
cornrn 发表于 2014-9-10 12:01
下面注释的部分是原子开发板原来程序,源程序是模拟I2C不能实现DMA。请大神指点怎么I2C&nbsp;DMA配置

LZ实现功能了吗?我刚开玩,也想学习下,晒下程序呀
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-1-21 15:24:45 | 显示全部楼层
本帖最后由 cornrn 于 2016-1-21 15:27 编辑
DHG 发表于 2016-1-21 11:45
LZ实现功能了吗?我刚开玩,也想学习下,晒下程序呀

@fanghuiopenedv @DHG
见楼下程序 硬件IIC+DMA方式读取MPU6050

i2c_dma.c文件↓↓↓↓↓↓↓
/*
****************************************Copyright (c)**************************************************
**                                xxxxxxxxxxxxxxxxxxxxxxxxx
**                                   cornrn                                       
**                                  QQ858860583
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
*/
#include <i2c_dma.h>


typedef enum {FALSE = 0, TRUE = !FALSE} bool;


#define Transmitter             0x00
#define Receiver                0x01

static __IO uint8_t MasterDirection = Transmitter;
static uint16_t         SlaveDevAddr;                                                /*        从设备地址缓存                                */
static uint8_t         SlaveDevRegAddr;                                /*        从设备寄存器地址缓存        */
static bool check_begin = FALSE;
static bool OffsetDone = FALSE;
static __IO   I2C_STATE i2c_state;



/*******************************************************************************************************
** 函数名称: I2C_MasterCommunication
** 功能描述: I2C主机通信,通过DMA方式,使用 I2C2,非重入
                                                        direction: 通信描述
                                                                                                I2C_Direction_Transmitter 主机发送
                                                                                                I2C_Direction_Receiver主
机接收
                                                        slave_addr: 器件地址
                                                        offset:偏移地址
                                                        buffer:数据缓存
                                                        length:数据字节数,必须大于1
** 返    回: 无
********************************************************************************************************/
void I2C_MasterCommunication(uint8_t direction,uint16_t slave_addr,uint8_t offset,uint8_t* buffer,uint32_t length)
{
  DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&I2C2->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buffer;
  DMA_InitStructure.DMA_BufferSize = length;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  if(direction == I2C_Direction_Transmitter)
  {
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
                DMA_DeInit(DMA1_Channel4);
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);
                DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
                MasterDirection = Transmitter;
  }  
        else if(direction == I2C_Direction_Receiver)
  {
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
    DMA_DeInit(DMA1_Channel5);
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);
                DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
                MasterDirection = Receiver;
  }
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

  SlaveDevAddr = slave_addr;
  SlaveDevRegAddr = offset;
  OffsetDone = FALSE;
  i2c_state = 1;   
  I2C_AcknowledgeConfig(I2C2,ENABLE);
  I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_ERR ,ENABLE);
  if(I2C2->CR1 & 0x200)I2C2->CR1 &= 0xFDFF;
  I2C_GenerateSTART(I2C2,ENABLE);
        while(i2c_state != FinishFlag);        
}

/*******************************************************************************************************
** 函数名称: I2C2_EV_IRQHandler
** 功能描述: I2C事件中断处理函数
** 返    回: 无
********************************************************************************************************/
void I2C2_EV_IRQHandler(void)
{         
  switch (I2C_GetLastEvent(I2C2))
  {
                case I2C_EVENT_MASTER_MODE_SELECT:        /* EV5 */
                        if(OffsetDone){
                                I2C_Send7bitAddress(I2C2,SlaveDevAddr,I2C_Direction_Receiver);
                                OffsetDone = FALSE;
                        }                                       
                        else{
                                I2C_Send7bitAddress(I2C2,SlaveDevAddr,I2C_Direction_Transmitter);
                        }
                        I2C_ITConfig(I2C2,I2C_IT_BUF ,ENABLE);
                        break;              

                case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:  /* EV6 */
                        I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF,DISABLE);
                        I2C_DMALastTransferCmd(I2C2,ENABLE);
                        I2C_DMACmd(I2C2,ENABLE);
                        DMA_Cmd(DMA1_Channel5,ENABLE);            
                        break;   

                case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: /* EV6 */
                        I2C_SendData(I2C2, SlaveDevRegAddr);
                        OffsetDone = TRUE;   
                        break;                                                
                case I2C_EVENT_MASTER_BYTE_TRANSMITTING:       /* EV8 */
                        if (MasterDirection == Receiver)
                        {
                                I2C_ITConfig(I2C2, I2C_IT_BUF ,DISABLE);
                                while ((I2C2->CR1 & 0x200) == 0x200);
                                I2C_GenerateSTART(I2C2, ENABLE);
                        }
                        else
                        {
                                I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF,DISABLE);
                                I2C_DMACmd(I2C2,ENABLE);
                                DMA_Cmd(DMA1_Channel4,ENABLE);        
                        }
                        break;
  }
}

/*******************************************************************************************************
** 函数名称: DMA1_Channel4_IRQHandler
** 功能描述: DMA1 通道4中断服务入口
** 返    回: 无
********************************************************************************************************/
void DMA1_Channel4_IRQHandler(void)
{
  if (DMA_GetFlagStatus(DMA1_FLAG_TC4))
  {
                I2C_DMACmd(I2C2,DISABLE);
                DMA_Cmd(DMA1_Channel4,DISABLE);
                I2C_DMALastTransferCmd(I2C2,DISABLE);
                I2C_GenerateSTOP(I2C2,ENABLE);
                i2c_state = FinishFlag;
                DMA_ClearFlag(DMA1_FLAG_TC4);
  }
}
/*******************************************************************************************************
** 函数名称: DMA1_Channel5_IRQHandler
** 功能描述: DMA1 通道5中断服务入口
** 返    回: 无
********************************************************************************************************/
void DMA1_Channel5_IRQHandler(void)
{        
  if(DMA_GetFlagStatus(DMA1_FLAG_TC5))
  {
                I2C_DMACmd(I2C2,DISABLE);
                I2C_DMALastTransferCmd(I2C2,DISABLE);
                I2C_GenerateSTOP(I2C2,ENABLE);
                i2c_state = FinishFlag;
    DMA_ClearFlag(DMA1_FLAG_TC5);
  }
}

/*******************************************************************************************************
** 函数名称: I2C2_ER_IRQHandler
** 功能描述: I2C错误中断服务
** 返    回: 无
********************************************************************************************************/
void I2C2_ER_IRQHandler(void)
{        
        if(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF))
        {
                if(check_begin)I2C_GenerateSTART(I2C2,ENABLE);
                else if(I2C2->SR2 &0x01)
                {
                        I2C_GenerateSTOP(I2C2, ENABLE);
                        i2c_state = ExitFlag;
                }
                I2C_ClearFlag(I2C2, I2C_FLAG_AF);
        }

        if(I2C_GetFlagStatus(I2C2,I2C_FLAG_BERR))
        {
                if(I2C2->SR2 &0x01)
                {
                        I2C_GenerateSTOP(I2C2,ENABLE);
                        i2c_state = ExitFlag;
                }
                I2C_ClearFlag(I2C2, I2C_FLAG_BERR);
        }
}

/****************************** (C) COPYRIGHT xxxx *****END OF FILE******************************/

i2c_dma.h文件↓
#ifndef __I2C_DMA_H
#define __I2C_DMA_H

/* Includes ------------------------------------------------------------------*/
#include <stm32l1xx.h>
#include <stdio.h>
/* Exported types ------------------------------------------------------------*/


typedef enum
{
  FinishFlag                  = 0,  
  BeginFlag                         = (1<<1),
  ProcessFlag                 = (1<<2),
  ExitFlag                                 = (1<<3),
        OffestDoneFlag        = (1<<4),
        DirectionFlag                = (1<<5),
}I2C_STATE;

void  I2C_MasterCommunication(uint8_t direction,uint16_t slave_addr,uint8_t offset,uint8_t* buffer,uint32_t length);








彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-1-21 15:29:46 | 显示全部楼层
mpu6050.c↓



/******************************Copyright (c)***********************************
*                Jiangsu xxxx Electronic Technology Co., Ltd.
*                      Research & Development Department
*
*                                                                                                        www.smarthealth-tech.com
*
-------------------------------------------------------------------------------
* @file    mpu6050.c
* @author  Gu Dongdong
* @date    2015-11-15  
*******************************************************************************/

#include "mpu6050.h"


/********************************************************************************************************
** 函数名称: MPU6050Init
** 功能描述: MPU6050初始化
** 输   入: 无      
** 输   出: 无
** 返    回: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
void MPU6050Init(void)
{
        static CPU_INT08U tmp[2];
        tmp[0] = 8;tmp[1] = 199;
        I2C_MasterCommunication(I2C_Direction_Transmitter,MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1,tmp,2);
        tmp[0] = 0;tmp[1] = 0;
        I2C_MasterCommunication(I2C_Direction_Transmitter,MPU6050_DEFAULT_ADDRESS, MPU6050_RA_SMPLRT_DIV,tmp,2);
}

/********************************************************************************************************
** 函数名称: MPU_Get_ACC_Raw
** 功能描述: 获取ACC原始值
** 输   入: CPU_INT16S *raw      
** 输   出: raw
** 返    回: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
bool MPU_Get_ACC_Raw(CPU_INT16S *raw)
{
  CPU_INT08U tmp[6];          
        I2C_MasterCommunication(I2C_Direction_Receiver,MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H,tmp,6);

  raw[0] = (tmp[0] << 8) | tmp[1];
        raw[1] = (tmp[2] << 8) | tmp[3];
        raw[2] = (tmp[4] << 8) | tmp[5];
  return TRUE;
}

/********************************************************************************************************
** 函数名称: MPU_Get_GYR_Raw
** 功能描述: 获取GYR原始值
** 输   入: CPU_INT16S *raw      
** 输   出: raw
** 返    回: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
bool MPU_Get_GYR_Raw(CPU_INT16S *raw)
{
  CPU_INT08U tmp[6];

        I2C_MasterCommunication(I2C_Direction_Receiver,MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_XOUT_H,tmp,6);
  raw[0] = (tmp[0] << 8) | tmp[1];
        raw[1] = (tmp[2] << 8) | tmp[3];
        raw[2] = (tmp[4] << 8) | tmp[5];

  return TRUE;
}
/********************************************************************************************************
** 函数名称: MPU_Get_TEMP_Raw
** 功能描述: 获取TEMP原始值
** 输   入: CPU_INT16S *raw   
** 输   出: raw
** 返    回: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
bool MPU_Get_TEMP_Raw(CPU_INT16S *raw)
{
  CPU_INT08U tmp[2];

        I2C_MasterCommunication(I2C_Direction_Receiver,MPU6050_DEFAULT_ADDRESS, MPU6050_RA_TEMP_OUT_H,tmp,2);
  raw[0] = (tmp[0] << 8) | tmp[1];
  return TRUE;
}

MPU6050.H↓↓↓↓↓↓
/****************************** (C) COPYRIGHT SmartHealth *****END OF FILE********************************/


/******************************Copyright (c)***********************************
*                Jiangsu Zhihai Electronic Technology Co., Ltd.
*                      Research & Development Department
*
*                                                                                                        www.smarthealth-tech.com
*
-------------------------------------------------------------------------------
* @file    mpu6050.h
* @author  Gu Dongdong
* @date    2015-11-15  
*******************************************************************************/


#ifndef _MPU6050_H_
#define _MPU6050_H_


#include <os.h>
#include <i2c_dma.h>

void MPU6050Init(void);

#define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
#define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
#define MPU6050_DEFAULT_ADDRESS     (MPU6050_ADDRESS_AD0_LOW<<1)

#define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
#define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
#define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
#define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
#define MPU6050_RA_XA_OFFS_L_TC     0x07
#define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
#define MPU6050_RA_YA_OFFS_L_TC     0x09
#define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
#define MPU6050_RA_ZA_OFFS_L_TC     0x0B
#define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
#define MPU6050_RA_XG_OFFS_USRL     0x14
#define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
#define MPU6050_RA_YG_OFFS_USRL     0x16
#define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
#define MPU6050_RA_ZG_OFFS_USRL     0x18
#define MPU6050_RA_SMPLRT_DIV       0x19
#define MPU6050_RA_CONFIG           0x1A
#define MPU6050_RA_GYRO_CONFIG      0x1B
#define MPU6050_RA_ACCEL_CONFIG     0x1C
#define MPU6050_RA_FF_THR           0x1D
#define MPU6050_RA_FF_DUR           0x1E
#define MPU6050_RA_MOT_THR          0x1F
#define MPU6050_RA_MOT_DUR          0x20
#define MPU6050_RA_ZRMOT_THR        0x21
#define MPU6050_RA_ZRMOT_DUR        0x22
#define MPU6050_RA_FIFO_EN          0x23
#define MPU6050_RA_I2C_MST_CTRL     0x24
#define MPU6050_RA_I2C_SLV0_ADDR    0x25
#define MPU6050_RA_I2C_SLV0_REG     0x26
#define MPU6050_RA_I2C_SLV0_CTRL    0x27
#define MPU6050_RA_I2C_SLV1_ADDR    0x28
#define MPU6050_RA_I2C_SLV1_REG     0x29
#define MPU6050_RA_I2C_SLV1_CTRL    0x2A
#define MPU6050_RA_I2C_SLV2_ADDR    0x2B
#define MPU6050_RA_I2C_SLV2_REG     0x2C
#define MPU6050_RA_I2C_SLV2_CTRL    0x2D
#define MPU6050_RA_I2C_SLV3_ADDR    0x2E
#define MPU6050_RA_I2C_SLV3_REG     0x2F
#define MPU6050_RA_I2C_SLV3_CTRL    0x30
#define MPU6050_RA_I2C_SLV4_ADDR    0x31
#define MPU6050_RA_I2C_SLV4_REG     0x32
#define MPU6050_RA_I2C_SLV4_DO      0x33
#define MPU6050_RA_I2C_SLV4_CTRL    0x34
#define MPU6050_RA_I2C_SLV4_DI      0x35
#define MPU6050_RA_I2C_MST_STATUS   0x36
#define MPU6050_RA_INT_PIN_CFG      0x37
#define MPU6050_RA_INT_ENABLE       0x38
#define MPU6050_RA_DMP_INT_STATUS   0x39
#define MPU6050_RA_INT_STATUS       0x3A
#define MPU6050_RA_ACCEL_XOUT_H     0x3B
#define MPU6050_RA_ACCEL_XOUT_L     0x3C
#define MPU6050_RA_ACCEL_YOUT_H     0x3D
#define MPU6050_RA_ACCEL_YOUT_L     0x3E
#define MPU6050_RA_ACCEL_ZOUT_H     0x3F
#define MPU6050_RA_ACCEL_ZOUT_L     0x40
#define MPU6050_RA_TEMP_OUT_H       0x41
#define MPU6050_RA_TEMP_OUT_L       0x42
#define MPU6050_RA_GYRO_XOUT_H      0x43
#define MPU6050_RA_GYRO_XOUT_L      0x44
#define MPU6050_RA_GYRO_YOUT_H      0x45
#define MPU6050_RA_GYRO_YOUT_L      0x46
#define MPU6050_RA_GYRO_ZOUT_H      0x47
#define MPU6050_RA_GYRO_ZOUT_L      0x48
#define MPU6050_RA_EXT_SENS_DATA_00 0x49
#define MPU6050_RA_EXT_SENS_DATA_01 0x4A
#define MPU6050_RA_EXT_SENS_DATA_02 0x4B
#define MPU6050_RA_EXT_SENS_DATA_03 0x4C
#define MPU6050_RA_EXT_SENS_DATA_04 0x4D
#define MPU6050_RA_EXT_SENS_DATA_05 0x4E
#define MPU6050_RA_EXT_SENS_DATA_06 0x4F
#define MPU6050_RA_EXT_SENS_DATA_07 0x50
#define MPU6050_RA_EXT_SENS_DATA_08 0x51
#define MPU6050_RA_EXT_SENS_DATA_09 0x52
#define MPU6050_RA_EXT_SENS_DATA_10 0x53
#define MPU6050_RA_EXT_SENS_DATA_11 0x54
#define MPU6050_RA_EXT_SENS_DATA_12 0x55
#define MPU6050_RA_EXT_SENS_DATA_13 0x56
#define MPU6050_RA_EXT_SENS_DATA_14 0x57
#define MPU6050_RA_EXT_SENS_DATA_15 0x58
#define MPU6050_RA_EXT_SENS_DATA_16 0x59
#define MPU6050_RA_EXT_SENS_DATA_17 0x5A
#define MPU6050_RA_EXT_SENS_DATA_18 0x5B
#define MPU6050_RA_EXT_SENS_DATA_19 0x5C
#define MPU6050_RA_EXT_SENS_DATA_20 0x5D
#define MPU6050_RA_EXT_SENS_DATA_21 0x5E
#define MPU6050_RA_EXT_SENS_DATA_22 0x5F
#define MPU6050_RA_EXT_SENS_DATA_23 0x60
#define MPU6050_RA_MOT_DETECT_STATUS    0x61
#define MPU6050_RA_I2C_SLV0_DO      0x63
#define MPU6050_RA_I2C_SLV1_DO      0x64
#define MPU6050_RA_I2C_SLV2_DO      0x65
#define MPU6050_RA_I2C_SLV3_DO      0x66
#define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
#define MPU6050_RA_SIGNAL_PATH_RESET    0x68
#define MPU6050_RA_MOT_DETECT_CTRL      0x69
#define MPU6050_RA_USER_CTRL        0x6A
#define MPU6050_RA_PWR_MGMT_1       0x6B
#define MPU6050_RA_PWR_MGMT_2       0x6C
#define MPU6050_RA_BANK_SEL         0x6D
#define MPU6050_RA_MEM_START_ADDR   0x6E
#define MPU6050_RA_MEM_R_W          0x6F
#define MPU6050_RA_DMP_CFG_1        0x70
#define MPU6050_RA_DMP_CFG_2        0x71
#define MPU6050_RA_FIFO_COUNTH      0x72
#define MPU6050_RA_FIFO_COUNTL      0x73
#define MPU6050_RA_FIFO_R_W         0x74
#define MPU6050_RA_WHO_AM_I         0x75

#define MPU6050_TC_PWR_MODE_BIT     7
#define MPU6050_TC_OFFSET_BIT       6
#define MPU6050_TC_OFFSET_LENGTH    6
#define MPU6050_TC_OTP_BNK_VLD_BIT  0

#define MPU6050_VDDIO_LEVEL_VLOGIC  0
#define MPU6050_VDDIO_LEVEL_VDD     1

#define MPU6050_CFG_EXT_SYNC_SET_BIT    5
#define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
#define MPU6050_CFG_DLPF_CFG_BIT    2
#define MPU6050_CFG_DLPF_CFG_LENGTH 3

#define MPU6050_EXT_SYNC_DISABLED       0x0
#define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
#define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
#define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
#define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
#define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
#define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7

#define MPU6050_DLPF_BW_256         0x00
#define MPU6050_DLPF_BW_188         0x01
#define MPU6050_DLPF_BW_98          0x02
#define MPU6050_DLPF_BW_42          0x03
#define MPU6050_DLPF_BW_20          0x04
#define MPU6050_DLPF_BW_10          0x05
#define MPU6050_DLPF_BW_5           0x06

#define MPU6050_GCONFIG_FS_SEL_BIT      4
#define MPU6050_GCONFIG_FS_SEL_LENGTH   2

#define MPU6050_GYRO_FS_250         0x00
#define MPU6050_GYRO_FS_500         0x01
#define MPU6050_GYRO_FS_1000        0x02
#define MPU6050_GYRO_FS_2000        0x03

#define MPU6050_ACONFIG_XA_ST_BIT           7
#define MPU6050_ACONFIG_YA_ST_BIT           6
#define MPU6050_ACONFIG_ZA_ST_BIT           5
#define MPU6050_ACONFIG_AFS_SEL_BIT         4
#define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
#define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3

#define MPU6050_ACCEL_FS_2          0x00
#define MPU6050_ACCEL_FS_4          0x01
#define MPU6050_ACCEL_FS_8          0x02
#define MPU6050_ACCEL_FS_16         0x03

#define MPU6050_DHPF_RESET          0x00
#define MPU6050_DHPF_5              0x01
#define MPU6050_DHPF_2P5            0x02
#define MPU6050_DHPF_1P25           0x03
#define MPU6050_DHPF_0P63           0x04
#define MPU6050_DHPF_HOLD           0x07

#define MPU6050_TEMP_FIFO_EN_BIT    7
#define MPU6050_XG_FIFO_EN_BIT      6
#define MPU6050_YG_FIFO_EN_BIT      5
#define MPU6050_ZG_FIFO_EN_BIT      4
#define MPU6050_ACCEL_FIFO_EN_BIT   3
#define MPU6050_SLV2_FIFO_EN_BIT    2
#define MPU6050_SLV1_FIFO_EN_BIT    1
#define MPU6050_SLV0_FIFO_EN_BIT    0

#define MPU6050_MULT_MST_EN_BIT     7
#define MPU6050_WAIT_FOR_ES_BIT     6
#define MPU6050_SLV_3_FIFO_EN_BIT   5
#define MPU6050_I2C_MST_P_NSR_BIT   4
#define MPU6050_I2C_MST_CLK_BIT     3
#define MPU6050_I2C_MST_CLK_LENGTH  4

#define MPU6050_CLOCK_DIV_348       0x0
#define MPU6050_CLOCK_DIV_333       0x1
#define MPU6050_CLOCK_DIV_320       0x2
#define MPU6050_CLOCK_DIV_308       0x3
#define MPU6050_CLOCK_DIV_296       0x4
#define MPU6050_CLOCK_DIV_286       0x5
#define MPU6050_CLOCK_DIV_276       0x6
#define MPU6050_CLOCK_DIV_267       0x7
#define MPU6050_CLOCK_DIV_258       0x8
#define MPU6050_CLOCK_DIV_500       0x9
#define MPU6050_CLOCK_DIV_471       0xA
#define MPU6050_CLOCK_DIV_444       0xB
#define MPU6050_CLOCK_DIV_421       0xC
#define MPU6050_CLOCK_DIV_400       0xD
#define MPU6050_CLOCK_DIV_381       0xE
#define MPU6050_CLOCK_DIV_364       0xF

#define MPU6050_I2C_SLV_RW_BIT      7
#define MPU6050_I2C_SLV_ADDR_BIT    6
#define MPU6050_I2C_SLV_ADDR_LENGTH 7
#define MPU6050_I2C_SLV_EN_BIT      7
#define MPU6050_I2C_SLV_BYTE_SW_BIT 6
#define MPU6050_I2C_SLV_REG_DIS_BIT 5
#define MPU6050_I2C_SLV_GRP_BIT     4
#define MPU6050_I2C_SLV_LEN_BIT     3
#define MPU6050_I2C_SLV_LEN_LENGTH  4

#define MPU6050_I2C_SLV4_RW_BIT         7
#define MPU6050_I2C_SLV4_ADDR_BIT       6
#define MPU6050_I2C_SLV4_ADDR_LENGTH    7
#define MPU6050_I2C_SLV4_EN_BIT         7
#define MPU6050_I2C_SLV4_INT_EN_BIT     6
#define MPU6050_I2C_SLV4_REG_DIS_BIT    5
#define MPU6050_I2C_SLV4_MST_DLY_BIT    4
#define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5

#define MPU6050_MST_PASS_THROUGH_BIT    7
#define MPU6050_MST_I2C_SLV4_DONE_BIT   6
#define MPU6050_MST_I2C_LOST_ARB_BIT    5
#define MPU6050_MST_I2C_SLV4_NACK_BIT   4
#define MPU6050_MST_I2C_SLV3_NACK_BIT   3
#define MPU6050_MST_I2C_SLV2_NACK_BIT   2
#define MPU6050_MST_I2C_SLV1_NACK_BIT   1
#define MPU6050_MST_I2C_SLV0_NACK_BIT   0

#define MPU6050_INTCFG_INT_LEVEL_BIT        7
#define MPU6050_INTCFG_INT_OPEN_BIT         6
#define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
#define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
#define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
#define MPU6050_INTCFG_CLKOUT_EN_BIT        0

#define MPU6050_INTMODE_ACTIVEHIGH  0x00
#define MPU6050_INTMODE_ACTIVELOW   0x01

#define MPU6050_INTDRV_PUSHPULL     0x00
#define MPU6050_INTDRV_OPENDRAIN    0x01

#define MPU6050_INTLATCH_50USPULSE  0x00
#define MPU6050_INTLATCH_WAITCLEAR  0x01

#define MPU6050_INTCLEAR_STATUSREAD 0x00
#define MPU6050_INTCLEAR_ANYREAD    0x01

#define MPU6050_INTERRUPT_FF_BIT            7
#define MPU6050_INTERRUPT_MOT_BIT           6
#define MPU6050_INTERRUPT_ZMOT_BIT          5
#define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
#define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
#define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
#define MPU6050_INTERRUPT_DMP_INT_BIT       1
#define MPU6050_INTERRUPT_DATA_RDY_BIT      0

// TODO: Need to work on DMP related things
#define MPU6050_DMPINT_5_BIT            5
#define MPU6050_DMPINT_4_BIT            4
#define MPU6050_DMPINT_3_BIT            3
#define MPU6050_DMPINT_2_BIT            2
#define MPU6050_DMPINT_1_BIT            1
#define MPU6050_DMPINT_0_BIT            0

#define MPU6050_MOTION_MOT_XNEG_BIT     7
#define MPU6050_MOTION_MOT_XPOS_BIT     6
#define MPU6050_MOTION_MOT_YNEG_BIT     5
#define MPU6050_MOTION_MOT_YPOS_BIT     4
#define MPU6050_MOTION_MOT_ZNEG_BIT     3
#define MPU6050_MOTION_MOT_ZPOS_BIT     2
#define MPU6050_MOTION_MOT_ZRMOT_BIT    0

#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
#define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
#define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
#define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
#define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
#define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0

#define MPU6050_PATHRESET_GYRO_RESET_BIT    2
#define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
#define MPU6050_PATHRESET_TEMP_RESET_BIT    0

#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
#define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
#define MPU6050_DETECT_FF_COUNT_BIT             3
#define MPU6050_DETECT_FF_COUNT_LENGTH          2
#define MPU6050_DETECT_MOT_COUNT_BIT            1
#define MPU6050_DETECT_MOT_COUNT_LENGTH         2

#define MPU6050_DETECT_DECREMENT_RESET  0x0
#define MPU6050_DETECT_DECREMENT_1      0x1
#define MPU6050_DETECT_DECREMENT_2      0x2
#define MPU6050_DETECT_DECREMENT_4      0x3

#define MPU6050_USERCTRL_DMP_EN_BIT             7
#define MPU6050_USERCTRL_FIFO_EN_BIT            6
#define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
#define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
#define MPU6050_USERCTRL_DMP_RESET_BIT          3
#define MPU6050_USERCTRL_FIFO_RESET_BIT         2
#define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
#define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0

#define MPU6050_PWR1_DEVICE_RESET_BIT   7
#define MPU6050_PWR1_SLEEP_BIT          6
#define MPU6050_PWR1_CYCLE_BIT          5
#define MPU6050_PWR1_TEMP_DIS_BIT       3
#define MPU6050_PWR1_CLKSEL_BIT         2
#define MPU6050_PWR1_CLKSEL_LENGTH      3

#define MPU6050_CLOCK_INTERNAL          0x00
#define MPU6050_CLOCK_PLL_XGYRO         0x01
#define MPU6050_CLOCK_PLL_YGYRO         0x02
#define MPU6050_CLOCK_PLL_ZGYRO         0x03
#define MPU6050_CLOCK_PLL_EXT32K        0x04
#define MPU6050_CLOCK_PLL_EXT19M        0x05
#define MPU6050_CLOCK_KEEP_RESET        0x07

#define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
#define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
#define MPU6050_PWR2_STBY_XA_BIT            5
#define MPU6050_PWR2_STBY_YA_BIT            4
#define MPU6050_PWR2_STBY_ZA_BIT            3
#define MPU6050_PWR2_STBY_XG_BIT            2
#define MPU6050_PWR2_STBY_YG_BIT            1
#define MPU6050_PWR2_STBY_ZG_BIT            0

#define MPU6050_WAKE_FREQ_1P25      0x0
#define MPU6050_WAKE_FREQ_2P5       0x1
#define MPU6050_WAKE_FREQ_5         0x2
#define MPU6050_WAKE_FREQ_10        0x3

#define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
#define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
#define MPU6050_BANKSEL_MEM_SEL_BIT         4
#define MPU6050_BANKSEL_MEM_SEL_LENGTH      5

#define MPU6050_WHO_AM_I_BIT        6
#define MPU6050_WHO_AM_I_LENGTH     6

#define MPU6050_DMP_MEMORY_BANKS        8
#define MPU6050_DMP_MEMORY_BANK_SIZE    256
#define MPU6050_DMP_MEMORY_CHUNK_SIZE   16


typedef enum {FALSE = 0, TRUE = !FALSE} bool;

extern bool MPU_Get_ACC_Raw(CPU_INT16S *raw);
extern bool MPU_Get_GYR_Raw(CPU_INT16S *raw);

#endif /* __MPU6050_H */



/****************************** (C) COPYRIGHT SmartHealth *****END OF FILE********************************/



彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-1-21 15:30:33 | 显示全部楼层
正点原子 发表于 2014-9-9 22:07
自己写吧。没有。

原子哥我上传了,论坛第一个,加精吧(*^__^*) 嘻嘻……
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
发表于 2016-1-21 15:49:05 | 显示全部楼层
楼主威武
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-6-10
在线时间
16 小时
发表于 2016-3-13 09:22:16 | 显示全部楼层
cornrn 发表于 2016-1-21 15:30
原子哥我上传了,论坛第一个,加精吧(*^__^*) 嘻嘻……

楼主,你好,你有没有用过stm32f030的i2c,中断或者dma 都行?谢谢
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-13 10:57:18 | 显示全部楼层
alisa 发表于 2016-3-13 09:22
楼主,你好,你有没有用过stm32f030的i2c,中断或者dma 都行?谢谢

STM32 硬件I2C 我目前在STM32F1 L1 F030 F051 L4 F4上面使用过,用I2C就是为了用DMA不然没意义
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-6-10
在线时间
16 小时
发表于 2016-3-13 23:12:30 | 显示全部楼层
cornrn 发表于 2016-3-13 10:57
STM32 硬件I2C 我目前在STM32F1 L1 F030 F051 L4 F4上面使用过,用I2C就是为了用DMA不然没意义

楼主,在这么多的上面都用过i2c呢,我刚开始用stm32的芯片不久,现在调试stm32f030的i2c,查询方式可以工作,但是i2C的dma方式还没有搞明白,已经搞了两三天了,还没调试好,请问楼主能否分享你的F030的i2C 的dma方式的,非常感谢!
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-14 08:16:15 | 显示全部楼层
alisa 发表于 2016-3-13 23:12
楼主,在这么多的上面都用过i2c呢,我刚开始用stm32的芯片不久,现在调试stm32f030的i2c,查询方式可以工 ...

STM32F030上面的:#include "bsp_i2c.h"
uint32_t I2C_Timeout;

void I2C_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
        I2C_InitTypeDef  I2C_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

  /* Configure the I2C clock source. The clock is derived from the SYSCLK */
  RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* Connect PA9 to I2C_SCL */
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9, GPIO_AF_4);
  /* Configure PA10 pins: SDA */
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10, GPIO_AF_4);

  /* Configure PA9 pins: SCL */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
  I2C_InitStructure.I2C_DigitalFilter = 0x00;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
  I2C_InitStructure.I2C_Timing = I2C_TIMING;

  /* Apply I2C1 configuration after enabling it */
  I2C_Init(I2C1, &I2C_InitStructure);

  /* I2C1 Peripheral Enable */
  I2C_Cmd(I2C1, ENABLE);

}

/**
  * @brief  从I2C1总线上的某一器件的某一起始地址中读取一定字节的数据到数组中
  * @param  driver_Addr:I2C器件地址
  * @param  start_Addr:起始字节地址
  * @param  number_Bytes:要读取的字节数量(小于一页)
  * @param  read_Buffer:存放读取数据的数组指针
  * @retval 是否读取成功
  */
I2C_Status I2C1_Read_NBytes(uint8_t driver_Addr, uint8_t start_Addr, uint8_t number_Bytes, uint8_t *read_Buffer)
{
  uint8_t read_Num;

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  I2C_TransferHandling(I2C1, driver_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  I2C_SendData(I2C1, start_Addr);

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  I2C_TransferHandling(I2C1, driver_Addr, number_Bytes,  I2C_AutoEnd_Mode, I2C_Generate_Start_Read);

  for(read_Num = 0; read_Num < number_Bytes; read_Num++)
  {
    I2C_Timeout = I2C_TIMEOUT;
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET)
    {
      if((I2C_Timeout--) == 0)
      {
        return I2C_FAIL;
      }
    }

    read_Buffer[read_Num] = I2C_ReceiveData(I2C1);
  }

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  return I2C_OK;
}

/**
  * @brief  从I2C1的总线上的某一器件的某一起始地址中读取一定字节的数据到数组中
  * @param  driver_Addr:I2C器件地址
  * @param  start_Addr:起始字节地址
  * @param  number_Bytes:要读取的字节数量(小于一页)
  * @param  write_Buffer:存放读取数据的数组指针
  * @retval 是否读取成功
  */
I2C_Status I2C1_Write_NBytes(uint8_t driver_Addr, uint8_t start_Addr, uint8_t number_Bytes, uint8_t *write_Buffer)
{
  uint8_t write_Num;

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET)
  {
    if((I2C_Timeout--) == 0)
    {
                        printf("I2C_FLAG_BUSY\n");
      return I2C_FAIL;
    }
  }

  I2C_TransferHandling(I2C1, driver_Addr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
                        printf("I2C_FLAG_TXIS\n");
      return I2C_FAIL;
    }
  }

  I2C_SendData(I2C1, start_Addr);

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TCR) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
                        printf("I2C_FLAG_TCR\n");
      return I2C_FAIL;
    }
  }

  I2C_TransferHandling(I2C1, driver_Addr, number_Bytes, I2C_AutoEnd_Mode, I2C_No_StartStop);

  for(write_Num = 0; write_Num < number_Bytes; write_Num++)
  {
    I2C_Timeout = I2C_TIMEOUT;
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)
    {
      if((I2C_Timeout--) == 0)
      {
        return I2C_FAIL;
      }
    }

    I2C_SendData(I2C1, write_Buffer[write_Num]);
  }

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  return I2C_OK;
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-6-10
在线时间
16 小时
发表于 2016-3-14 08:32:18 | 显示全部楼层
cornrn 发表于 2016-3-14 08:16
STM32F030上面的:#include "bsp_i2c.h"
uint32_t I2C_Timeout;

楼主,你好,你这个应该是用查询方式读写数据的吧?没有开dma。
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-6-10
在线时间
16 小时
发表于 2016-3-14 08:40:14 | 显示全部楼层
cornrn 发表于 2016-3-14 08:16
STM32F030上面的:#include "bsp_i2c.h"
uint32_t I2C_Timeout;

楼主,你分享的是stm32f030的查询方式吧,我想请问你的硬件i2c的dma方式怎么做的?谢谢你
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-14 08:46:42 | 显示全部楼层
alisa 发表于 2016-3-14 08:40
楼主,你分享的是stm32f030的查询方式吧,我想请问你的硬件i2c的dma方式怎么做的?谢谢你

#include <i2c_dma.h>


typedef enum {FALSE = 0, TRUE = !FALSE} bool;


#define Transmitter             0x00
#define Receiver                0x01

static __IO uint8_t MasterDirection = Transmitter;
static uint16_t         SlaveDevAddr;                                                /*        从设备地址缓存                                */
static uint8_t         SlaveDevRegAddr;                                /*        从设备寄存器地址缓存        */
static bool check_begin = FALSE;
static bool OffsetDone = FALSE;
static __IO   I2C_STATE i2c_state;



/*******************************************************************************************************
** 函数名称: I2C_MasterCommunication
** 功能描述: I2C主机通信,通过DMA方式,使用 I2C1,非重入
                                                        direction: 通信描述
                                                                                                I2C_Direction_Transmitter 主机发送
                                                                                                I2C_Direction_Receiver主
机接收
                                                        slave_addr: 器件地址
                                                        offset:偏移地址
                                                        buffer:数据缓存
                                                        length:数据字节数,必须大于1
** 返    回: 无
********************************************************************************************************/
void I2C_MasterCommunication(uint8_t direction,uint16_t slave_addr,uint8_t offset,uint8_t* buffer,uint32_t length)
{
  DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&I2C1->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buffer;
  DMA_InitStructure.DMA_BufferSize = length;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  if(direction == I2C_Direction_Transmitter){
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
                DMA_DeInit(DMA1_Channel6);
    DMA_Init(DMA1_Channel6, &DMA_InitStructure);
                DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;
                MasterDirection = Transmitter;
  }  
        else if(direction == I2C_Direction_Receiver){
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
    DMA_DeInit(DMA1_Channel7);
    DMA_Init(DMA1_Channel7, &DMA_InitStructure);
                DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
                MasterDirection = Receiver;
  }
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

  SlaveDevAddr = slave_addr;
  SlaveDevRegAddr = offset;
  OffsetDone = FALSE;
  i2c_state = 1;   
  I2C_AcknowledgeConfig(I2C1,ENABLE);
  I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR ,ENABLE);
  if(I2C1->CR1 & 0x200)I2C1->CR1 &= 0xFDFF;
  I2C_GenerateSTART(I2C1,ENABLE);
        while(i2c_state != FinishFlag);       
}

/*******************************************************************************************************
** 函数名称: I2C1_EV_IRQHandler
** 功能描述: I2C事件中断处理函数
** 返    回: 无
********************************************************************************************************/
void I2C1_EV_IRQHandler(void)
{         
  switch (I2C_GetLastEvent(I2C1))
  {
                case I2C_EVENT_MASTER_MODE_SELECT:        /* EV5 */
                        if(OffsetDone){
                                I2C_Send7bitAddress(I2C1,SlaveDevAddr,I2C_Direction_Receiver);
                                OffsetDone = FALSE;
                        }                                       
                        else{
                                I2C_Send7bitAddress(I2C1,SlaveDevAddr,I2C_Direction_Transmitter);
                        }
                        I2C_ITConfig(I2C1,I2C_IT_BUF ,ENABLE);
                        break;              

                case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:  /* EV6 */
                        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF,DISABLE);
                        I2C_DMALastTransferCmd(I2C1,ENABLE);
                        I2C_DMACmd(I2C1,ENABLE);
                        DMA_Cmd(DMA1_Channel7,ENABLE);            
                        break;   

                case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: /* EV6 */
                        I2C_SendData(I2C1, SlaveDevRegAddr);
                        OffsetDone = TRUE;   
                        break;                                               
                case I2C_EVENT_MASTER_BYTE_TRANSMITTING:       /* EV8 */
                        if (MasterDirection == Receiver)
                        {
                                I2C_ITConfig(I2C1, I2C_IT_BUF ,DISABLE);
                                while ((I2C1->CR1 & 0x200) == 0x200);
                                I2C_GenerateSTART(I2C1, ENABLE);
                        }
                        else
                        {
                                I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF,DISABLE);
                                I2C_DMACmd(I2C1,ENABLE);
                                DMA_Cmd(DMA1_Channel6,ENABLE);       
                        }
                        break;
  }
}

/*******************************************************************************************************
** 函数名称: DMA1_Channel6_IRQHandler
** 功能描述: DMA1 通道6中断服务入口
** 返    回: 无
********************************************************************************************************/
void DMA1_Channel6_IRQHandler(void)
{
  if (DMA_GetFlagStatus(DMA1_FLAG_TC6))
  {
                I2C_DMACmd(I2C1,DISABLE);
                DMA_Cmd(DMA1_Channel6,DISABLE);
                I2C_DMALastTransferCmd(I2C1,DISABLE);
                I2C_GenerateSTOP(I2C1,ENABLE);
                i2c_state = FinishFlag;
                DMA_ClearFlag(DMA1_FLAG_TC6);
  }
}
/*******************************************************************************************************
** 函数名称: DMA1_Channel7_IRQHandler
** 功能描述: DMA1 通道7中断服务入口
** 返    回: 无
********************************************************************************************************/
void DMA1_Channel7_IRQHandler(void)
{       
  if(DMA_GetFlagStatus(DMA1_FLAG_TC7))
  {
                I2C_DMACmd(I2C1,DISABLE);
                I2C_DMALastTransferCmd(I2C1,DISABLE);
                I2C_GenerateSTOP(I2C1,ENABLE);
                i2c_state = FinishFlag;
    DMA_ClearFlag(DMA1_FLAG_TC7);
  }
}

/*******************************************************************************************************
** 函数名称: I2C1_ER_IRQHandler
** 功能描述: I2C错误中断服务
** 返    回: 无
********************************************************************************************************/
void I2C1_ER_IRQHandler(void)
{       
        if(I2C_GetFlagStatus(I2C1,I2C_FLAG_AF))
        {
                if(check_begin)I2C_GenerateSTART(I2C1,ENABLE);
                else if(I2C1->SR2 &0x01)
                {
                        I2C_GenerateSTOP(I2C1, ENABLE);
                        i2c_state = ExitFlag;
                }
                I2C_ClearFlag(I2C1, I2C_FLAG_AF);
        }

        if(I2C_GetFlagStatus(I2C1,I2C_FLAG_BERR))
        {
                if(I2C1->SR2 &0x01)
                {
                        I2C_GenerateSTOP(I2C1,ENABLE);
                        i2c_state = ExitFlag;
                }
                I2C_ClearFlag(I2C1, I2C_FLAG_BERR);
        }
}









/****************************** (C) COPYRIGHT SmartHealth *****END OF FILE******************************/


彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-6-10
在线时间
16 小时
发表于 2016-3-14 09:02:19 | 显示全部楼层

楼主,你分享给我的是stm32f030的硬件i2c的吗?我看st的库里面没有DMA通道6.通道7等,还有也没有你开的I2c_IT_EVT和I2C_IT_ERR的这两个中断的,是不是你发成其他的芯片上面的了?真是不好意思,麻烦你了,谢谢1
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2013-11-4
在线时间
112 小时
发表于 2016-7-29 16:03:34 | 显示全部楼层
原创精品,顶顶
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2015-9-17
在线时间
15 小时
发表于 2016-8-26 11:06:22 | 显示全部楼层
求问楼主,STM32F103的IIC读取MPU6050中, I2C_SendData(I2C2, SlaveDevRegAddr);   SlaveDevRegAddr从头到尾都没有变动,那他是怎么将其他寄存器的值读出来的呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 14:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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