打印

24C16當全速(F5)運行時後不能正確讀取數據?

[复制链接]
1856|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
action99|  楼主 | 2007-11-28 16:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


我用的是HT46R23,這個程序是讀寫EEPRPM  24C16,用的是IIC來做,在用STEP OVER按鍵時讀出的數據是正確。但按下F5(全速)時讀出的數據就不正確了。高手指點。。。



main{
  _clrwdt();
  writer_eeprom(0xa0,0x00,0x8a,0x05);          //連繼寫5個數據,地址00,

    read_eeprom(0xa0,0x00,0x07);                  //read  5 datas  ,addr=00    
   }
}
//************************************
//        writer_eeprom
//************************************    
void    writer_eeprom(unsigned char pag,unsigned char eeprom_addr,unsigned eeprom_data,unsigned char eeprom_cnt)
{
  unsigned char i,data;
  eeprom_star();
  eeprom_send(pag|=write_comm);
  answer_ack();
  eeprom_send(eeprom_addr);
  answer_ack();
  for(i=0;i<eeprom_cnt;i++){
    eeprom_send(eeprom_data);
    answer_ack();
  }
  eeprom_stop();
}
//************************************
//        read_eeprom
//************************************          
void    read_eeprom(unsigned char pag,unsigned char eeprom_addr,unsigned char eeprom_cnt){
    unsigned char i ;
  eeprom_star();
  eeprom_send(pag|=write_comm);
  answer_ack();

  eeprom_send(eeprom_addr);
  answer_ack();
  eeprom_star();
  eeprom_send(read_comm);
answer_ack();
  for(i=0;i<eeprom_cnt;i++){
    eeprom_read();
    eeprom_congregate=eeprom_da;
  }
  eeprom_stop();
}
//************************************
//        eeprom_read
//************************************          
void    eeprom_read(){
  unsigned char i,data;
    eeprom_da=0;
   rom_sda_c=1;
  for(i=0;i<8;i++){
    rom_clk=1;
    _c=0; 
    if(rom_sda)_c=1;
    _rlc(&eeprom_da);
    rom_clk=0;
  }
   rom_sda_c=0;
    _nop();
    rom_sda=0;
rom_clk=1;
    _nop();
    _nop();
    rom_clk=0;
}
//************************************
//        eeprom_star
//************************************          
void    eeprom_star(){
    rom_clk=1;
    _nop();
    _nop();
    rom_sda=1;

    _nop();
    _nop();
    rom_sda=0;
    _nop();
    _nop();
    _nop();
     rom_clk=0;
}    
//************************************
//        eeprom_stop
//************************************          
void    eeprom_stop(){
    rom_sda=0;
    _nop();
    _nop();
     rom_clk=1;
    _nop();
    _nop();
    rom_sda=1;
    _nop();
    _nop();
    rom_clk=0;
}    
//************************************
//        eeprom_send
//************************************          
void    eeprom_send(unsigned char eeprom_data_buff){
  unsigned char i;
  for(i=0;i<8;i++){
    _rlc(&eeprom_data_buff);
    if(_c)rom_sda=1;
    else  rom_sda=0;
    rom_clk=1;
    _nop();
    rom_clk=0;
  }
}
//************************************
//        answer_ack
//************************************    
void    answer_ack(){
    rom_sda=0;
    _nop(); 
    rom_sda_c=1;
    _nop();
    rom_clk=1;
wait_ack:
   if(rom_sda)goto    wait_ack;
  rom_sda_c=0;
    rom_clk=0;
}

相关帖子

沙发
tyw| | 2007-11-28 22:21 | 只看该作者

把延时增大点试

使用特权

评论回复
板凳
action99|  楼主 | 2007-11-29 10:03 | 只看该作者

加延時都沒用

加延時都沒用。。我在每個IO口操作以後加了多個NOP,結果也是一樣。。。請指教!!!

使用特权

评论回复
地板
tyw| | 2007-11-29 19:27 | 只看该作者

写入时每字节间隔10ms了吗?

 贴个东东参考一下



一个24c16的读写程序(已经调试过)(arens)
 

////////////////////////////////////////////////////////////////

//24c16读写驱动程序,
//=-----------------------------------------------------------------------------
--
/*模块调用:
读数据:read(unsigned int address)
写数据:write(unsigned int address,unsigned char dd)   dd为要写的 数据字节*/
//------------------------------------------------------------------------------
----

sbit sda=P3^0;
sbit scl=P3^1;

sbit a0=ACC^0;                  //定义ACC的位,利用ACC操作
速度最快
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;

//------------------------------------------------------------------------------
--------
#pragma disable
void s24(void)                 //起始函数
{
_nop_();
    scl=0; 
    sda=1;
    scl=1;
    _nop_();
    sda=0;
    _nop_();
    _nop_();
    scl=0;
     _nop_();
    _nop_();
    sda=1;
}





//------------------------------------------------------------------------------
-------
#pragma disable
void p24(void)                 //停止函数
{
sda=0;
    scl=1;
    _nop_();
    _nop_();
    sda=1;
}



//------------------------------------------------------------------------------
------
#pragma disable
unsigned char rd24(void) /////////////////从24c16读一字节数据
{       ACC=0x00;
sda=1;
scl=1;a7=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a6=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a5=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a4=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a3=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a2=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a1=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
scl=1;a0=sda;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=1;scl=1;_nop_();_nop_();_nop_();_nop_
();scl=0; /// ///////////////24c16的一位回答位。
return(ACC);
}
//------------------------------------------------------------------------------
----
#pragma disable
void wd24(unsigned char dd) ////////////////向24c16写一字节数据
{      sda=1;
ACC=dd;
sda=a7;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a6;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a5;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a4;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a3;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a2;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=a0;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;
sda=0;scl=1;//scl=0;(在下面程序中)
}
//---------------------------------------------------------------------------
#pragma disable
unsigned char read(unsigned int address)
{
unsigned char dd;
    s24();                        ////////////////////////开始条件
    wd24(0xa0);                /////////////////////////写器件地址(写命令)
     _nop_();_nop_();_nop_();_nop_(); 
     scl=0;                        ///////////////////////////////////接收器件地
址确认信号
    wd24(address);                //////////////////////////// 写数据地址
    _nop_();_nop_();_nop_();_nop_();
    scl=0;
s24
();                             ///////////////////////////////////开始条件
    wd24(0xa1);                 /////////////////////////////写器件地址(读命
令)
    scl=0;
    dd=rd24();              //////////////////////////////////读 一字节
    p24();                   ////////////////////////////////////停止条件
    return(dd);
}
//------------------------------------------------------------------------------
--
#pragma disable
void write(unsigned int address,unsigned char dd)
{


s24();                        /////////////////开始条件
    wd24(0xa0);            ////////////////////////写器件地址;
    scl=0; 
    wd24(address);              /////////////////////写数据地址
    scl=0;
    wd24(dd);                  //////////////////////////写dd数据
    scl=0;
    p24();                      /////////////////////////停止条件;
      



(**推荐人:铁匠) 

[/TD][/TR][/TABLE]

使用特权

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

本版积分规则

87

主题

189

帖子

2

粉丝