近几天在改写24C256的读写程序,原先的读写函数是每次16字节,改为每次20字节,调了好几天了还有问题,有的时候读写正常有的时候不对,想请教一下大家是不是会跟24C256存储结构有关系,比如不能跨页读写等等。还有这个函数应该是页读写方式吧? 下面的写函数大家帮忙看看有什么问题,先谢谢大家了 uchar RecToEeprom_xdbd(uint rec_num, uchar *write_data) //rec_num是记录号,每条记录20字节,*write_data是要写入的数据 { uchar i; uchar j;
union { uchar addr[2]; //first_addr[0]=higher byte uint val1; } xdata first; uchar xdata cmp_data[20]; uchar xdata writ_cmd; uchar xdata read_cmd;
EWP=0; //turn off _nop_(); _nop_(); _nop_();
//first.val1=(rec_num<<4); first.val1=(rec_num * 20); //原来是16字节,改为20字节 i=paddr; i=i*2; // programmable address to bits 3:1 i|=faddr; // add fixed address i&=0xfe; // specify write operation writ_cmd=i; i|=0x01; read_cmd=i;
for(j=0;j<9;j++) { iic_start(); //writing section iic_shout(writ_cmd); iic_shout(first.addr[0]); //send high byte of address iic_shout(first.addr[1]); //send lower byte of addr
//for(i=0;i<16;i++) for(i=0;i<20;i++) //原来是16字节,改为20字节 iic_shout(write_data); iic_stop(); delay_50us(120);
iic_start(); //reading section iic_shout(writ_cmd); iic_shout(first.addr[0]); //send high byte of address iic_shout(first.addr[1]); iic_stop(); //???? add temp _nop_();_nop_();
iic_start(); //second start for read iic_shout(read_cmd); //send device address and write command /*for(i=0;i<16;i++) { cmp_data=iic_shin(); if(i<15) iic_ack(); }*/ for(i=0;i<20;i++) //原来是16字节,改为20字节 { cmp_data=iic_shin();//读出校验 if(i<19) iic_ack(); } iic_nak(); iic_stop(); //for(i=0;i<16;i++) for(i=0;i<20;i++) //原来是16字节,先改为20字节 { if(write_data!=cmp_data) break; } //if(i==16) //verifying success if(i == 20) //原来是16字节,改为20字节 break; } EWP=1; //EX0=1; if(j<9) return(0); else return(1); } |