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