STM32F10x I2C写入过程与AT24C系列E2PROM地址操作详解

需积分: 9 4 下载量 18 浏览量 更新于2024-08-19 收藏 343KB PPT 举报
本文档主要介绍了STM32F10x微控制器中I2C(Inter-Integrated Circuit Bus)接口的写入过程,针对的是AT24C系列E2PROM(Electrically Erasable Programmable Read-Only Memory)芯片的通信。I2C是一种简单易用的串行通信协议,它被广泛应用于各种嵌入式系统中,因其具有较少的线路、较低的功耗和灵活的设备连接方式而受到青睐。 首先,I2C总线由两根信号线组成:SDA(Serial Data)和SCL(Serial Clock)。SDA用于传输数据,而SCL用于同步通信。总线通过上拉电阻连接到电源,空闲时,SDA和SCL均为高电平,表明没有数据传输。当设备发送低电平时,它会驱动总线信号下降,实现逻辑“与”操作。 在写入过程中,单片机(如STM32F10x)首先确定AT24C系列E2PROM的地址,通过A2、A1和A0引脚的不同组合,形成一个固定的7位地址码。接着,它发送这个地址码以及写方向位(通常为0,表示写操作),并在SCL线上产生一个时钟信号。被选中的E2PROM会在确认其地址后通过SDA线发送应答信号,单片机借此确认通信成功并开始传输数据。 I2C支持主从模式,单片机作为主机时负责控制数据流,而其他设备作为从设备响应主机的请求。无论是主机发送数据还是接收数据,I2C总线的同步性和可靠性都对通信质量至关重要。通过这种方式,I2C简化了硬件设计,减少了系统体积,并提高了系统的灵活性和可靠性,使得设备的添加和修改变得相对容易。 总结来说,本文主要讲解了STM32F10x如何利用I2C接口进行数据写入,涉及到了I2C总线的构成、工作原理,以及在实际应用中的操作步骤和注意事项,对于理解和使用此类嵌入式通信协议具有参考价值。

#include "stm32f10x.h" #include "oled.h" void IIC_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE ); //PB6--SCL PB7--SDL GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_DeInit(I2C1); I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 400000; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_OwnAddress1 = 0x30; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } void I2C_WriteByte(uint8_t addr,uint8_t data) { while( I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //检查IIC总线是否繁忙 I2C_GenerateSTART(I2C1, ENABLE); //开启IIC,发送起始信号 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //EV5主模式 I2C_Send7bitAddress(I2C1, OLED_ADDRESS , I2C_Direction_Transmitter); //发送OLED地址 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //检查EV6 I2C_SendData(I2C1, addr); //发送寄存器地址 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); I2C_SendData(I2C1, data); //发送数据 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); I2C_GenerateSTOP(I2C1, ENABLE); }

2023-07-14 上传