📄 at24x.c
字号:
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 + -