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