什么是IIC
I²C(Inter-Integrated Circuit)总线是一种广泛使用的串行通信协议,由Philips(现为NXP Semiconductors)在1982年开发。它主要用于短距离通信,特别是在主板或嵌入式系统中连接低速外围设备(如传感器、EEPROM、实时时钟等)与微控制器或微处理器。
有什么用
I²C总线的主要作用是提供一种简单、高效的通信方式,用于连接低速外设与主控芯片。
在STM32平台上实现软件I²C协议并操控MPU6050传感器
先引入整体架构
关键步骤
1.初始化I²C总线:通过GPIO模拟I²C的SDA和SCL信号。
首先引入一些基本概念,GPIO 是微控制器的通用输入输出引脚,可用于模拟 I²C 协议。SDA 是 I²C 的数据线,负责传输数据和地址。SCL 是 I²C 的时钟线,负责同步数据传输。
原因:为了在没有硬件 I²C 外设的情况下,确保微控制器能够正确地与 I²C 设备
代码实现
#define IIC_SCL GPIO_Pin_7 // SCL 引脚
#define IIC_SDA GPIO_Pin_6 // SDA 引脚
#define IIC_PORT GPIOB // GPIO 端口
// 初始化 I²C 引脚
void IIC_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//启用GPIOB的时钟(用来供电的)
// 配置 SDA 和 SCL 为开漏输出
GPIO_InitStruct.GPIO_Pin = IIC_SCL | IIC_SDA;//指定引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出,双线保持高电平
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//设置传输速度
GPIO_Init(IIC_PORT, &GPIO_InitStruct);//调用函数,应用配置好的参数
// 上拉电阻由外部电路提供
}
// 设置 SCL 电平
void IIC_SCL_Set(uint8_t level)//参数 {
if (level)//不为零表示高电平
GPIO_SetBits(IIC_PORT, IIC_SCL);
else
GPIO_ResetBits(IIC_PORT, IIC_SCL);
}
// 设置 SDA 电平
void IIC_SDA_Set(uint8_t level) {
if (level)
GPIO_SetBits(IIC_PORT, IIC_SDA);
else
GPIO_ResetBits(IIC_PORT, IIC_SDA);
}
// 获取 SDA 的状态
uint8_t IIC_SDA_Read(void) {
return GP