stm32-IIC/EEPROM(AT24C256)代码及原理讲解

一、基础知识

1EEPROM

        是指带电可擦可编程只读存储器。是一种掉电数据不丢失的存储芯片

2AT24C256

        ATMEL公司256kbit串行电可擦的可编程只读存储器

3硬件相关

        

        A0、A1:地址选择输入端。在串行总线结构中,可以连接4个AT24C256IC。用A0、 A1来区分各IC。A0、A1悬空时为0

        SCL:串行时钟输入。上升沿将SDA上的数据写入存储器,下降沿从存储器读出数 据送SDA上。

        SDA:双向串行数据输入输出口。用于存储器与单片机之间的数据交换。

        WP:写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储 器操作被禁止。如果不连,芯片内部下拉到地。

 二代码实现

1写一个数据

        

        EEPROM 进入开始状态后,需要一个8位的地址字来选择芯片进行读写。设备地址 字由5位0、1组成的命令字和两位地址选择位A1、A0和一位读/写操作位构成。对 于 AT24C256,命令字为“10100”,同一串行总线上可以连接4个设备,由地址线 A1,A0加以区分。如只有一个AT24C256,A1,A0都取 0。最低位为1表示读操作

         向 AT24C256发送设备地址字并接到应答信号后,需要发送2个8位地址来选择 要写数据的地址,AT24C256接收到这个地址,应答一个零信号,然后根据时钟写8 位数据到AT24C256。存储器接收到数据后返回一个应答信号。写数据结束, AT24C256进入内部计时的写周期。在写循环过程中所有的输入都不能进行,直到 写结束,EEPROM才响应

我们得到代码:

void AT24C256_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{				   	  	    																 
    IIC_Start();  
	IIC_Send_Byte(0XA0);	    //发送写命令
	IIC_Wait_Ack();
    IIC_Send_Byte(WriteAddr>>8);//发送高地址 
	IIC_Wait_Ack();	   
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
	IIC_Wait_Ack(); 	 										  		   
	IIC_Send_Byte(DataToWrite);     //发送字节							   
	IIC_Wait_Ack();  		    	   
    IIC_Stop();//产生一个停止条件 
	delay_ms(10);	 
}

  2写页

          写页 AT24C256 具有64字节作为一页的写页功能,可以一次性写入一页。写页 的初始化过程与写字节的方法基本相同。不同的是写入一个字节后,微控制器不 发停止状态命令,而是在应答信号后,接着输入63个字节。每一个字节接收到 后,EEPROM照样输出一个为零的应答信号。因为一页只有64个单元,所以数据字 的地址低6位接收到一个字节后会自动加1,高位地址不变,即页地址不变。当内 部产生的地址到页边界时,接下来的字节要放至该页的开始。如果发送至E2PROM 的数据超过 64字节,则最早写的字节将被覆盖。  

        

            

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1. 硬件IIC驱动 STM32F103C8T6内置硬件I2C接口(IIC),可以通过配置寄存器来实现IIC通讯。以下是一个简单的硬件IIC驱动程序示例,用于向一个从设备(例如AT24C02 EEPROM)写入和读取一个字节。 首先需要配置I2C的时钟和GPIO引脚,如下所示: ``` //配置I2C时钟和GPIO引脚 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); ``` 然后需要初始化I2C,设置通讯速率、地址等参数: ``` //初始化I2C I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); ``` 接下来就可以使用I2C驱动程序向AT24C02 EEPROM写入和读取数据了。以下是一个简单的示例: ``` //向AT24C02 EEPROM写入一个字节 void I2C_WriteByte(uint8_t deviceAddr, uint8_t regAddr, uint8_t data) { //发送开始信号 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //发送设备地址(写模式) I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //发送寄存器地址 I2C_SendData(I2C1, regAddr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送数据 I2C_SendData(I2C1, data); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送停止信号 I2C_GenerateSTOP(I2C1, ENABLE); } //从AT24C02 EEPROM读取一个字节 uint8_t I2C_ReadByte(uint8_t deviceAddr, uint8_t regAddr) { uint8_t data = 0; //发送开始信号 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //发送设备地址(写模式) I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //发送寄存器地址 I2C_SendData(I2C1, regAddr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送重复开始信号 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //发送设备地址(读模式) I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //读取数据 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(I2C1); //发送停止信号 I2C_GenerateSTOP(I2C1, ENABLE); return data; } ``` 2. AT24C02读写 AT24C02是一种2Kbit(256字节)I2C EEPROM,可以通过I2C接口进行读写。以下是一个简单的示例,用于向AT24C02写入和读取一个字节。 首先需要定义AT24C02的设备地址和寄存器地址: ``` #define AT24C02_ADDR 0xA0 //设备地址 #define AT24C02_REG_ADDR 0x00 //寄存器地址 ``` 然后可以使用上面的I2C驱动程序来向AT24C02写入和读取数据了。以下是一个简单的示例: ``` //向AT24C02写入一个字节 void AT24C02_WriteByte(uint8_t data) { I2C_WriteByte(AT24C02_ADDR, AT24C02_REG_ADDR, data); } //从AT24C02读取一个字节 uint8_t AT24C02_ReadByte(void) { return I2C_ReadByte(AT24C02_ADDR, AT24C02_REG_ADDR); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式小趴菜学习记录

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

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

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

打赏作者

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

抵扣说明:

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

余额充值