news 2026/9/20 3:18:19

江协科技10-4 I2C硬件通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
江协科技10-4 I2C硬件通信

第一点很好去理解,下面的不必在乎,目前用不到,直接看最后一点,可以根据引脚的图去看具体是哪个接口是这两条线

这个功能框图还是很好理解的吧,首先看上面的SDA,可知的是,比较器和帧错误校验这一块目前是不用的,这两块是STM32本身作为从机的时候进行校验地址位用的

省去不必要的结构,这是我们剩下的结构

=========================================================================

由于SMT32默认是从机状态,所以要先通过s=1,产生起始条件,变为主机状态,并且将s=1存储到控制寄存器中

然后执行EV5,读取控制器寄存器,得知了主机已经准备好了,写入从机地址然后将控制寄存器中的s=1清楚,先将地址写入到DR寄存器中,然后再进入移位寄存器中,然后再进入到I2C总线上去

然后执行A,从机自动响应是不是自己

EV6:ADDR=1的意思就是,从机已经收到地址,然后发了应答信号A,主机读到了这个信息,然后硬件自动将SR1和SR2清楚

EV8_1:首先TxE=1的意思就是状态寄存器表明数据寄存器空了,该往里面填写东西了,后面就很好理解了,开始往数据寄存器写东西了

EV8:由于上个时候,移位和数据都是空的,所以数据寄存器把东西移到了移位寄存器,但是此时移位寄存器还在运输数据,但是此时的数据寄存器已经空了,这里就是TxE=1的意思,继续往数据寄存器写入数据,此时硬件会自动将状态寄存器中的TxE=1给清楚了

A:选择继续发送还是不发送了

EV8:然后继续,移位寄存器在传送,但是此时数据寄存器空了,状态寄存器置1,表示快发数据,然后被硬件自动清楚

EV8_2:很简单就是说在TxE=1和BTF=1,就是说移位寄存器在工作,数据寄存器是空的,然后结束传送,然后状态寄存器中的TxE=1和BTF=1被硬件自动清除

=========================================================================

①:开启I2C外设以及开启对应的GPIO时钟

②:把 I2C 外设对应的 GPIO 口初始化为复用开漏模

③:使用结构体,对整个 I2C 进行配置

④:通过 I2C_Cmd 函数,使能 I2C 外设

================所需要的函数===============================================

=========================================================================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(void) { 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); } }

MPU6050.c

#include "stm32f10x.h" // Device header #include "MPU6050_Reg.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); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_SendData(I2C2, RegAddress); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING); I2C_SendData(I2C2, Data); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTOP(I2C2, ENABLE); } uint8_t MPU6050_ReadReg(uint8_t RegAddress) { uint8_t Data; I2C_GenerateSTART(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_SendData(I2C2, RegAddress); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTART(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Receiver); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); I2C_AcknowledgeConfig(I2C2, DISABLE); I2C_GenerateSTOP(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED); Data = I2C_ReceiveData(I2C2); I2C_AcknowledgeConfig(I2C2, ENABLE); return Data; } void MPU6050_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//这是固定的 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_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_ClockSpeed = 50000; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//应答功能开启 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_OwnAddress1 = 0x00; //这两行都是stm32作为从机的时候,所需要配置的 I2C_Init(I2C2, &I2C_InitStructure); I2C_Cmd(I2C2, ENABLE); MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01); MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00); MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09); MPU6050_WriteReg(MPU6050_CONFIG, 0x06); MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18); } uint8_t MPU6050_GetID(void) { 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.h

#ifndef __MPU6050_H #define __MPU6050_H void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data); uint8_t MPU6050_ReadReg(uint8_t RegAddress); void MPU6050_Init(void); uint8_t MPU6050_GetID(void); void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ); #endif
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 2:15:56

ChatPPT:国内综合实力最强的AI PPT工具

&#x1f451; 第一名&#xff1a;ChatPPT&#xff08;www.chatppt.cn&#xff09; 综合多项评测&#xff0c;ChatPPT在2025年被认为是国内综合实力最强的AI PPT工具之一&#xff0c;其优势主要体现在以下几个方面。 海量模板与强大设计&#xff1a;ChatPPT拥有超过40万套模板…

作者头像 李华
网站建设 2026/9/19 22:44:38

测试经验,自动化测试的痛点+发展趋势,一篇带你上高速...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 早期&#xff0c;…

作者头像 李华
网站建设 2026/9/18 23:30:40

NetGuard实战指南:告别流量焦虑,让Android网络管理如此简单

你是否曾经发现手机流量莫名其妙地消失&#xff1f;是否担心某些应用在后台偷偷上传你的隐私数据&#xff1f;现在&#xff0c;一款名为NetGuard的Android应用能帮你彻底解决这些问题。作为一款无需root权限的网络管理工具&#xff0c;NetGuard通过本地虚拟专用网络技术为你提供…

作者头像 李华
网站建设 2026/9/18 18:34:32

大厂已经不用人干活了?“AI中台+Agent”正在重塑商业规则

当一部分企业还在讨论AI能做什么时&#xff0c;领先的大厂已经悄悄完成了一场组织变革&#xff1a;HR、法务、营销、财务等部门的工位上&#xff0c;迎来了一批724小时不眠不休、效率惊人的“新同事”——AI Agent。这并非取代&#xff0c;而是进化。“AI中台 AI Agent” 的王…

作者头像 李华
网站建设 2026/9/18 21:33:48

Qwen2.5-Omni全模态大模型:70亿参数重构人机交互范式

导语 【免费下载链接】Qwen2.5-Omni-3B 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen2.5-Omni-3B 阿里巴巴通义千问团队发布的Qwen2.5-Omni-3B全模态大模型&#xff0c;以70亿参数实现文本、图像、音频、视频的端到端处理&#xff0c;开创轻量化通用人工智能…

作者头像 李华
网站建设 2026/9/19 21:45:36

Morisawa BIZ UDGothic 字体使用指南:让文字表达更专业优雅

Morisawa BIZ UDGothic 字体使用指南&#xff1a;让文字表达更专业优雅 【免费下载链接】morisawa-biz-ud-gothic 项目地址: https://gitcode.com/gh_mirrors/mo/morisawa-biz-ud-gothic Morisawa BIZ UDGothic 是一款由日本著名字体公司 Morisawa 开发的通用设计字体&…

作者头像 李华