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

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ā)送應答

2.6 接收應答

3、I2C完整時序

3.1 指定地址寫一個字節(jié)

3.2 當前地址讀一個字節(jié)

3.2?指定地址讀一個字節(jié)

4、簡單軟件I2C代碼(HAL)

4.1 軟件I2C

4.2 軟件I2C讀MPU6050寄存器

5、STM32硬件I2C

5.1 I2C外設框圖

5.2 主機發(fā)送流程圖

5.3 主機接收流程圖

6、簡單硬件I2C代碼(HAL)

7、例程下載


1、I2C簡介

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

2、I2C時序單元

2.1 起始條件

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

2.2 終止條件

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

2.3 發(fā)送一個字節(jié)

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

2.4 接收一個字節(jié)

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

2.5 發(fā)送應答

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

2.6 接收應答

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

3、I2C完整時序

3.1 指定地址寫一個字節(jié)

指定地址寫一個字節(jié)的時序分析如下:

如果需要連續(xù)寫多個字節(jié),只需要最后主機不需要主動拉低SDA,并且重復⑥⑦步,直到寫完所有字節(jié),再執(zhí)行⑧步即可。④~⑦步傳輸?shù)臄?shù)據(jù)含義是雙方約定的,不一定是這個時序中的含義。

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

3.2 當前地址讀一個字節(jié)

如果主機還需要繼續(xù)接收,那么③步應答0,從機繼續(xù)發(fā)送數(shù)據(jù)(重復②,但是寄存器地址會自增),直到主機不再需要讀數(shù)據(jù),那么執(zhí)行③④步表示結(jié)束。

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

3.2?指定地址讀一個字節(jié)

如果主機還需要繼續(xù)接收,那么最后重復當前地址讀中的③步應答0,從機繼續(xù)發(fā)送數(shù)據(jù)(重復②,但是寄存器地址會自增),直到主機不再需要讀數(shù)據(jù),那么執(zhí)行③④步表示結(jié)束。

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

4、簡單軟件I2C代碼(HAL)

4.1 軟件I2C

可以看到除了結(jié)束條件,任何一個時序單元,SCL都以低電平結(jié)束,便于拼接、避免錯誤

#include "stm32f1xx_hal.h"
#include "Dealy.h"

//PB6和PB7配置成普通開漏輸出模式
#define SCL_PORT GPIOB
#define SDA_PORT GPIOB
#define SCL_PIN  GPIO_PIN_6
#define SDA_PIN  GPIO_PIN_7

/**
  * 函    數(shù):I2C寫SCL引腳電平
  * 參    數(shù):BitValue 協(xié)議層傳入的當前需要寫入SCL的電平,范圍0~1
  * 返 回 值:無
  * 注意事項:此函數(shù)需要用戶實現(xiàn)內(nèi)容,當BitValue為0時,需要置SCL為低電平,當BitValue為1時,需要置SCL為高電平
  */
void MyI2C_W_SCL(uint8_t BitValue)
{
	HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, (GPIO_PinState)BitValue);		//根據(jù)BitValue,設置SCL引腳的電平
	Delay_us(10);												//延時10us,防止時序頻率超過要求
}

/**
  * 函    數(shù):I2C寫SDA引腳電平
  * 參    數(shù):BitValue 協(xié)議層傳入的當前需要寫入SDA的電平,范圍0~0xFF
  * 返 回 值:無
  * 注意事項:此函數(shù)需要用戶實現(xiàn)內(nèi)容,當BitValue為0時,需要置SDA為低電平,當BitValue非0時,需要置SDA為高電平
  */
void MyI2C_W_SDA(uint8_t BitValue)
{
	HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, (GPIO_PinState)BitValue);		//根據(jù)BitValue,設置SDA引腳的電平,BitValue要實現(xiàn)非0即1的特性
	Delay_us(10);												//延時10us,防止時序頻率超過要求
}

/**
  * 函    數(shù):I2C讀SDA引腳電平
  * 參    數(shù):無
  * 返 回 值:協(xié)議層需要得到的當前SDA的電平,范圍0~1
  * 注意事項:此函數(shù)需要用戶實現(xiàn)內(nèi)容,當前SDA為低電平時,返回0,當前SDA為高電平時,返回1
  */
GPIO_PinState MyI2C_R_SDA(void)
{
	GPIO_PinState BitValue;
	BitValue = HAL_GPIO_ReadPin(SDA_PORT, SDA_PIN);		//讀取SDA電平
	Delay_us(10);												//延時10us,防止時序頻率超過要求
	return BitValue;											//返回SDA電平
}


/*協(xié)議層*/

/**
  * 函    數(shù):I2C起始
  * 參    數(shù):無
  * 返 回 值:無
  */
void MyI2C_Start(void)
{
	MyI2C_W_SDA(1);							//釋放SDA,確保SDA為高電平
	MyI2C_W_SCL(1);							//釋放SCL,確保SCL為高電平
	MyI2C_W_SDA(0);							//在SCL高電平期間,拉低SDA,產(chǎn)生起始信號
	MyI2C_W_SCL(0);							//起始后把SCL也拉低,即為了占用總線,也為了方便總線時序的拼接
}

/**
  * 函    數(shù):I2C終止
  * 參    數(shù):無
  * 返 回 值:無
  */
void MyI2C_Stop(void)
{
	MyI2C_W_SDA(0);							//拉低SDA,確保SDA為低電平
	MyI2C_W_SCL(1);							//釋放SCL,使SCL呈現(xiàn)高電平
	MyI2C_W_SDA(1);							//在SCL高電平期間,釋放SDA,產(chǎn)生終止信號
}

/**
  * 函    數(shù):I2C發(fā)送一個字節(jié)
  * 參    數(shù):Byte 要發(fā)送的一個字節(jié)數(shù)據(jù),范圍:0x00~0xFF
  * 返 回 值:無
  */
void MyI2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i ++)				//循環(huán)8次,主機依次發(fā)送數(shù)據(jù)的每一位
	{
		MyI2C_W_SDA(Byte & (0x80 >> i));	//使用掩碼的方式取出Byte的指定一位數(shù)據(jù)并寫入到SDA線
		MyI2C_W_SCL(1);						//釋放SCL,從機在SCL高電平期間讀取SDA
		MyI2C_W_SCL(0);						//拉低SCL,主機開始發(fā)送下一位數(shù)據(jù)
	}
}

/**
  * 函    數(shù):I2C接收一個字節(jié)
  * 參    數(shù):無
  * 返 回 值:接收到的一個字節(jié)數(shù)據(jù),范圍:0x00~0xFF
  */
GPIO_PinState MyI2C_ReceiveByte(void)
{
	uint8_t i;
	GPIO_PinState Byte = (GPIO_PinState)0x00;					//定義接收的數(shù)據(jù),并賦初值0x00,此處必須賦初值0x00,后面會用到
	MyI2C_W_SDA(1);							//接收前,主機先確保釋放SDA,避免干擾從機的數(shù)據(jù)發(fā)送
	for (i = 0; i < 8; i ++)				//循環(huán)8次,主機依次接收數(shù)據(jù)的每一位
	{
		MyI2C_W_SCL(1);						//釋放SCL,主機機在SCL高電平期間讀取SDA
		if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}	//讀取SDA數(shù)據(jù),并存儲到Byte變量
														//當SDA為1時,置變量指定位為1,當SDA為0時,不做處理,指定位為默認的初值0
		MyI2C_W_SCL(0);						//拉低SCL,從機在SCL低電平期間寫入SDA
	}
	return Byte;							//返回接收到的一個字節(jié)數(shù)據(jù)
}

/**
  * 函    數(shù):I2C發(fā)送應答位
  * 參    數(shù):Byte 要發(fā)送的應答位,范圍:0~1,0表示應答,1表示非應答
  * 返 回 值:無
  */
void MyI2C_SendAck(uint8_t AckBit)
{
	MyI2C_W_SDA(AckBit);					//主機把應答位數(shù)據(jù)放到SDA線
	MyI2C_W_SCL(1);							//釋放SCL,從機在SCL高電平期間,讀取應答位
	MyI2C_W_SCL(0);							//拉低SCL,開始下一個時序模塊
}

/**
  * 函    數(shù):I2C接收應答位
  * 參    數(shù):無
  * 返 回 值:接收到的應答位,范圍:0~1,0表示應答,1表示非應答
  */
GPIO_PinState MyI2C_ReceiveAck(void)
{
	GPIO_PinState AckBit;							//定義應答位變量
	MyI2C_W_SDA(1);							//接收前,主機先確保釋放SDA,避免干擾從機的數(shù)據(jù)發(fā)送
	MyI2C_W_SCL(1);							//釋放SCL,主機機在SCL高電平期間讀取SDA
	AckBit = MyI2C_R_SDA();					//將應答位存儲到變量里
	MyI2C_W_SCL(0);							//拉低SCL,開始下一個時序模塊
	return AckBit;							//返回定義應答位變量
}

4.2 軟件I2C讀MPU6050寄存器

#include "stm32f1xx_hal.h"                  // Device header
#include "MyI2C.h"
#include "MPU6050_Reg.h"

#define MPU6050_ADDRESS		0xD0		//MPU6050的I2C從機地址

/**
  * 函    數(shù):MPU6050寫寄存器
  * 參    數(shù):RegAddress 寄存器地址,范圍:參考MPU6050手冊的寄存器描述
  * 參    數(shù):Data 要寫入寄存器的數(shù)據(jù),范圍:0x00~0xFF
  * 返 回 值:無
  */
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//發(fā)送從機地址,讀寫位為0,表示即將寫入
	MyI2C_ReceiveAck();					//接收應答
	MyI2C_SendByte(RegAddress);			//發(fā)送寄存器地址
	MyI2C_ReceiveAck();					//接收應答
	MyI2C_SendByte(Data);				//發(fā)送要寫入寄存器的數(shù)據(jù)
	MyI2C_ReceiveAck();					//接收應答
	MyI2C_Stop();						//I2C終止
}

/**
  * 函    數(shù):MPU6050讀寄存器
  * 參    數(shù):RegAddress 寄存器地址,范圍:參考MPU6050手冊的寄存器描述
  * 返 回 值:讀取寄存器的數(shù)據(jù),范圍:0x00~0xFF
  */
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//發(fā)送從機地址,讀寫位為0,表示即將寫入
	MyI2C_ReceiveAck();					//接收應答
	MyI2C_SendByte(RegAddress);			//發(fā)送寄存器地址
	MyI2C_ReceiveAck();					//接收應答
	
	MyI2C_Start();						//I2C重復起始
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);	//發(fā)送從機地址,讀寫位為1,表示即將讀取
	MyI2C_ReceiveAck();					//接收應答
	Data = MyI2C_ReceiveByte();			//接收指定寄存器的數(shù)據(jù)
	MyI2C_SendAck(1);					//發(fā)送應答,給從機非應答,終止從機的數(shù)據(jù)輸出
	MyI2C_Stop();						//I2C終止
	
	return Data;
}

/**
  * 函    數(shù):MPU6050初始化
  * 參    數(shù):無
  * 返 回 值:無
  */
void MPU6050_Init(void)
{
	/*MPU6050寄存器初始化,需要對照MPU6050手冊的寄存器描述配置,此處僅配置了部分重要的寄存器*/
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);		//電源管理寄存器1,取消睡眠模式,選擇時鐘源為X軸陀螺儀
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);		//電源管理寄存器2,保持默認值0,所有軸均不待機
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);		//采樣率分頻寄存器,配置采樣率
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);			//配置寄存器,配置DLPF
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);	//陀螺儀配置寄存器,選擇滿量程為±2000°/s
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);	//加速度計配置寄存器,選擇滿量程為±16g
}

/**
  * 函    數(shù):MPU6050獲取ID號
  * 參    數(shù):無
  * 返 回 值:MPU6050的ID號
  */
uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);		//返回WHO_AM_I寄存器的值
}

/**
  * 函    數(shù):MPU6050獲取數(shù)據(jù)
  * 參    數(shù):AccX AccY AccZ 加速度計X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回,范圍:-32768~32767
  * 參    數(shù):GyroX GyroY GyroZ 陀螺儀X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回,范圍:-32768~32767
  * 返 回 值:無
  */
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;								//定義數(shù)據(jù)高8位和低8位的變量
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);		//讀取加速度計X軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);		//讀取加速度計X軸的低8位數(shù)據(jù)
	*AccX = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);		//讀取加速度計Y軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);		//讀取加速度計Y軸的低8位數(shù)據(jù)
	*AccY = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);		//讀取加速度計Z軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);		//讀取加速度計Z軸的低8位數(shù)據(jù)
	*AccZ = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);		//讀取陀螺儀X軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);		//讀取陀螺儀X軸的低8位數(shù)據(jù)
	*GyroX = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);		//讀取陀螺儀Y軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);		//讀取陀螺儀Y軸的低8位數(shù)據(jù)
	*GyroY = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);		//讀取陀螺儀Z軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);		//讀取陀螺儀Z軸的低8位數(shù)據(jù)
	*GyroZ = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
}

5、STM32硬件I2C

5.1 I2C外設框圖

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

5.2 主機發(fā)送流程圖

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

5.3 主機接收流程圖

stm32hal庫讀寫mpu6050,stm32HAL庫,stm32,單片機,mcu

總之,就是看上去比較復雜,實際上只需要寫入控制寄存器CR或者數(shù)據(jù)寄存器DR,就可以控制時序單元的產(chǎn)生;時序單元發(fā)生后,查看相應的EV事件(檢查狀態(tài)寄存器SR),等待時序單元完成依次循環(huán),也就是操作----等待----操作----等待......

6、簡單硬件I2C代碼(HAL)

#include "stm32f1xx_hal.h"                  // Device header
#include "MPU6050_Reg.h"

#define MPU6050_ADDRESS		0xD0		//MPU6050的I2C從機地址

extern I2C_HandleTypeDef hi2c1;
static I2C_HandleTypeDef* hi2c_MPU6050 = &hi2c1;
/**
  * 函    數(shù):MPU6050寫寄存器
  * 參    數(shù):RegAddress 寄存器地址,范圍:參考MPU6050手冊的寄存器描述
  * 參    數(shù):Data 要寫入寄存器的數(shù)據(jù),范圍:0x00~0xFF
  * 返 回 值:無
  */
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	//MyI2C_Start();						//I2C起始
	//MyI2C_SendByte(MPU6050_ADDRESS);	//發(fā)送從機地址,讀寫位為0,表示即將寫入
	//MyI2C_ReceiveAck();					//接收應答
	//MyI2C_SendByte(RegAddress);			//發(fā)送寄存器地址
	//MyI2C_ReceiveAck();					//接收應答
	//MyI2C_SendByte(Data);				//發(fā)送要寫入寄存器的數(shù)據(jù)
	//MyI2C_ReceiveAck();					//接收應答
	//MyI2C_Stop();						//I2C終止
	HAL_I2C_Master_Transmit(hi2c_MPU6050, MPU6050_ADDRESS, (uint8_t*)RegAddress, 1, 10000);
	HAL_I2C_Master_Transmit(hi2c_MPU6050, MPU6050_ADDRESS, &Data, 1, 10000);
	//或者直接指定地址寫:
	//HAL_I2C_Mem_Write(hi2c_MPU6050, MPU6050_ADDRESS, RegAddress, 1, &Data, 1, 10000);
	
}

/**
  * 函    數(shù):MPU6050讀寄存器
  * 參    數(shù):RegAddress 寄存器地址,范圍:參考MPU6050手冊的寄存器描述
  * 返 回 值:讀取寄存器的數(shù)據(jù),范圍:0x00~0xFF
  */
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	//MyI2C_Start();						//I2C起始
	//MyI2C_SendByte(MPU6050_ADDRESS);	//發(fā)送從機地址,讀寫位為0,表示即將寫入
	//MyI2C_ReceiveAck();					//接收應答
	//MyI2C_SendByte(RegAddress);			//發(fā)送寄存器地址
	//MyI2C_ReceiveAck();					//接收應答
	//MyI2C_Start();						//I2C重復起始
	//MyI2C_SendByte(MPU6050_ADDRESS | 0x01);	//發(fā)送從機地址,讀寫位為1,表示即將讀取
	//MyI2C_ReceiveAck();					//接收應答
	//Data = MyI2C_ReceiveByte();			//接收指定寄存器的數(shù)據(jù)
	//MyI2C_SendAck(1);					//發(fā)送應答,給從機非應答,終止從機的數(shù)據(jù)輸出
	//MyI2C_Stop();						//I2C終止
	HAL_I2C_Mem_Read(hi2c_MPU6050, MPU6050_ADDRESS, RegAddress, 1, &Data, 1, 10000);
	
	return Data;
}

/**
  * 函    數(shù):MPU6050初始化
  * 參    數(shù):無
  * 返 回 值:無
  */
void MPU6050_Init(void)
{
	/*MPU6050寄存器初始化,需要對照MPU6050手冊的寄存器描述配置,此處僅配置了部分重要的寄存器*/
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);		//電源管理寄存器1,取消睡眠模式,選擇時鐘源為X軸陀螺儀
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);		//電源管理寄存器2,保持默認值0,所有軸均不待機
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);		//采樣率分頻寄存器,配置采樣率
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);			//配置寄存器,配置DLPF
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);	//陀螺儀配置寄存器,選擇滿量程為±2000°/s
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);	//加速度計配置寄存器,選擇滿量程為±16g
}

/**
  * 函    數(shù):MPU6050獲取ID號
  * 參    數(shù):無
  * 返 回 值:MPU6050的ID號
  */
uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);		//返回WHO_AM_I寄存器的值
}

/**
  * 函    數(shù):MPU6050獲取數(shù)據(jù)
  * 參    數(shù):AccX AccY AccZ 加速度計X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回,范圍:-32768~32767
  * 參    數(shù):GyroX GyroY GyroZ 陀螺儀X、Y、Z軸的數(shù)據(jù),使用輸出參數(shù)的形式返回,范圍:-32768~32767
  * 返 回 值:無
  */
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;								//定義數(shù)據(jù)高8位和低8位的變量
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);		//讀取加速度計X軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);		//讀取加速度計X軸的低8位數(shù)據(jù)
	*AccX = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);		//讀取加速度計Y軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);		//讀取加速度計Y軸的低8位數(shù)據(jù)
	*AccY = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);		//讀取加速度計Z軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);		//讀取加速度計Z軸的低8位數(shù)據(jù)
	*AccZ = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);		//讀取陀螺儀X軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);		//讀取陀螺儀X軸的低8位數(shù)據(jù)
	*GyroX = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);		//讀取陀螺儀Y軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);		//讀取陀螺儀Y軸的低8位數(shù)據(jù)
	*GyroY = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);		//讀取陀螺儀Z軸的高8位數(shù)據(jù)
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);		//讀取陀螺儀Z軸的低8位數(shù)據(jù)
	*GyroZ = (DataH << 8) | DataL;						//數(shù)據(jù)拼接,通過輸出參數(shù)返回
}

7、例程下載

鏈接:https://pan.baidu.com/s/1XFT_WHGA8Nsf7Q52niipnw?pwd=1145?
提取碼:1145

師承江科大,大部分截圖為江科大PPT截圖修改,例程由江科大標準庫代碼改為HAL庫文章來源地址http://www.zghlxwxcb.cn/news/detail-854852.html

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

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

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

相關(guān)文章

  • 【stm32】軟件I2C讀寫MPU6050

    【stm32】軟件I2C讀寫MPU6050

    概況 首先建立通信層的.c和.h模塊 在通信層里寫好I2C底層的GPIO初始化 以及6個時序基本單元 起始、終值、發(fā)送一個字節(jié)、接收一個字節(jié)、發(fā)送應答、接收應答 寫好I2C通信層之后,再建立MPU6050的.c和.h模塊 基于I2C通信的模塊,來實現(xiàn)指定地址讀、指定地址寫 再實現(xiàn)寫寄存器對

    2024年04月26日
    瀏覽(19)
  • 【STM32學習】——STM32-I2C外設&硬件讀寫MPU6050&軟硬件讀寫波形對比

    目錄 前言 一、I2C外設 二、硬件I2C操作流程 1.主機發(fā)送時序 3.其他時序

    2024年02月10日
    瀏覽(30)
  • 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)和電源管理這樣的任務提供了一條控制總線,SMBus與I2C總線之間在時序特性上存在一些差別 修改

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

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

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

    2024年01月21日
    瀏覽(42)
  • STM32--MPU6050與I2C外設

    STM32--MPU6050與I2C外設

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

    2024年02月11日
    瀏覽(28)
  • STM32 I2C通訊+MPU6050通訊演示

    STM32 I2C通訊+MPU6050通訊演示

    1.I2C通訊簡介 I2C(Inter IC Bus)是由Philips公司開發(fā)的一種通用數(shù)據(jù)總線; 兩根通信線:SCL(Serial Clock)、SDA(Serial Data); 同步,半雙工,帶數(shù)據(jù)應答; 支持總線掛載多設備(一主多從、多主多從) 2.硬件電路 所有I2C設備的SCL連在一起,SDA連在一起; 設備的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)
  • HAL STM32 硬件I2C方式讀取AS5600磁編碼器獲取角度例程

    HAL STM32 硬件I2C方式讀取AS5600磁編碼器獲取角度例程

    ??相關(guān)篇《STM32 軟件I2C方式讀取AS5600磁編碼器獲取角度例程》 ?stm32使用硬件I2C去讀取角度數(shù)據(jù),通過STM32CubeMX工具配置工程,讀取角度數(shù)據(jù),只需要調(diào)用一個函數(shù),即可完成數(shù)據(jù)的讀取。了解函數(shù)的用法以及從設備地址命令,上手十分快速和簡單。 ??AS5600資料: https://p

    2024年04月26日
    瀏覽(51)
  • STM32 HAL FreeRTOS 硬件I2C 使用

    STM32 HAL FreeRTOS 硬件I2C 使用

    因為某個項目想要顏色識別,去識別球的顏色,但是又不想多來個攝像頭,所以想嘗試一下顏色傳感器的方案。但是經(jīng)過嘗試,HAL庫生成的 FreeRTOS 硬件 I2C 讀寫一直在報錯。 剛好手頭上有九軸陀螺儀的例程代碼。最后用FreeRTOS 硬件 I2C 讀取數(shù)據(jù)。 這里提到了阻塞式 HAL 函數(shù)(

    2024年02月20日
    瀏覽(25)
  • 【STM32】AT24C256硬件I2C讀寫,基于HAL庫

    【STM32】AT24C256硬件I2C讀寫,基于HAL庫

    目錄 一、簡單介紹 二、配置工程 打開CubeMX,配置時鐘,調(diào)試接口,工程名,目錄等 配置iic 配置串口用于顯示信息 三、硬件連接 四、代碼編寫 一、隨機寫入一個字節(jié) 測試代碼 波形如下 代碼編寫 二、連續(xù)寫入 代碼如下 三、隨機讀取 測試代碼 波形如下 代碼編寫 四、連續(xù)

    2024年02月03日
    瀏覽(41)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包