STM32学习-16-[I2C]I2C模块的使用方法

I2C模块简介

I2C是一个片上外设

IO引脚进行初始化

查表
image

可见PB6和PB7复用后就是I2C功能
当然还有I2C2
image
然后是IO口怎么配置
image

void My_I2C_Init(void){
	// IO引脚初始化
	// 对I2C进行重映射
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);

	// 对PB8和PB9进行初始化,这是映射后的两个IO口,可以查手册
	RCC_APB2Periph_APB2PeriohClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
}

I2C的速度模式

image

image

时钟信号的占空比

只有在快速模式下才能设置占空比

SCL控制着传输的速度
占空比是指高电压在一个周期里面高电平所占的比例
image

I2C模块的初始化

image

void My_I2C_Init(void){
	// IO引脚初始化
	// 对I2C进行重映射
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);

	// 对PB8和PB9进行初始化,这是映射后的两个IO口,可以查手册
	RCC_APB2Periph_APB2PeriohClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	// 初始化I2C1模块
	// 开启后复位是固定写法
	RCC_APB1PeriphCLockCmd(RCC_APB1Periph_I2C1, ENABLE); // 开启I2C1的时钟
	RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); // 施加复位信号
	RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);// 释放复位信号


	I2C_InitTypeDef I2C_InitStruct;
	I2C_InitStruct.I2C_ClockSpeed = 400000; // 波特率400k
	I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // 标准的I2C	
	I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 占空比2: 1
	I2C_Init(I2C1, &I2C_InitStruct);

	I2C_Cmd(I2C1, ENABLE);	// 闭合I2C的总开关
}

image

posted @ 2026-08-31 21:24  灵垚克府  阅读(11)  评论(0)    收藏  举报