国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32--MPU6050與I2C外設(shè)

這篇具有很好參考價值的文章主要介紹了STM32--MPU6050與I2C外設(shè)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在51單片機專欄中,用過I2C通信來進行實現(xiàn)AT24C02的數(shù)據(jù)存儲;
里面介紹的是利用程序的編程來實現(xiàn)I2C的時序,進而實現(xiàn)AT24C02與單片機之間的關(guān)系連接;
本章將介紹使用I2C的硬件外設(shè)來實現(xiàn)I2C通信,和介紹MPU6050,利用I2C通信實現(xiàn)STM32對MPU6050的控制.

I2C通信軟件實現(xiàn)程序鏈接入口

MPU6050

MPU6050是一種集成三軸陀螺儀和三軸加速度計的六軸運動處理組件。
可以用來感知物體的旋轉(zhuǎn)和加速度運動,并提供相應(yīng)的測量數(shù)據(jù)。

STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機

MPU6050采用微機電系統(tǒng)(MEMS)技術(shù),通過測量微小的力和振動來檢測物體的運動。其內(nèi)置的三軸陀螺儀可以測量繞X、Y、Z軸的角速度,而三軸加速度計可以測量物體在X、Y、Z軸上的加速度。通過結(jié)合兩者的數(shù)據(jù),可以獲得更準確的運動信息。

MPU6050還具有一個可擴展的數(shù)字運動處理器(DMP),可以實現(xiàn)更復(fù)雜的運動處理功能。DMP可以通過主要的I2C或SPI端口輸出完整的九軸運動融合數(shù)據(jù),當連接到三軸磁強計時,可以獲得更全面的運動信息。

MPU6050廣泛應(yīng)用于飛行器、機器人、游戲控制器等領(lǐng)域,可以提供準確的姿態(tài)感知和運動跟蹤功能。它的集成設(shè)計減少了封裝空間和組合陀螺儀與加速度計時間軸不匹配的問題,使其在各種應(yīng)用中具有較高的可靠性和性能。

參數(shù)

角速度全格感測范圍:±250、±500、±1000、±2000°/sec(dps)
可追蹤快速和慢速動作

加速度全格感測范圍:±2g、±4g、±8g、±16g

產(chǎn)品傳輸可透過最高至400kHz的IIC

16位ADC采集傳感器的模擬信號,量化范圍:-32768~32767

I2C從機地址:
1101000(AD0=0) 0x68
1101001(AD0=1)0x69

這里的地址是沒有融入讀寫地址位的,如果融入讀寫地址位,那么將通過左移的方式,變成11010000,0xD0;11010001,0xD1。

電路

STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
最右邊的是MPU6050的芯片,左下角是8針的排針,左上角是一個低壓差線性穩(wěn)壓器。

芯片包括時鐘、IIC通信引腳、供電、幀同步等,本章有很多是用不到的。

左下角VCC和GND是引腳供電;SCL和SDA是IIC通信的引腳,在芯片處,SCL和SDA已經(jīng)內(nèi)置了兩個4.7k的上拉電阻,在接線時,可以直接連接到GPIO口。
XCL和XDA是主機的IIC引腳,目的是為了拓展芯片功能,可拓展磁力計等功能。
AD0是從機地址的最低位,接低電平時,7位從機地址為1101000,接高電平時,7位從機地址就是1101001.這里默認連接上了弱下拉到低電平,引腳懸空時,即為低電平。倘若想變?yōu)楦唠娖?,可以直接連接VCC,強上拉為高電平。
INT是中斷輸出引腳,可配置芯片內(nèi)部一些事件,來觸發(fā)中斷引腳的輸出。

左上角LD0是供電的邏輯,MPU6050芯片的VCC供電為2.375~3.46V,屬于3.3V的供電設(shè)備,為了擴大供電范圍,設(shè)計者在電路中加入3.3V的穩(wěn)壓器,輸入端電壓VCC_5V可以在3.3V到5V之間,經(jīng)過穩(wěn)壓器后即可輸出3.3V的電壓,一旦3.3V端有電壓,指示燈就會亮起。

MPU6050框圖

STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
該圖即為芯片的內(nèi)部結(jié)構(gòu)。

左上角是時鐘系統(tǒng),有時鐘輸入腳和時鐘輸出腳。

灰色部分就是芯片的傳感器,分別是XYZ軸的加速度計,XYZ軸的陀螺儀。且還內(nèi)置一個溫度傳感器,本質(zhì)上傳感器就是可變電阻,所以通過ADC模數(shù)轉(zhuǎn)換,就可以產(chǎn)生數(shù)據(jù)放在數(shù)據(jù)寄存器中。我們只需要讀取寄存器中的數(shù)據(jù)即可得到測量值。

最左邊是用來驗證芯片的好壞的,當啟動自測后,芯片內(nèi)部會模擬一個外力施加在傳感器上,該數(shù)據(jù)一般給的比平時大一些??梢杂檬鼓茏詼y,讀取數(shù)據(jù),再使能自測,讀取數(shù)據(jù),最后數(shù)據(jù)差稱為數(shù)據(jù)響應(yīng),只要數(shù)據(jù)響應(yīng)在規(guī)定范圍內(nèi),則表明芯片沒問題。

ChargePump為電荷泵,這是一種升壓電路,會連接一個電容。
電荷泵與電容并聯(lián)時,可為電容充電,串聯(lián)時,那么電荷泵和電容一起為芯片供電,提供比原來大的電壓。

右邊是通信接口和一些寄存器。
中斷狀態(tài)寄存器,可以控制內(nèi)部的某些事件到中斷引腳的輸出;
FIFO是先入先出寄存器,可以對數(shù)據(jù)流進行緩沖;
配置寄存器,可以對內(nèi)部電路進行配置。
傳感器寄存器,也就是數(shù)據(jù)寄存器,存儲各傳感器的數(shù)據(jù)。
工廠校準,內(nèi)部的傳感器都進行了校準;
數(shù)字運動處理器(DMP),這是芯片內(nèi)部自帶的一個姿態(tài)解算的硬件算法。

然后就是IIC通信的接口,鏈接著STM32,下面還有一些是主機的IIC通信接口。通過(SIBM)寄存器選擇。

IIC外設(shè)

STM32內(nèi)部集成了硬件I2C收發(fā)電路,可以由硬件自動執(zhí)行時鐘生成、起始終止條件生成、應(yīng)答位收發(fā)、數(shù)據(jù)收發(fā)等功能,減輕CPU的負擔

支持多主機模型

支持7位/10位地址模式

支持不同的通訊速度,標準速度(高達100 kHz),快速(高達400 kHz)

支持DMA

兼容SMBus協(xié)議

STM32F103C8T6 硬件I2C資源:I2C1、I2C2

框圖

STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
SDA接收數(shù)據(jù)和發(fā)送數(shù)據(jù);
對于要發(fā)送的數(shù)據(jù),會從數(shù)據(jù)寄存器轉(zhuǎn)移到數(shù)據(jù)移位寄存器中,數(shù)據(jù)移位寄存器再通過引腳串行發(fā)送數(shù)據(jù)位;
對于要接收的數(shù)據(jù),也會先放到數(shù)據(jù)移位寄存器中,數(shù)據(jù)寄存器再從移位寄存器中取數(shù)據(jù),這樣做的目的是為了更好的緩存數(shù)據(jù),防止有些數(shù)據(jù)會丟失。
數(shù)據(jù)寄存器可以通過寫入控制寄存器對應(yīng)位進行操作。

比較器和地址寄存器是從機模式使用的,STM32的IIC是基于可變多主機模型設(shè)計的,當STM32不通信時,可作為從機,可被別人召喚,這時就需要一個地址。
PEC是一個數(shù)據(jù)校驗?zāi)K,當發(fā)送一個多數(shù)據(jù)幀時,硬件可以自動執(zhí)行CRC校驗計算,CRC是一種校驗算法,會根據(jù)前面這些數(shù)據(jù),進行各種數(shù)據(jù)運算,會得到一個字節(jié)的校驗位,加在數(shù)據(jù)幀后面;STM32也可以自動對數(shù)據(jù)幀進行判斷,如果數(shù)據(jù)在傳輸過程中出錯,CRC算法通不過,硬件就會置校驗錯誤標志位。

SCL連接著時鐘控制。
SMBALEART是用于SMBus模式的,不使用該模式接口不能使用。

IIC的基本結(jié)構(gòu)

STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
數(shù)據(jù)控制器,控制對數(shù)據(jù)的發(fā)送和接收;
時鐘控制器,控制對時鐘的流動;
再接上GPIO口,最后把開關(guān)控制啟用,就能實現(xiàn)IIC通信。

軟件IIC實現(xiàn)MPU6050

OLED代碼鏈接入口

連接方式:
STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機

利用OLED屏幕顯示MPU6050陀螺儀和加速度各軸數(shù)據(jù);

IIC.h

#ifndef __I2C_H__
#define __I2C_H__

void I2C_INIT();
void I2C_Start();
void I2C_Stop();
void I2C_SendByte(uint8_t Byte);
uint8_t I2C_ReceiveByte();
void I2C_SendAck(uint8_t AckBit);
uint8_t I2C_ReceiveAck();

#endif

IIC.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void I2C_W_SCL(uint8_t BitValue)
{
    GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)BitValue);
    Delay_us(10); //延遲是讓函數(shù)有時間反應(yīng)
}

void I2C_W_SDA(uint8_t BitValue)
{
    GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)BitValue);
    Delay_us(10); //延遲是讓函數(shù)有時間反應(yīng)
}

uint8_t I2C_R_SDA()
{
    uint8_t BitValue;
    BitValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
    Delay_us(10);
    return BitValue;
}

void I2C_INIT()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //開漏弱上拉輸出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
}

void I2C_Start()
{
    I2C_W_SDA(1);
    I2C_W_SCL(1);
    I2C_W_SDA(0);
    I2C_W_SCL(0);
}

void I2C_Stop()
{
    I2C_W_SDA(0);
    I2C_W_SCL(1);
    I2C_W_SDA(1);
}

void I2C_SendByte(uint8_t Byte)
{
    uint8_t i;
    for(i=0;i<8;i++)
    {
        I2C_W_SDA(Byte&(0x80>>i));
        //高電平鎖存,從機讀取
        I2C_W_SCL(1);
        I2C_W_SCL(0);
    }
}

uint8_t I2C_ReceiveByte()
{
    uint8_t i,Byte=0x00;
    I2C_W_SDA(1); //主機釋放SDA
    for(i=0;i<8;i++)
    {
        I2C_W_SCL(1); //SCL高電平期間主機讀取從機發(fā)送的數(shù)據(jù)
        if(I2C_R_SDA()==1){Byte|=(0x80>>i);}
        I2C_W_SCL(0);
    }
    return Byte;
}

void I2C_SendAck(uint8_t AckBit)
{
    I2C_W_SDA(AckBit);
    //高電平鎖存,從機讀取
    I2C_W_SCL(1);
    I2C_W_SCL(0);
}

uint8_t I2C_ReceiveAck()
{
    uint8_t AckBit;
    I2C_W_SDA(1); //主機釋放SDA
    I2C_W_SCL(1); //SCL高電平期間主機讀取從機發(fā)送的數(shù)據(jù)
    AckBit=I2C_R_SDA(); 
    I2C_W_SCL(0);
    return AckBit;
}

這部分實現(xiàn)的是IIC的六個主要部分的代碼,與51單片機上的時序基本一致;在STM32上,是利用GPIO口來實現(xiàn)高低電平的輸入輸出。

輸出模式用開漏輸出,當輸出低電平時,電路會強下拉,變?yōu)榈碗娖剑?br> 當輸出為高電平時,為弱上拉,一旦有下拉電平輸入,就會變成低電平。

該模式不止可以實現(xiàn)輸出,也可以實現(xiàn)對IIC的接收,當輸入為1時,在SCL高電平時STM32會讀取;當輸入為0時,在SCL高電平STM32會讀取.

MPU6050_tag.h

#ifndef __MPU6050_REG_H
#define __MPU6050_REG_H

#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C

#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48

#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75

#endif

MPU6050.h

#ifndef __MPU6050_H__
#define __MPU6050_H__


void MPU6050_Init();
uint8_t MPU6050_GetID();
void MPU6050_GetData(int16_t* AccX,int16_t* AccY,int16_t* AccZ,int16_t* GyroX,int16_t* GyroY,int16_t* GyroZ);

#endif

MPU6050.c

#include "stm32f10x.h"                  // Device header
#include "I2C.h"
#include "MPU6050_rag.h"

#define MPU6050_ADDRESS 0xD0

void MPU6050_WriteReg(uint8_t RegAddress,uint8_t Data)
{
    I2C_Start();
    I2C_SendByte(MPU6050_ADDRESS);
    I2C_ReceiveAck();
    I2C_SendByte(RegAddress);
    I2C_ReceiveAck();
    I2C_SendByte(Data);
    I2C_ReceiveAck();
    I2C_Stop();
    
}

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
    uint8_t Data;
    
    I2C_Start();
    I2C_SendByte(MPU6050_ADDRESS);
    I2C_ReceiveAck();
    I2C_SendByte(RegAddress);
    I2C_ReceiveAck();
    
    I2C_Start();
    I2C_SendByte(MPU6050_ADDRESS|0x01);
    I2C_ReceiveAck();
    Data=I2C_ReceiveByte();
    I2C_SendAck(1); //主機不應(yīng)答,主機收回主動權(quán),讓從機停止發(fā)送數(shù)據(jù)字節(jié)
    I2C_Stop();
    
    return Data;
    
    
}

void MPU6050_Init()
{
   I2C_INIT();
    MPU6050_WriteReg(MPU6050_PWR_MGMT_1,0x01); //解除睡眠,選擇陀螺儀時鐘
    MPU6050_WriteReg(MPU6050_PWR_MGMT_1,0x00); //6個軸均不待機
    MPU6050_WriteReg(MPU6050_SMPLRT_DIV,0x09); //采樣分頻為10
    MPU6050_WriteReg(MPU6050_CONFIG, 0x06);  //濾波參數(shù)給最大
    MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); //最大陀螺儀量程
    MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18); //最大加速度量程

}

uint8_t MPU6050_GetID()
{
    return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}

void MPU6050_GetData(int16_t* AccX,int16_t* AccY,int16_t* AccZ,int16_t* GyroX,int16_t* GyroY,int16_t* GyroZ)
{
    uint8_t DataH,DataL;
    
    DataH=MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
    DataL=MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
    *AccX=(DataH<<8)|DataL;
    
    DataH=MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
    DataL=MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
    *AccY=(DataH<<8)|DataL;
    
    DataH=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
    DataL=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
    *AccZ=(DataH<<8)|DataL;
    
    DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
	*GyroX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
	*GyroY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
	*GyroZ = (DataH << 8) | DataL;
    
    

}

第一個代碼塊是對MPU6050一些寄存器地址的宏定義,主要有采樣分頻寄存器、陀螺儀配置寄存器、加速度配置寄存器、加速度數(shù)據(jù)寄存器、陀螺儀數(shù)據(jù)寄存器、狀態(tài)寄存器1/2、地址寄存器。

對于MPU6050的讀寫,采用了IIC通信時序?qū)崿F(xiàn)
寫時序:STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
讀時序:
STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
數(shù)據(jù)存儲器為16位存儲;

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MPU6050.h"

uint8_t ID;
int16_t AX,AY,AZ,GX,GY,GZ;

int main()
{
	OLED_Init();
    MPU6050_Init();
    
    OLED_ShowString(1,1,"ID:");
    ID=MPU6050_GetID();
    OLED_ShowHexNum(1,4,ID,2);
    
    while(1)
    {
        MPU6050_GetData(&AX,&AY,&AZ,&GX,&GY,&GZ);
        OLED_ShowSignedNum(2,1,AX,5);
        OLED_ShowSignedNum(3,1,AY,5);
        OLED_ShowSignedNum(4,1,AZ,5);
        OLED_ShowSignedNum(2,8,GX,5);
        OLED_ShowSignedNum(3,8,GY,5);
        OLED_ShowSignedNum(4,8,GZ,5);
        
    }
}

硬件IIC實現(xiàn)MPU6050

連接方式與軟件的保持一致。由于是硬件外設(shè),需要注意引腳有沒有支持該IIC功能。
STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
對于硬件外設(shè),我們只需要對軟件實現(xiàn)部分的IIC通信進行修改。
MPU6050.c

#include "stm32f10x.h"                  // Device header
#include "MPU6050_rag.h"

#define MPU6050_ADDRESS 0xD0

void MPU6050_WaitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{
	uint32_t Timeout;
	Timeout = 10000;
	while (I2C_CheckEvent(I2Cx, I2C_EVENT) != SUCCESS)
	{
		Timeout --;
		if (Timeout == 0)
		{
			break;
		}
	}
}

void MPU6050_WriteReg(uint8_t RegAddress,uint8_t Data)
{
    
    
    I2C_GenerateSTART(I2C2,ENABLE); //S
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT); //EV5
    
    I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter);
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); //EV6
    
    I2C_SendData(I2C2,RegAddress);
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING); //EV8
    
    I2C_SendData(I2C2,Data);
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED); //EV8_2
    
    I2C_GenerateSTOP(I2C2,ENABLE);
}

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
    uint8_t Data;
    
    I2C_GenerateSTART(I2C2,ENABLE); //S
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT); //EV5
    
    I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter); 
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); //EV6
    
    I2C_SendData(I2C2,RegAddress); 
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);
    I2C_GenerateSTART(I2C2,ENABLE); //S
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT); //EV5
    
    I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Receiver);
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); //EV6
    
    //EV7_1
    I2C_AcknowledgeConfig(I2C2,DISABLE);//應(yīng)答位禁用    
    I2C_GenerateSTOP(I2C2,ENABLE); //P
    MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED); //EV7
    
    Data=I2C_ReceiveData(I2C2);
    
    I2C_AcknowledgeConfig(I2C2,ENABLE); //應(yīng)答位啟用
    
    return Data;
    
    
}

void MPU6050_Init()
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD; //復(fù)用開漏輸出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    I2C_InitTypeDef I2C_InitStructure;
    I2C_InitStructure.I2C_Ack=I2C_Ack_Enable; //啟用應(yīng)答位
    I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit; //確認地址模式
    I2C_InitStructure.I2C_ClockSpeed=50000; //時鐘頻率
    I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2; //占空比
    I2C_InitStructure.I2C_Mode=I2C_Mode_I2C; //模式選擇
    I2C_InitStructure.I2C_OwnAddress1=0x00;
    I2C_Init(I2C2,&I2C_InitStructure);
    
    I2C_Cmd(I2C2,ENABLE);
    
    MPU6050_WriteReg(MPU6050_PWR_MGMT_1,0x01); //解除睡眠,選擇陀螺儀時鐘
    MPU6050_WriteReg(MPU6050_PWR_MGMT_1,0x00); //6個軸均不待機
    MPU6050_WriteReg(MPU6050_SMPLRT_DIV,0x09); //采樣分頻為10
    MPU6050_WriteReg(MPU6050_CONFIG, 0x06);  //濾波參數(shù)給最大
    MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); //最大陀螺儀量程
    MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18); //最大加速度量程

}

uint8_t MPU6050_GetID()
{
    return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}

void MPU6050_GetData(int16_t* AccX,int16_t* AccY,int16_t* AccZ,int16_t* GyroX,int16_t* GyroY,int16_t* GyroZ)
{
    uint8_t DataH,DataL;
    
    DataH=MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
    DataL=MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
    *AccX=(DataH<<8)|DataL;
    
    DataH=MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
    DataL=MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
    *AccY=(DataH<<8)|DataL;
    
    DataH=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
    DataL=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
    *AccZ=(DataH<<8)|DataL;
    
    DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
	*GyroX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
	*GyroY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
	*GyroZ = (DataH << 8) | DataL;
    
    

}

這里的初始化,GPIO引腳需要用到復(fù)用模式,因為IIC外設(shè)是片上外設(shè);
接收數(shù)據(jù)和發(fā)送數(shù)據(jù)要根據(jù)STM32的要求,
STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
根據(jù)響應(yīng)事件來確定事件的產(chǎn)生效果,所以會在每條條件后執(zhí)行響應(yīng)事件。
對于所給的庫函數(shù),有些事件(EVX)沒有提供,一些可以省略,一些需要對程序進行一定的整改。
如上面的EV8_1,確保數(shù)據(jù)寄存器和移位寄存器為空,在我們一開始調(diào)用時,就為空,所以可以對它進行忽略。
STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機
接收數(shù)據(jù)的EV7_1,描述到,設(shè)置應(yīng)答位為無應(yīng)答,和Stop請求;對于連續(xù)接收的數(shù)據(jù),需要在最后一個數(shù)據(jù)之前進行EV7_1響應(yīng),在進行EV7_1響應(yīng)時,因為最后一個數(shù)據(jù)會先放到移位寄存器中,最后第二個會在數(shù)據(jù)寄存器中。需要提前STOP請求,表示,接收結(jié)束。
而在程序中,我們只是對一個數(shù)據(jù)進行接收,并沒有連續(xù)接收數(shù)據(jù),但道理一樣,需要提前STOP請求。而在庫函數(shù)中剛好沒有對應(yīng)的函數(shù),需要自己禁用ACK和STOP請求。

上軟下硬:
STM32--MPU6050與I2C外設(shè),STM32,stm32,嵌入式硬件,單片機

這時軟件和硬件的波形對比,會發(fā)現(xiàn),在應(yīng)答位硬件會更快應(yīng)答,只要到到SCL下降沿和SDA上升沿,就會產(chǎn)生應(yīng)答。這就是硬件的優(yōu)勢;

在軟件中,由于是同步時序,對于時間沒有嚴格要求,只要在對應(yīng)時間完成對應(yīng)的電平操作即可,所以IIC通信才可以實現(xiàn)軟件編程。而軟件編程相對來說,也比較容易理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-665328.html

到了這里,關(guān)于STM32--MPU6050與I2C外設(shè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32 I2C通訊+MPU6050通訊演示

    STM32 I2C通訊+MPU6050通訊演示

    1.I2C通訊簡介 I2C(Inter IC Bus)是由Philips公司開發(fā)的一種通用數(shù)據(jù)總線; 兩根通信線:SCL(Serial Clock)、SDA(Serial Data); 同步,半雙工,帶數(shù)據(jù)應(yīng)答; 支持總線掛載多設(shè)備(一主多從、多主多從) 2.硬件電路 所有I2C設(shè)備的SCL連在一起,SDA連在一起; 設(shè)備的SCL和SDA均要配置

    2024年01月21日
    瀏覽(23)
  • STM32學習筆記(十)丨I2C通信(使用I2C實現(xiàn)MPU6050和STM32之間通信)

    STM32學習筆記(十)丨I2C通信(使用I2C實現(xiàn)MPU6050和STM32之間通信)

    ???本次課程采用單片機型號為STM32F103C8T6。(鑒于筆者實驗時身邊只有STM32F103ZET6,故本次實驗使基于ZET6進行的) ???課程鏈接:江協(xié)科技 STM32入門教程 ??往期筆記鏈接: ??STM32學習筆記(一)丨建立工程丨GPIO 通用輸入輸出 ??STM32學習筆記(二)丨STM32程序調(diào)試

    2024年01月19日
    瀏覽(26)
  • 【STM32】STM32學習筆記-軟件I2C讀寫MPU6050(33)

    【STM32】STM32學習筆記-軟件I2C讀寫MPU6050(33)

    I2C(Inter-Integrated Circuit)總線 是一種由NXP(原PHILIPS)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場合使用,傳輸距離短,任意時刻只能有一個主機等特性。 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標準模式下可

    2024年01月21日
    瀏覽(42)
  • 【STM32】STM32學習筆記-硬件I2C讀寫MPU6050(35)

    【STM32】STM32學習筆記-硬件I2C讀寫MPU6050(35)

    I2C(Inter-Integrated Circuit)總線是一種由NXP(原PHILIPS)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場合使用,傳輸距離短,任意時刻只能有一個主機等特性。 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標準模式下可

    2024年01月25日
    瀏覽(33)
  • 01_STM32軟件+硬件I2C讀取MPU6050(HAL庫)

    01_STM32軟件+硬件I2C讀取MPU6050(HAL庫)

    目錄 1、I2C簡介 2、I2C時序單元 2.1 起始條件 2.2 終止條件 2.3 發(fā)送一個字節(jié) 2.4 接收一個字節(jié) 2.5 發(fā)送應(yīng)答 2.6 接收應(yīng)答 3、I2C完整時序 3.1 指定地址寫一個字節(jié) 3.2 當前地址讀一個字節(jié) 3.2?指定地址讀一個字節(jié) 4、簡單軟件I2C代碼(HAL) 4.1 軟件I2C 4.2 軟件I2C讀MPU6050寄存器 5、ST

    2024年04月17日
    瀏覽(29)
  • 【STM32】I2C練習,HAL庫讀取MPU6050角度陀螺儀

    【STM32】I2C練習,HAL庫讀取MPU6050角度陀螺儀

    MPU-6000(6050)為全球首例整合性6軸運動處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時間軸之差的問題,減少了大量的封裝空間。當連接到三軸磁強計時,MPU-60X0提供完整的9軸運動融合輸出到其主I2C或SPI端口(SPI僅在MPU-6000上可用)。 寄存器地址 寄存器內(nèi)容 0X3B

    2024年02月16日
    瀏覽(28)
  • STM32F407硬件I2C實現(xiàn)MPU6050通訊(CUBEIDE)

    STM32F407硬件I2C實現(xiàn)MPU6050通訊(CUBEIDE)

    工程代碼 https://download.csdn.net/download/weixin_52849254/87886714 I2C1通道可選擇三種不同的通訊協(xié)議:I2C、SMBus-Alert-mode、SMBus-two-wire-Interface。 SMBus (System Management Bus,系統(tǒng)管理總線), 為系統(tǒng)和電源管理這樣的任務(wù)提供了一條控制總線,SMBus與I2C總線之間在時序特性上存在一些差別 修改

    2024年02月09日
    瀏覽(18)
  • STM32硬件I2C通信外設(shè)

    STM32硬件I2C通信外設(shè)

    本文主要介紹stm32自帶的I2C通信外設(shè),對比與軟件模擬I2C,硬件I2C可以自動生成時序,時序的操作更加及時規(guī)范,可以實現(xiàn)更加高性能的IIC通信。 本文內(nèi)容與I2C軟件通信有諸多類似之處,I2C軟件通信可見:https://blog.csdn.net/qq_53922901/article/details/136662006?spm=1001.2014.3001.5501 在8位指

    2024年04月08日
    瀏覽(27)
  • 【STM32】| 02——常用外設(shè) | I2C

    【STM32】| 02——常用外設(shè) | I2C

    系列文章目錄 【STM32】| 01——常用外設(shè) | USART 【STM32】| 02——常用外設(shè) | I2C 失敗了也挺可愛,成功了就超帥。 本文詳細介紹 I2C協(xié)議及 MCU I2C配置使用 I2C是一種常用的串行通信總線,由串行數(shù)據(jù)線SDA 和串線時鐘線SCL組成。I2C是一種多主機控制總線,由飛利浦公司為了讓主板

    2024年01月19日
    瀏覽(26)
  • 【STM32】STM32學習筆記-I2C通信外設(shè)(34)

    【STM32】STM32學習筆記-I2C通信外設(shè)(34)

    I2C(Inter-Integrated Circuit)總線 是一種由NXP(原PHILIPS)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場合使用,傳輸距離短,任意時刻只能有一個主機等特性。 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標準模式下可

    2024年01月17日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包