EEPROM驱动详解

在单片机开发中,经常使用EEPROM作为存储设备保存数据,如何根据数据手册编写驱动,我们以24LC16为例进行分析。

一.分析数据手册

1.1容量的计算

The Microchip Technology Inc. 24AA16/24LC16B (24XX16*) is a 16 Kbit Electrically Erasable PROM,Organized as 8 blocks of 256 bytes (8 x 256 x 8)

解释:16 Kbit 是多少字节的容量 ,1K是1024 16*1024/8=16*128=2048字节。

所以:24C01 容量 1*128=128字节

24C02 容量 2*128=256字节 24C08 容量 8*128=1024字节

1.2 地址空间

24LC16有2048个字节的地址空间,用户在分配地址范围时,地址范围为0x0--0x7ff,手册中写到2048个字节被分成8个块,每个块256字节。那么地址范围中的(9-11位)0-7代表着8个块地址。

二.看写操作时序

开始->写控制字->ACK->写字节地址->ACK- >数据->ACK->结束

 1.开始位的时序

 根据上图可知:

 I2C开始条件:SCL高电平, SDA 由高变低

 I2C结束条件:SCL高电平, SDA 由低变高

void I2CStart()
{
    SDA_OUT_high();    
    SCL_high();
    I2CDelay();
    SDA_OUT_low();
    I2CDelay();
    SCL_low();
}

2.写控制字:告诉机是读操作,还是写操作,读写那个块地址

  用户编码地址范围(0-0x7ff)共2048个字节,那么地址0x700的地址,7就是块地址,写控制字时要将块地址写入从机。

 2.1 写函数

static unsigned char  I2C_WriteByte(unsigned char byte)
{
	unsigned char i;
	SDA_OUT(); 
    for(i=0;i<8;i++)
    {
		if(byte & 0x80)  
		{
		    SDA_OUT_high();
		}
		else
		{
			SDA_OUT_low();
		}
		I2CDelay();
		SCL_high();
		I2CDelay();
		SCL_LOW();           //scl=0  data change
		byte  <<= 1;
	} 
	SDA_in();    //SDA PORT input 
	I2CDelay();
	SCL_high();
	I2CDelay();
	if(I2C_SDA == 1)   //ACK  read SDA port 
	{
		SCL_high();     no ack
		return 0;
	}
	SCL_LOW();
	I2CDelay();
	return 1;
}

使用  I2C_WriteByte()函数 写入控制字I2C_WriteByte(addr);

3.ACK 应答位

当主机给从机写入地址后,要求从机在接收一个字节后产生一个应答,因此主机会产生一个时钟

在这个时钟期间,从机必须把SDA 拉低,并在SCL高电平期间保持住。如果SDA没有拉低就是没有ACK,即NOACK。

static void I2CACK(void)
{
	SDA_OUT();   //SDA置输出口
	SDA_OUT_low();
	I2CDelay(); 
	SCL_high();  
	I2CDelay(); 
	SCL_low(); 
	I2CDelay(); 
}
static void I2C_NOACK(void)
{
	SDA_OUT();   //SDA置输出口
	SDA_OUT_high();
	I2CDelay(); 
	SCL_high();  
	I2CDelay(); 
	SCL_low(); 
	I2CDelay(); 
}

4.写地址   将数据放在EE的地址,       I2C_WriteByte(data);

5.  I2结束

void I2CStop()
{
    SDA_OUT_low();    
    SCL_high();
    I2CDelay();
    SDA_OUT_hight();
    I2CDelay();
    SCL_low();
}

6.一个完整的写函数

static unsigned char write_eeprom(unsigned int addr,  void const *buf, unsigned int len)
{
	unsigned char w_wait,e2page,SlaveAddr;	
	unsigned char const *src=(unsigned char *)buf;
	e2page = 16;
	I2CDelay();
reStart:
	SlaveAddr = 0xA0 + (unsigned char)((addr & 0x0700)>>7);
	
	I2CStart();
	I2C_WriteByte(SlaveAddr);
		
	I2C_WriteByte((unsigned char)(addr%0x100))) 
	
	while(len--)
	{
		I2C_WriteByte(*src++)) 
		addr++;
		if((addr % e2page) == 0)
		{
		    break;
		}
	}	
	I2CStop();
	DelayMs(5);
	if(len != 0xffff)	
	{
	    goto reStart;
	}
	
	I2CDelay();
	SCL_low();
	retrun 1;
}

三.看读操作时序进行EE读操作

 读操作时,先写入芯片,要读的地址,然后在读,如上述标计:

1,2步写入写操作控制字及要读的地址;第3步是写入读控制字,数据就可以读出。

读函数代码:

static unsigned char  I2C_Recv_byte(void)
{
	unsigned char byte;
	unsigned char i = 0;
	SDA_IN();     //SDA 置输入口
	for(i=0;i<8;i++)
	{
		byte <<= 1;
		SCL_high(); 
		I2CDelay();
		if(SDA == 1) 
		{
		    byte |= 0x01;
		}
		SCL_LOW(); 
		I2CDelay();
	}
	return(byte);
}

static unsigned char read_eeprom(unsigned int addr, void *buf, unsigned int len)
{
	unsigned char w_wait,SlaveAddr;
	unsigned char *dest=(unsigned char *)buf;
	I2CDelay(); 	
	SlaveAddr = 0xA0 + (unsigned char)((addr & 0x0700)>>7);	
	
	I2CStart();
	I2C_WriteByte(SlaveAddr))
    I2C_WriteByte((unsigned char)(addr%0x100)))
	
	I2CStart();
	I2C_WriteByte((SlaveAddr+1))    //read
	
	while(len--)
	{
		*dest++	= I2C_Recv_byte();
		if(n != 0)
		{
			I2CACK();
		}
		addr++;
	}
	I2CNOACK();
	I2CStop();	
	DelayMs(1);
}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: BL24C512是一款串行EEPROM存储器芯片,通常用于工业自动化、汽车电子、智能家居等领域。为了使计算机能够读写BL24C512芯片,需要使用EEPROM驱动程序。EEPROM驱动程序一般由操作系统提供,它负责与硬件接口通信,将计算机中的数据读写到芯片中。 在编写BL24C512 EEPROM驱动程序时,需要遵循一定的规范和流程。首先要通过数据手册了解芯片的规格和特性,确定读写操作的序列和时序。其次,需要使用合适的编程语言,如C语言,编写驱动程序代码。在编写驱动程序时,需要注意使用正确的寄存器操作和位操作,确保读写操作的正确性和稳定性。此外,还需要考虑驱动程序与操作系统接口的兼容性,确保驱动程序能够与特定版本的操作系统协同工作。 最后,还需要测试EEPROM驱动程序的稳定性和性能。通过测试能够发现程序中可能存在的问题,及时进行调整和优化。在开发完成后,还需要对程序进行维护和更新,以适应不断发展的硬件和操作系统环境。总之,编写BL24C512 EEPROM驱动程序需要耐心和细心,只有在不断实践和总结中才能不断提高驱动程序的质量和效率。 ### 回答2: BL24C512是一种串行EEPROM芯片,由BLX IC Design Corp.制造。EEPROM是一种可重复编程的电子存储器,可以在不损坏存储器的情况下修改数据。 BL24C512 EEPROM驱动程序是一个软件模块,用于与BL24C512 EEPROM芯片进行通信,并实现对EEPROM中存储数据的读写操作。驱动程序控制收发数据的协议和通信接口,以读取和写入EEPROM芯片的数据。 BL24C512 EEPROM驱动程序的开发需要熟悉该芯片的规范和数据手册。该驱动程序应该能够使用通用串行总线(SPI)协议与芯片进行通信,并实现对EEPROM中512K字节数据的读取和写入。 驱动程序应该包括适当的错误处理和故障排除功能,以确保EEPROM数据的完整性和安全性。此外,驱动程序的开发应该考虑到EEPROM读写操作的效率和速度,以改善系统的性能。 总之,BL24C512 EEPROM驱动程序可以实现硬件和软件之间的通信,并对EEPROM芯片进行正确,高效,安全的数据操作,为系统的可靠性和性能做出贡献。 ### 回答3: BL24C512 EEPROM是一种基于I2C总线协议通讯的存储设备,其驱动程序需要对硬件设备进行控制,使用I2C总线进行通信传输数据。 BL24C512 EEPROM驱动程序需要以下几个方面的内容: 1. 硬件初始化 在使用BL24C512 EEPROM前,需要先对硬件进行初始化,包括I2C总线的初始化和地址等属性参数的设置。 2. 读写数据操作 BL24C512 EEPROM的读写操作需要使用I2C总线进行数据传输。在读操作时,驱动程序需要发送读取命令,并接收EEPROM中的数据。在写操作时,需要发送写入命令和数据EEPROM中保存。 3. 缓存控制 由于EEPROM的读写速度较慢,驱动程序通常会使用缓冲区进行数据缓存,当需要进行读写操作时,先将数据保存在缓冲区中,再进行传输操作。 4. 错误处理 在EEPROM读写过程中,有可能发生传输错误,驱动程序需要检测并处理这些错误,如重新传输数据等。 综上所述,BL24C512 EEPROM驱动程序需要对硬件设备、数据读写、缓存控制和错误处理进行控制。通过有效的驱动程序,可以实现对EEPROM的读写操作,从而实现数据存储和传输等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值