本人研一新生,今天编写了一个24C04的IIC EEPROM程序。尽管调试成功了。但仍然有些许疑惑。望高手指教。<br /><br />#include "44b.h"<br />#include "def.h"<br /><br />#include "44blib.h" //程序中使用了Uart_Printf()<br /><br />INT8U buffer; //调试<br /><br />void Rd24C040(INT32U slvAddr,INT32U addr,INT8U *data)<br />{<br /><br /> ACKflag=0;<br /> <br /> /***********发送设备地址***************/<br /> <br /> rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf); //继续IIC操作<br /> <br /> rIICDS=slvAddr; //从设备地址<br /> <br /> rIICSTAT=0xf0; //开始<br /> <br /> while(ACKflag==0);<br /> <br /> ACKflag=0;<br /> <br /> <br /> /***********发送内部地址***************/<br /> <br /> rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf); //继续IIC操作<br /> <br /> rIICDS=addr; //EEPROM内部地址<br /> <br /> while(ACKflag==0);<br /> <br /> ACKflag=0; <br /> <br /> <br /> rIICDS=slvAddr; //再发一遍从设备地址<br /> <br /> <br /> /***********接收数据***************/<br /> <br /> rIICSTAT=0xb0; //开始接收,主接收信号<br /> <br /> rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);<br /> <br /> while(ACKflag==0);<br /> <br /> ACKflag=0;<br /> <br /> rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);<br /> <br /> Delay(0); //非常重要的延时程序,满足系统时序,不可少<br /> <br /> buffer=rIICDS; //调试<br /> <br /> *data=rIICDS;<br /> <br /> while(ACKflag==0);<br /> <br /> ACKflag=0;<br /> <br /> <br /> rIICSTAT=0x90;//主接收停止<br /> <br /> rIICCON=(0<<7)|(0<<6)|(1<<5)|(0xf); //允许产生中断, IICCLK=MCLK/16, 不需要ACK应答,//64Mhz/16/(15+1) = 250Khz <br /> <br /> <br /> <br /> <br /> }<br /> <br /> <br /> void __irq IicInt(void)<br />{<br /><br /> rI_ISPC=BIT_IIC; //清除IIC中断未决位<br /> <br /> <br /> ACKflag=1;<br /> <br />}<br /><br />void Main(void)<br /><br />{<br /><br /> INT8U i,data[16];<br /> <br /> rSYSCFG=CACHECFG; //配置8K Cache<br /> <br /> _44blib_init();<br /> <br /> Delay(10);<br /> <br /> IIC_Init(); //IIC初始化<br /> <br /> Uart_Printf("
Write test data into AT24LC04
");<br /> <br /> for(i=0;i<16;i++) //将数据写入AT2404<br /> {<br /> Wr24C040(0xa0,(INT8U)i,i); <br /> <br /> Uart_Printf("%2x",i) ; //显示写入的数据 <br /> }<br /> <br /> Uart_Printf("
Read test data from AT24LC04
"); <br /> <br /> for(i=0;i<16;i++)<br /> data=0; //清零数据区(为下面的读)<br /><br /> for(i=0;i<16;i++)<br /> { Rd24C040(0xa0,(INT8U)i,&(data)); //从AT2404读入前面写入的数据<br /> <br /> <br /> Uart_Printf("%2x",data) ; //从IIC中读出验证<br /> <br /> }<br /> <br /> while(1);<br />} <br /> <br /> <br /> 程序如上。<br />问题:Delay(0); //非常重要的延时程序,满足系统时序,不可少<br /> 该函数如果不加,我发现在调试时,单步运行可以读出数据。但是全速运行时就不能得出争取结果。读出的数据很奇怪。<br /> 希望高手教我。<br /><br />注:Delay(0)并非不延时。<br /><br /> <br /> <br /><br /> |
|