项目一:IIC读写EEPROM AT24C02

2023-12-13 03:51:48

回头想了想在工作中调过的EEPROM还挺多的,有M24M02 、M28010?、AT24C02等,今天讲一下AT24C02吧

一、AT24C02简介

1.1 特点

文档已经上传了,需要的同学可以自行下载哈,晚点我会把下载链接附上来。

我大概照着文档翻译了一下:

?

  • 存储器内部按组织256字节 × 8位 (2K)组织
  • 双线串行接口(IIC)
  • 兼容400kHz通信速率
  • 具有硬件数据保护的写保护引脚
  • 8字节/页写模式
  • 允许部分页写入
  • 高可靠性:100万次写周期,数据保留:100年

1.2 引脚定义

串行时钟(SCL)、串行数据(SDA)不再赘述。A2,A1和A0引脚用于AT24C02的设备地址输入。WP为写保护引脚,提供硬件数据保护。

写保护引脚在连接到地(GND)时允许正常的读写操作。当写保护引脚接在VCC上时,写保护功能开启,操作如上表所示。

在板子的硬件原理图上可以看到,设备地址输入A2、A1、A0都为0,WP已经接在GND上关闭了写保护,我们可以正常读写。

需要的话,可以将WP接到一个GPIO引脚,使用推挽输出,防止数据误操作,可任意保护关键数据。

1.3 存储空间

AT24C02,2K,串行EEPROM内部组织为32页,每页8字节,2K需要一个8位的字地址进行随机字寻址。

2K EEPROM设备都需要一个8位设备地址字包含一个启动条件,以使芯片能够进行读或写操作。

设备地址字前4位最高有效位为1010。这对所有串行EEPROM设备都是通用的。接下来的3位是1K/2K EEPROM的A2、A1和A0设备地址位。设备地址的第8位是读写操作选择位。如果该位高,则进行读操作;如果该位低,则进行写操作。

综上,如果对AT24C02进行读操作,则设备地址为10100001B=A1H;如果对AT24C02进行写操作,则设备地址为10100000B=A0H.

二、 AT24C01编程?

?2.1 I2C结构体初始化

/**
  * @brief  I2C_EEPROM GPIO 配置,工作参数配置
  * @param  无
  * @retval 无
  */
void I2C_EEPROM_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	I2C_InitTypeDef I2C_InitStructure;

	// 打开I2C GPIO的时钟
	EEPROM_I2C_GPIO_APBxClkCmd(EEPROM_SCL_GPIO_CLK|EEPROM_SDA_GPIO_CLK, ENABLE);//加个或相当于把它们都初始化
	
	// 打开I2C 外设的时钟
	EEPROM_I2C_APBxClkCmd(EEPROM_I2C_CLK, ENABLE);

	// 将I2C 的SCL配置为开漏复用模式
	GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(EEPROM_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);

  // 将I2C 的SDA配置为开漏复用模式
	GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SDA_GPIO_PIN; 
	GPIO_Init(EEPROM_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
	
	//配置I2C的工作参数
	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//使能应答
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//使用7位设备地址
	I2C_InitStructure.I2C_ClockSpeed = EEPROM_I2C_BAUDRATE;//配置SCL时钟频率
	I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;//选16:9 与2:1没有任何影响
	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStructure.I2C_OwnAddress1 = STM32_I2C_OWN_ADDR;//这是STM32 I2C自身设备地址,只要是总线上唯一即可
	
	I2C_Init(EEPROM_I2C,&I2C_InitStructure);
	
	// 使能I2C
	I2C_Cmd (EEPROM_I2C, ENABLE);	    
}

相关的宏配置如下 bsp_iic.h

/** 
  * IIC E2PROM的引脚定义
  */

/*等待超时时间*/
#define I2CT_FLAG_TIMEOUT         ((uint32_t)0x1000)
#define I2CT_LONG_TIMEOUT         ((uint32_t)(10 * I2CT_FLAG_TIMEOUT))

//EEPROM的总线地址(8位)	
#define	 EEPROM_ADDR				   0xA0
// IC
//只要不与总线上从设备地址一样就可以了
#define  STM32_I2C_OWN_ADDR			   0x5f	

/* AT24C01/02每页有8个字节 */
#define I2C_PageSize           8

#define  EEPROM_I2C                    I2C1
#define  EEPROM_I2C_CLK                RCC_APB1Periph_I2C1
#define  EEPROM_I2C_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  EEPROM_I2C_BAUDRATE           400000

// IIC GPIO 引脚宏定义
#define  EEPROM_SCL_GPIO_CLK           (RCC_APB2Periph_GPIOB)
#define  EEPROM_SDA_GPIO_CLK           (RCC_APB2Periph_GPIOB)

#define  EEPROM_I2C_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  EEPROM_I2C_SCL_GPIO_PORT       GPIOB   
#define  EEPROM_I2C_SCL_GPIO_PIN        GPIO_Pin_6

#define  EEPROM_I2C_SDA_GPIO_PORT       GPIOB
#define  EEPROM_I2C_SDA_GPIO_PIN        GPIO_Pin_7

其余代码明天更新,今天累了想休息,想躺平

?

文章来源:https://blog.csdn.net/weixin_47730988/article/details/134959184
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。