基于stm32C8T6的I2C通信学习记录(3)---硬件I2C
·
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- I2C外设简介
- I2C框图
- 编程
I2C外设简介
•STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
•支持多主机模型
•支持7位/10位地址模式
•支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
•支持DMA
•兼容SMBus协议
•STM32F103C8T6 硬件I2C资源:I2C1、I2C2
I2C框图

二、实操步骤
1.了解硬件I2C的使用流程
还是借用江科大的结构框图,流程清晰且易懂

2.了解I2C发送、接收序列图
主发送器传送序列图


主接收器传送序列图

3.编写代码

void HW_MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
I2C_GenerateSTART(I2C2,ENABLE);//I2c起始标志
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!= SUCCESS);//EV5,通过状态寄存SR1的SB位判断起始条件是否发送成功,0为发送失败,1为发送成功
I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter);//发送MPU6050的7位地址
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!= SUCCESS);//EV6:查看状态寄存器SR1的ADDR位判断地址发送是否结束,0为没结束,1为结束
I2C_SendData(I2C2,RegAddress);//发送需要操作的寄存器地址
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING)!= SUCCESS);//EV8:查看状态寄存器SR1的TxE位判断数据寄存器是否为空,0为非空,1为空
I2C_SendData(I2C2,Data);//发送一个字节数据
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!= SUCCESS);//EV8_2:查看状态寄存器TxE位和BTF位判断发送流程是否完成
I2C_GenerateSTOP(I2C2,ENABLE);//I2C停止位
}

uint8_t HW_MPU6050_ReadReg(uint8_t RegAddress)
{
uint8_t Data;
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT)!= SUCCESS);
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!= SUCCESS);
I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!= SUCCESS);
I2C_AcknowledgeConfig(I2C2,DISABLE);
I2C_GenerateSTOP(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!= SUCCESS);
Data = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2,ENABLE);
return Data;
}
更多推荐



所有评论(0)