打印

基于S3C44B0的IIC EEPORM读写

[复制链接]
1504|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangben85|  楼主 | 2008-9-26 20:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人研一新生,今天编写了一个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)并非不延时。

    
    

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

30

帖子

0

粉丝