⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24x.c

📁 ADS1.2下AT91SAM9260对AT24C08 EEPROM的读写操作
💻 C
📖 第 1 页 / 共 2 页
字号:
	while(size > 16)
	{
		AT91F_TWI_Write(AT91C_BASE_TWI, slvAddr, address, (data+cnt), 16);
		size    -= 16;
		address += 16;				// 要完一行,换行再写
		cnt     += 16;
		delay_ms(10);				// 不延时写数据会出错,原因不明
	}
	AT91F_TWI_Write(AT91C_BASE_TWI, slvAddr, address, (data+cnt), size);	// 要最后一行
	
	return 0;
}


//*============================================================================
//* 函数名称:AT24C08_Write
//* 函数功能:写数据到 AT24C08
//* 入口参数:address	: 写入地址(0~1023)
//*			  *data		: 要写入数据的起始地址
//*			  size		: 写入数据的长度
//* 返回值  : 0: 写入数据正常
//*			  1: 写入数据时发生错误	
//*			  2: 无
//*			  3: 写入地址范围出错
//*			  4: 数据长度范围出错
//*============================================================================
char AT24C08_Write(int address, char *data, int size)
{
	char page;
	int pageAddr,cnt;
	
	AT91F_TWI_Open();
	
	if((address >= AT24C08_MAX_ADDR)||(address < 0) )			// AT24C08 寻址范围为(0~1023)共1204字节
	{
		// AT91F_DBGU_Printk("Write AT24C08 address error !\r\n");
		AT91F_TWI_Close();
		return 3;
	}
	
	if( (size > (AT24C08_MAX_BYTE-address))||(size<0) )			// AT24C08 最大可写 1024 字节
	{
		// AT91F_DBGU_Printk("Write AT24C08 word leng error !\r\n");
		AT91F_TWI_Close();
		return 4;
	}
	
	page = (char)(address/256);			// 获取起始页
	pageAddr = address%256;				// 获取页面起始地址
	
	if(size < (256-pageAddr) )			// 要写的字节数不足一页
	{
		AT24C08_Write_Page(page, pageAddr, data, size);
		size = 0;
	}
	else
	{
		AT24C08_Write_Page(page, pageAddr, data, (256-pageAddr));
		size -= (256- pageAddr);
		cnt = 256-pageAddr;	
		pageAddr = 0;
		page++;
	}
	while(size > 256)
	{
		AT24C08_Write_Page(page, pageAddr, (data+cnt), 256);
		page++;
		pageAddr = 0;
		size -= 256;
		cnt  += 256;
	}
	if(size > 0)	
		AT24C08_Write_Page(page, pageAddr, (data+cnt), size);
		
	delay_ms(10);
	AT91F_TWI_Close();
	return 0;
}


//*============================================================================
//* 函数名称:AT24C08_Read_Page
//* 函数功能:从AT24C08 指定的页面读取数据 (一次只能读取一个页面)
//* 入口参数:page	  	:页面值( AT24C08共4页(0,1,2,3) )
//*			  address	: 读取数据地址(0~255)
//*			  *data		: 读出数据存放的起始地址
//*			  size		: 读取数据的长度
//* 返回值  : 0: 读取数据正常
//*			  1: 读取数据时发生错误	
//*			  2: 页面值范围出错	
//*			  3: 读取地址范围出错
//*			  4: 数据长度范围出错
//*============================================================================
char AT24C08_Read_Page(int page, int address, char *data, int size)
{
	char slvAddr;
	
	if( (page >= AT24C08_PAGE_SIZE)||(page<0) )		// AT24C08 共4页,分别为0,1,2,3, 大于3出错
	{
		// AT91F_DBGU_Printk("Read page error !\r\n");
		return 2;
	}
	
	if( (address >= 256)||(address<0) )				// AT24C08 每页只能写256字节,页内地址范围为(0~255)
	{
		// AT91F_DBGU_Printk("Read address error !\r\n");
		return 3;
	}
	
	if( (size > (256-address))||(size<0) )			// AT24C08 每页只能写 256 字节
	{
		// AT91F_DBGU_Printk("Read word leng error !\r\n");
		return 4;
	}
	
	slvAddr = AT24C08_BASE_ADDR + page;

	AT91F_TWI_Read(AT91C_BASE_TWI, slvAddr, address, data, size);
	
	return 0;
	/*
	unsigned char wordLeng;
	
	wordLeng = address%16;
	
	if((wordLeng + size) < 16)
	{
		AT91F_TWI_Read(AT91C_BASE_TWI, address, data, size);
		return;
	}
	else
	{
		AT91F_TWI_Read(AT91C_BASE_TWI, address, data, 16-wordLeng);
		size    -= (16-wordLeng);
		address += (16-wordLeng);
	}
	while(size > 16)
	{
		AT91F_TWI_Read(AT91C_BASE_TWI, address, data, 16);
		size    -= 16;
		address += 16;
	}
	AT91F_TWI_Read(AT91C_BASE_TWI, address, data, size);
	*/
}


//*============================================================================
//* 函数名称:AT24C08_Read
//* 函数功能:从 AT24C08 读取数据
//* 入口参数:address	: 读取数据地址(0~1023)
//*			  *data		: 读出数据存放的起始地址
//*			  size		: 读取数据的长度
//* 返回值  : 0: 读取正常
//*			  1: 读取数据时发生错误	
//*			  2: 无
//*			  3: 读取地址范围出错
//*			  4: 数据长度范围出错
//*============================================================================
char AT24C08_Read(int address, char *data, int size)
{
	int page;
	int pageAddr,cnt;
	
	AT91F_TWI_Open();
	
	if( (address >= AT24C08_MAX_ADDR)||(address<0) )			// AT24C08 寻址范围为(0~1023)共1204字节
	{
		// AT91F_DBGU_Printk("Write AT24C08 address error !\r\n");
		AT91F_TWI_Close();
		return 3;
	}
	
	if( (size > (AT24C08_MAX_BYTE-address))||(size<0) )			// AT24C08 最大可写 1024 字节
	{
		// AT91F_DBGU_Printk("Write AT24C08 word leng error !\r\n");
		AT91F_TWI_Close();
		return 4;
	}
	
	page = (address/256);					// 获取起始页值
	pageAddr = address%256;					// 获取页面起始地址

	if(size < (256-pageAddr) )				// 要读的字节数不足一页
	{
		AT24C08_Read_Page(page, pageAddr, data, size);
		size = 0;
	}
	else
	{
		AT24C08_Read_Page(page, pageAddr, data, (256-pageAddr));
		size -= (256 - pageAddr);
		cnt = 256 - pageAddr;
		page++;
		pageAddr = 0;		
	}
	while(size > 256)						// 写入一页
	{
		AT24C08_Read_Page(page, pageAddr, (data+cnt), 256);
		page++;
		pageAddr = 0;
		size -= 256;
		cnt  += 256;
	}

	if(size > 0)							// 写入最后一页
		AT24C08_Read_Page(page, pageAddr, (data+cnt), size);
	
	AT91F_TWI_Close();
	return 0;
}


#define DataLeng 200
//*============================================================================
//* 函数名称: AT24C08_Test()
//* 函数功能:测试AT24C08
//* 入口参数:无
//* 返回值  :无
//*============================================================================
void AT24C08_Test(void)
{
	int i;
	char write[DataLeng], read[DataLeng];
	//unsigned char write1,read1; 
	
	//AT91F_TWI_Open();
	
	AT91F_DBGU_Printk("\r\n EEPROM Test:\r\n");

	for(i = 0;i < DataLeng;i++)
	{
		write[i] = i;
		read[i] = 0;
	}	

	//write1 = 0x55;
	AT91F_DBGU_Printk("write Data...\r\n");
	for(i = 0;i < DataLeng;i++)
		uprintf("%3d ",write[i]);
	AT91F_DBGU_Printk("\r\n");
		
	// Write a byte and read it 
	//AT24C08_Write_Page(0,0,write, DataLeng);
	AT24C08_Write(100,write, DataLeng);
	AT91F_DBGU_Printk("before read data:\r\n");
	for(i = 0;i < DataLeng;i++)
		uprintf("%3d ",read[i]);
	AT91F_DBGU_Printk("\r\n");
	
	//AT24C08_Read_Page(0,0,read, DataLeng);
	AT24C08_Read(100,read, DataLeng);
	AT91F_DBGU_Printk("read Data...\r\n");
	for(i = 0;i < DataLeng;i++)
		uprintf("%3d ",read[i]);
	AT91F_DBGU_Printk("\r\n");
		
	// Wait 10 ms before data is written into EEPROM
	//if (read == write)
	//	AT91F_DBGU_Printk("-I- Test OK\r\n");
	//else 
	//	AT91F_DBGU_Printk("-E- Error during test\r\n");
	
	//AT91F_TWI_Close();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -