Eeprom“伪跨页“读写驱动编写

Eeprom"伪跨页"读写驱动编写


Eeprom不能直接跨页读写,所以需要驱动去实现这一功能。

Eeprom基本参数

型号:BL24CM1A
页数:512页
每页大小:256Bytes
写入耗时:字节写入在5ms内,页写入也在5ms内

bit7bit6bit5bit4bit3bit2bit1bit0
1010A2A1B16R/W
B15B14B13B12B11B10B9B8
B7B6B5B4B3B2B1B0

数据寻址:B0 ~ B16; 寻址范围:0~(2^17-1)即0 ~ 0x1ffff
设备寻址:1010 A2 A1 B16 R/W (A2A1为输入引脚,可由外部拉低拉高改变设备地址,因此最多支持4个此种Eeprom同时在总线上,R/W为读写标志位)

代码实现

注意:Eeprom不能跨页读写,因此要注意跨页问题
具体实现见代码

实现思路

见代码注释

#define PAGE_SIZE   (256)//页大小为256Bytes

//ReadAddr:读取地址
//pBuffer:读取出来的数据的存放位置
//numByteToRead:要读取的数据字节数量
uint32_t sEE_ReadBuffer(uint32_t ReadAddr, uint8_t* pBuffer, uint16_t numByteToRead)
{
	if ((ReadAddr + numByteToRead) > 0x20000) //超出数据寻址
	{
		return STATUS_ERROR;
	}
	
	status_t EepReadStatus = 0;
	uint32_t dataReadAddr = 0;
	uint16_t pageAddr = 0;
	uint16_t numByteToReadNow = 0;
	uint16_t nowPageBytesNum = 0;
	uint32_t slaveAddress = 0;
	
	slaveAddress = 0xA0;//bit7~bit4:1010 ;bit3~bit2:0;
	
	pageAddr = ReadAddr / PAGE_SIZE;
	dataReadAddr = ReadAddr;
	numByteToReadNow = numByteToRead;

	while(1)//!一定要保证能跳出循环
	{
		if(dataReadAddr + numByteToReadNow <= (pageAddr + 1) * PAGE_SIZE)//没有跨页
		{
			//计算数据地址bit16
			if(pageAddr & (0x01<<16))
			{
                slaveAddress |= (0x01<<1);//对数据地址bit16赋值
   			}else{;}
   			EepReadStatus = InEepIICReadData(slaveAddress, dataReadAddr, numByteToReadNow, pBuffer);
   			break;
        	}
   			else
	        {
	        	//计算在当前页还需读多少Bytes
	        	nowPageBytesNum = (pageAddr + 1) * PAGE_SIZE - dataReadAddr;
	        	//计算数据地址bit16
	        	if(pageAddr & (0x01<<16))
	        	{
	        		slaveAddress |= (0x01<<1);//对数据地址bit16赋值
	        	}else{;}
	        	EepReadStatus = InEepIICReadData(slaveAddress, dataReadAddr, nowPageBytesNum, pBuffer);
	        	
				pageAddr += 1;//读取下一页
				dataReadAddr += nowPageBytesNum;//dataReadAddr = pageAddr * PAGE_SIZE; 下次读取的地址
				numByteToReadNow -= nowPageBytesNum;//还剩多少字节要读
				pBuffer += nowPageBytesNum;//下次读到的数据存放地址
			}
			if(EepReadStatus == STATUS_ERROR)
			{
				break;
			}
	}
	return EepReadStatus;
}
	
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值