提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

文章目录

  • I2C外设简介
  • I2C框图
  • 编程

I2C外设简介

•STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担

•支持多主机模型

•支持7位/10位地址模式

•支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)

•支持DMA

•兼容SMBus协议

•STM32F103C8T6 硬件I2C资源:I2C1、I2C2

I2C框图

62b6d6fb02444a6e99ffe3154ad24884.png

二、实操步骤

1.了解硬件I2C的使用流程

还是借用江科大的结构框图,流程清晰且易懂

bde93f47765f46acab985b1303dcda11.png

 

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

主发送器传送序列图

cd1ce946cf55491bb33b53890c5d5a5d.png

a060868aaa6f42a2b19517236d5f6b0b.png

 

主接收器传送序列图

6cccfd33a2a74ec885d978e2e43a52ec.png

 

 

3.编写代码

cd1ce946cf55491bb33b53890c5d5a5d.png

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停止位
}

ae273ed378b84c969cb47adfad75dbad.png

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;

}

 

 

更多推荐