/*-------------------------------------------------- * 用的芯片是AT24C128 * 一共256页,每页64个字节 * -------------------------------------------------*/ #include "epprom.h" #include "I2C.h" #include "timeout.h" /*-------------------------------------------------------- * 在AT24CXX里面的指定地址开始读出指定个数的数据 * ReadAddr :开始读出的地址 对24c02为0~255 *pBuffer :数据数组首地址 *NumToRead:要读出数据的个数 * --------------------------------------------------------*/ void epprom_read(uint32_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead) { uint8_t addrH,addrL; uint16_t lentmp,lentow,lens; uint8_t tmp; if(NumToRead==0) return; // i2c_init(); __set_PRIMASK(1);//关总中断 delay_ms(100);//两次写操作,必须加间隔,否则写不进去 //fwdgt_feed(); lentmp=NumToRead; while(lentmp) { tmp=ReadAddr%PAGE_SIZE_EPPROM; tmp=PAGE_SIZE_EPPROM-tmp; if(tmp>=lentmp)//当页剩余空间大于要写入的长度 { lentow=lentmp; } else { lentow=tmp;//写入长度只能是剩余空间长度 } lentmp=lentmp-lentow;//计算要在下一页写入的长度 lens=lentow; addrH=ReadAddr>>8; addrL=ReadAddr&0xff; i2c_start(); i2c_send_byte(0xa0);//写 i2c_wait_ack(); i2c_send_byte(addrH); //发送高地址 i2c_wait_ack(); i2c_send_byte(addrL); //发送低地址 i2c_wait_ack(); delay_us(4); i2c_start(); i2c_send_byte(0xa1); //读 //进入接收模式 i2c_wait_ack(); while(lentow) { *pBuffer=i2c_read_byte(1); pBuffer++; //ReadAddr++; lentow--; } i2c_read_byte(0); i2c_stop();//产生一个停止条件 delay_us(4); //printf("at24 read %d %d\r\n", ReadAddr, lens); ReadAddr=ReadAddr+lens;//下一页的地址 } //IIC_WRITE_PROTECT_ON(); // 写保护打开 __set_PRIMASK(0);//开总中断 } /*--------------------------------------------------------- * 在AT24CXX里面的指定地址开始写入指定个数的数据 * WriteAddr :开始写入的地址 对24c02为0~255 * pBuffer :数据数组首地址 * NumToWrite:要写入数据的个数 * 每64bytes为一个page, * --------------------------------------------------------*/ void epprom_write(uint32_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite) { uint8_t addrH,addrL; uint16_t lentmp,lentow,lens; uint8_t tmp; // rt_err_t err; if(NumToWrite==0) return; // i2c_init(); IIC_WRITE_PROTECT_OFF(); // 写保护关闭 __set_PRIMASK(1);//关总中断 delay_ms(10);//两次写操作,必须加间隔,否则写不进去 //fwdgt_feed(); lentmp=NumToWrite; while(lentmp) { tmp=WriteAddr%PAGE_SIZE_EPPROM; tmp=PAGE_SIZE_EPPROM-tmp; if(tmp>=lentmp)//当页剩余空间大于要写入的长度 { lentow=lentmp; } else { lentow=tmp;//写入长度只能是剩余空间长度 } lentmp=lentmp-lentow;//计算要在下一页写入的长度 lens=lentow; addrH=WriteAddr>>8; addrL=WriteAddr&0xff; i2c_start(); i2c_send_byte(0xa0); i2c_wait_ack(); i2c_send_byte(addrH); //发送高地址 i2c_wait_ack(); i2c_send_byte(addrL); //发送低地址 i2c_wait_ack(); while(lentow--) { i2c_send_byte(*pBuffer); i2c_wait_ack(); pBuffer++; } i2c_stop();//产生一个停止条件 delay_ms(10); WriteAddr=WriteAddr+lens;//下一页的地址 } delay_ms(10);//两次写操作,必须加间隔,否则写不进去 IIC_WRITE_PROTECT_ON(); // 写保护使能打开 __set_PRIMASK(0);//开总中断 } void epprom_test(void) { uint8_t i = 0,vale=0; for(i=1;i<128;i++){ epprom_write(640+i,&i,1); } for(i=1;i<128;i++){ vale = 0; epprom_read(640+i,&vale,1); printf("i = %d,val = %d\r\n",i,vale); } }