stm32--I2C通信(硬件方法实现)

目录

一。硬件介绍

1.1电路介绍

 1.2硬件电路图

1.3 I2C时序

1.4 I2C总时序图

1.5 STM32 I2C硬件介绍

1.6 STM32 I2C硬件框图

1.7 STM32 I2C 基本结构

1.8 STM32 I2C 主机发送

1.9 STM32 I2C 主机接收

二。代码实现(硬件方法)

总结:


一。硬件介绍

1.1电路介绍

所有I2C设备的SCL连在一起,SDA连在一起

设备的SCL和SDA均要配置成开漏输出模式

SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

 1.2硬件电路图

1.3 I2C时序

起始条件:SCL高电平期间,SDA从高电平切换到低电平

终止条件:SCL高电平期间,SDA从低电平切换到高电平

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

1.4 I2C总时序图

注:时间可以设置慢一点。

1.5 STM32 I2C硬件介绍

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

•支持多主机模型

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

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

•支持DMA

•兼容SMBus协议

1.6 STM32 I2C硬件框图

1.7 STM32 I2C 基本结构

1.8 STM32 I2C 主机发送

1.9 STM32 I2C 主机接收

二。代码实现(硬件方法)

void I2C_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;//I2C使用到的引脚
	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;//选择IIC模式
	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;//7位地址
	I2C_InitStructure.I2C_OwnAddress1 = 0x00;//I2C主机地址
	I2C_Init(I2C2, &I2C_InitStructure);
	
	I2C_Cmd(I2C2, ENABLE);
}
//使用库函数接收发送数据
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);//开始信号
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);//结束信号
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);//应答配置
void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address);//地址配置
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);//发送数据
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);//发送地址
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);//读数据
uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register);//读寄存器数据
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);//确定时间发生

总结:

        stm32-I2C通信有软硬件方法,这是硬件方法实现的。

        本文只用于学习和记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值