STM32例程分享-03-EEPROM模块(AT24C02)(IIC)

1. 简介

  AT24C02是一个带写保护的2K位串行CMOS EEPROM,内部分成32页,每页8Byte,即共256个8位字节供用户读写,操作时有两种寻址方式:芯片寻址和片内子地址寻址。我们常用的是芯片寻址:AT24C02的芯片地址为1010,其地址控制字格式为[1010][A2A1A0][R/W]。其中A2,A1,A0可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。R/W为芯片读写控制位,该位为0,表示芯片进行写操作,一般情况下我们使用一片24C02时,将A2、A1、A0的引脚都接到GND,此时通信地址为0xa0

在这里插入图片描述

2. IIC驱动

  由于模块采用IIC通信,我们先写一个软件iic的驱动文件,在公众号“IOT趣制作”回复关键字“0419”,直接相关下载文件。下载完成后打开目录”./03-EPPROM模块\ERRPOM_at24c02示例工程\HARDWARE\IIC"下的myiic.h文件,根据需要修改自己的引脚,由于这里使用的是CRL和CRH寄存器来配置的输入输出方向,所以我们在修改时需要注意寄存器的正确使用,示例中IIC的SDA引脚为PB0,SCL引脚为PB1,在本STM32系列例程中涉及的所有IIC的相关模块,使用的都是这个IIC文件。
在这里插入图片描述

3. AT24C02驱动

 1)查看数据手册

  打开目录.\常用模块资料\03-EPPROM模块\参考资料文件夹的数据手册
在这里插入图片描述
在这里插入图片描述

 2) 原理图

  AT24C02的应用电路很简单,如下图,需要注意的是,如果我们使用的不是24C02的芯片而不是现成的模块时,需要在STM32的IIC引脚添加上拉电阻以保证IIC的正常通信。
在这里插入图片描述

 3) 读写操作

  读写操作的IIC时序如下,涉及的随机读写、页读写起以及始信号和停止信号等的时序图可以参考手册相关介绍

  4) 写字节

在这里插入图片描述

 5) 读字节

在这里插入图片描述

 6) 驱动代码

  完整驱动代码可以参考目录.\常用模块资料\03-EPPROM模块\ERRPOM_at24c02示例工程\HARDWARE\24CXX 文件夹下的文件
在这里插入图片描述

 7) 核心代码

a. 向at24c02某地址写某数据

AT24CXX_WriteOneByte(ADDRESS,DATA);

b. 读取at24c02某地址的数据

	DATA=AT24CXX_ReadOneByte(ADDRESS);

c. 主函数调用示例

/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 主函数
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
	delay_init();						//delay初始化
	uart_init(115200);			//串口初始化
	AT24CXX_Init();					//AT24CXX初始化
	//在地址0x00上写入数据0x66
	printf("24c02 addr [0x00] write data is: 0x%x\r\n",0x66);
	AT24CXX_WriteOneByte(0x00,0x66);
	delay_ms(50);
	//读出0x00地址上的数据
	read_Data=AT24CXX_ReadOneByte(0x00);
	printf("24c02 addr [0x00] read data is: 0x%x\r\n",read_Data);
	while(1)
	{
		delay_ms(20);
	}
}

4. 示例工程

 1) 打开工程

  打开目录下的文件夹.\常用模块资料\03-EPPROM模块\ERRPOM_at24c02示例工程的keil工程
在这里插入图片描述

 2) 编译烧录运行

  STM32向AT24C02的0X00地址中写入一个数据,如0x66,然后再读取地址0x00中读取数据,具体结果如下图所示:
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用以下代码示例来在STM32F103微控制器上使用AT24C04 EEPROM。 ```c #include "stm32f10x.h" #include "i2c.h" #define AT24C04_WRITE_ADDR 0xA0 #define AT24C04_READ_ADDR 0xA1 void I2C_EE_ByteWrite(uint8_t* pBuffer, uint16_t WriteAddr) { /* 发送启动条件 */ I2C_GenerateSTART(I2C1, ENABLE); /* 等待I2Cx的SB标志位设置 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* 发送写地址到设备 */ I2C_Send7bitAddress(I2C1, AT24C04_WRITE_ADDR, I2C_Direction_Transmitter); /* 等待I2Cx的ADDR标志位设置 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* 发送要写入的地址 */ I2C_SendData(I2C1, (uint8_t)(WriteAddr >> 8)); /* 等待数据发送完成 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, (uint8_t)(WriteAddr)); /* 等待数据发送完成 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* 写入一个字节的数据 */ I2C_SendData(I2C1, *pBuffer); /* 等待数据发送完成 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* 发送停止条件 */ I2C_GenerateSTOP(I2C1, ENABLE); } void I2C_EE_BufferWrite(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite) { while (NumByteToWrite--) { I2C_EE_ByteWrite(pBuffer, WriteAddr++); pBuffer++; } } void I2C_EE_BufferRead(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead) { /* 发送启动条件 */ I2C_GenerateSTART(I2C1, ENABLE); /* 等待I2Cx的SB标志位设置 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* 发送读地址到设备 */ I2C_Send7bitAddress(I2C1, AT24C04_WRITE_ADDR, I2C_Direction_Transmitter); /* 等待I2Cx的ADDR标志位设置 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* 发送要读取的地址 */ I2C_SendData(I2C1, (uint8_t)(ReadAddr >> 8)); /* 等待数据发送完成 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, (uint8_t)(ReadAddr)); /* 等待数据发送完成 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* 发送重启条件 */ I2C_GenerateSTART(I2C1, ENABLE); /* 等待I2Cx的SB标志位设置 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* 发送读地址到设备 */ I2C_Send7bitAddress(I2C1, AT24C04_READ_ADDR, I2C_Direction_Receiver); /* 等待I2Cx的ADDR标志位设置 */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); while (NumByteToRead) { if (NumByteToRead == 1) { /* 禁用ACK */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* 发送停止条件 */ I2C_GenerateSTOP(I2C1, ENABLE); } /* 等待接收缓冲区有数据 */ if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) { *pBuffer = I2C_ReceiveData(I2C1); pBuffer++; NumByteToRead--; } } /* 启用ACK */ I2C_AcknowledgeConfig(I2C1, ENABLE); } int main(void) { uint8_t txData[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; uint8_t rxData[8] = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); I2C_Configuration(); // 初始化I2C接口 /* 写入数据到EEPROM */ I2C_EE_BufferWrite(txData, 0x0000, sizeof(txData)); /* 从EEPROM读取数据 */ I2C_EE_BufferRead(rxData, 0x0000, sizeof(rxData)); while (1) { // 循环中可添加其他任务 } } ``` 上述代码中的I2C配置和初始化需要根据您的具体硬件设置进行调整,以便正确连接STM32F103与AT24C04 EEPROM。您还需要实现适当的I2C配置和初始化函数,以确保I2C接口能够正常工作。 请记住,这只是一个简单的示例,您可能需要根据您的具体需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT趣制作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值