打印

24LC02连续读不成功

[复制链接]
3865|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
发霉的味道|  楼主 | 2007-3-22 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
页写8byte成功,可是连续读不成功啊?为什么啊?

连续读过程;  启动总线--> 发从器件地址(0XA0)--> 发子地址-->启动总线-->

发读命令(0XA1) --> @1(次数循环)  读数据 --> 应答(0)-->  转 @1 -->应答

(1) ---> 停止总线

页写过程;  启动总线--> 发从器件地址(0XA0)--> 发子地址-->@1(次数循

环8 )  写数据 --> 检测应答(0)-->  转 @1 ---> 停止总线

相关帖子

沙发
NE5532| | 2007-3-22 12:16 | 只看该作者

有应答否?

使用特权

评论回复
板凳
ayb_ice| | 2007-3-22 13:22 | 只看该作者

随便说说

  最后是非应答信号,读比写要简单,你的程序问题不大,仔细分析一下。

使用特权

评论回复
地板
发霉的味道|  楼主 | 2007-3-22 13:34 | 只看该作者

l

有应答啊,我用仿真器跟的.可是读出来的数据不正确.

使用特权

评论回复
5
ayb_ice| | 2007-3-22 14:00 | 只看该作者

随便说说

  我是说读完最后一个字节要发送非应答信号。。。
  方便的话把程序帖上来,
  另外你怎么知道写是正确的,你读都是错的,你怎么验证写是正确的。
  

使用特权

评论回复
6
发霉的味道|  楼主 | 2007-3-22 14:31 | 只看该作者

??

我先写片嘛,再用编程器读出来,就知道了啊,我跟着试了下,读第一字节时是正确的数据,然后就是MCU应答一个0,但是再读取第二个数据时就是0X00了,不明白为什么.

void ackI2C ( bit answer)

{   if ( answer == 0 )  SDAT = 0  ;
    else   SDAT = 1   ;
    _nop_() ;
    SCLK =  1    ;
    someNOP()    ;
    SCLK = 0     ;
    return    ;
}

使用特权

评论回复
7
发霉的味道|  楼主 | 2007-3-22 14:36 | 只看该作者

!!

#dinfine someNOP()  _nop_() ;_nop_() ;_nop_() ;_nop_() ;

void pageread ( unsigned char headadd , unsigned char *Rbuf )

{   unsigned char bytecount ;

    startI2C () ;

    if ( senddata ( 0xa0 ) == 0 ) { someNOP() ; someNOP() ; someNOP() ;    }
    
    if ( senddata ( headadd ) == 0 ) { someNOP() ; someNOP() ; someNOP() ; }   //无应答则等待 12 _NOP_() //

    startI2C () ;

    if ( senddata ( 0xa1 ) == 0 ) { someNOP() ; someNOP() ; someNOP() ;    }

    for ( pagecount = 0 ; pagecount < 20 ; pagecount ++ )

        {  
           *Rbuf = receivedata () ;

           ackI2C ( 0 ) ;

           Rbuf ++  ;

        }

    ackI2C ( 1 )  ;

    stopI2C () ;

    return  ;
         
 }

使用特权

评论回复
8
ayb_ice| | 2007-3-22 14:55 | 只看该作者

随便说说


    for ( pagecount = 0 ; pagecount < 20 ; pagecount ++ )

        {
           *Rbuf = receivedata () ;

           if(pagecount == 19){
                ackI2C ( 1 ) ;
           }else{
                ackI2C ( 0 ) ;
           }

           Rbuf ++  ;

        }

//    ackI2C ( 1 )  ;

    stopI2C () ;

    return  ;

}
另外如果没有应答应该停止总线才是,延时再长时间也没有用。
你的程序也没有帖完整,不知其它地方还有没有问题,上而修改了一下,先试一下再看。

使用特权

评论回复
9
发霉的味道|  楼主 | 2007-3-23 08:40 | 只看该作者

贴出全部代码

#include "IO.H"

/* #define  WRITE  0xA0  ; */

/* #define  READ   0xA1  ; */

/* **************************/
void delay ( unsigned int timeM )

{  unsigned  int  con1;

         TH0  = 0x06 ;

         TL0  = 0x06 ;

         TMOD = 0x02 ;

            TF0  = 0 ;

            TR0  = 1 ;

   for ( ; timeM > 0 ; timeM-- )

       { for ( con1=4 ; con1>0 ; )

              if ( TF0 ) {   con1-- ;

                            TF0 = 0; 

                          }

        }

}


/* I2C Start */

void startI2C ( void )

{    SDAT = 1 ,SCLK = 1 ;

//     someNOP()  ;

     SDAT = 0   ;

//     someNOP()  ;

     SCLK = 0   ;

     return ;
}

/*    stop          */

void stopI2C ( void )

{    SDAT = 0  ,SCLK = 1 ;

//     someNOP()   ;

     SDAT = 1    ;

//     someNOP()   ;

     SCLK = 0    ;

     return  ;

}

/*    answer  */

void ackI2C ( bit answer)

{   if ( answer == 0 )  SDAT = 0  ;

    else   SDAT = 1   ;

    _nop_() ;

    SCLK =  1    ;
     
//    someNOP()    ;
    
    SCLK = 0     ;
         
   return    ;

}


/*  send byte */

bit senddata ( unsigned char sdata )

{  unsigned char bitcount ;

       bit ack  ;
   
   for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ )
       
       {     if ( sdata << bitcount & 0x80 )  SDAT = 1  ;
           
            else  SDAT = 0  ;

            SCLK = 1  ;

//            someNOP() ;

            SCLK = 0  ;

        }

     SDAT = 1 ;

    SCLK = 1  ;

//    _nop_()  ;

//    _nop_()  ;

    if ( SDAT == 1 )  ack = 0 ;

    else  ack = 1  ;

    SCLK = 0  ;

//    _nop_()  ;

//    _nop_()  ;

   return ( ack ) ;

}

/*  receive byte  */

unsigned char receivedata ()

{   unsigned char bitcount , rdata = 0 ;

    for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ )
        
        {    SCLK = 0  ;
            
//            someNOP() ;

            SCLK = 1  ;

//            _nop_() ;

//            _nop_() ;

            if ( SDAT == 1 ) rdata = ( rdata << 1 ) + 1  ;

            else  rdata <<= 1  ;

//            _nop_() ;

//            _nop_() ;

            SCLK = 0  ;

         }

     return ( rdata ) ;

 }

 /*   read data  */

unsigned char Read ( unsigned char Radd )

{   unsigned char Rbuf  ;

    startI2C () ;

    senddata ( 0xa0 ) ;
    
    senddata ( Radd ) ;

    startI2C () ;

    senddata ( 0xa1 ) ;

    Rbuf = receivedata () ;

    ackI2C ( 1 ) ;

    stopI2C () ;

    return ( Rbuf )  ;
         
 }

/*   write data */

void  Write ( unsigned char Wadd , unsigned char Wdata )
  
{   
     startI2C () ;

     senddata ( 0xa0 ) ;

     senddata ( Wadd ) ;

     senddata ( Wdata ) ;

     stopI2C ()  ;

//     delay ( 5 )  ;

     return  ;

 }
 
  /*   page read  */

void pageread ( unsigned char headadd , unsigned char *Rbuf )

{   unsigned char pagecount ;

    startI2C () ;

    if ( senddata ( 0xa0 ) == 0 )  return ;    
    
    if ( senddata ( headadd ) == 0 )   return  ; 

    startI2C () ;

    if ( senddata ( 0xa1 ) == 0 )  return  ;
                                 
    for ( pagecount = 0 ; pagecount < 8 ; pagecount ++ )

        {  
           *Rbuf = receivedata () ;

           ackI2C ( 0 ) ;

           Rbuf ++  ;

        }

    ackI2C ( 1 )  ;

    stopI2C () ;

    return  ;
         
 }

   /*   page write  */

void pagewrite ( unsigned char headadd , unsigned char *Wbuf )

{   unsigned char pagecount ;

    startI2C () ;

    if ( senddata ( 0xa0 ) == 0 ) return  ;
    
    if ( senddata ( headadd ) == 0 ) return  ;

    for ( pagecount = 0 ; pagecount < 8 ; pagecount ++ )

        {  if ( senddata ( *Wbuf ) == 0 )

              {    someNOP()   ;

                   someNOP()   ;

               }

           Wbuf ++  ;

        }

    stopI2C () ;

    delay ( 10 ) ;

    return  ;
         
 }
                   
                   

使用特权

评论回复
10
发霉的味道|  楼主 | 2007-3-23 08:46 | 只看该作者

试过

也试过大侠的方法,好象还是不行,修改一些地方,唉,这个问题已经整了我三天了,觉都睡不好,跟踪来跟踪去...就是在读完第一个数据后...应答从设备,再读第二个数据就不行了...读出来的是0X00了.后面的也一样是0X00.

使用特权

评论回复
11
ayb_ice| | 2007-3-23 09:06 | 只看该作者

随便说说

// 修改了一下,感觉你的程序很乱,没有时间帮你完整的修改,试一下再说。

#include "IO.H"

/* #define  WRITE  0xA0  ; */

/* #define  READ   0xA1  ; */

/* **************************/
void delay (unsigned int timeM)
{
    unsigned  int  con1;

    TH0  = 0x06 ;

    TL0  = 0x06 ;

    TMOD = 0x02 ;

    TF0  = 0 ;

    TR0  = 1 ;

    for(; timeM>0; timeM--){
        for(con1=4; con1>0; ){
            if(TF0){
                con1-- ;
                TF0 = 0;
            }
        }
    }
}


/* I2C Start */

void startI2C (void)
{
    SDAT = 1 ,SCLK = 1 ;

    someNOP()  ;

    SDAT = 0   ;

    someNOP()  ;

    SCLK = 0   ;

    return ;
}

/*    stop          */

void stopI2C ( void )

{    SDAT = 0  ,SCLK = 1 ;

     someNOP()   ;

     SDAT = 1    ;

     someNOP()   ;

     SCLK = 0    ;

     return  ;

}

/*    answer  */

void ackI2C ( bit answer)

{   if ( answer == 0 )  SDAT = 0  ;

    else   SDAT = 1   ;

    _nop_() ;

    SCLK =  1    ;

//    someNOP()    ;

    SCLK = 0     ;

   return    ;

}


/*  send byte */

bit senddata ( unsigned char sdata )

{  unsigned char bitcount ;

       bit ack  ;

   for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ )

//       {     if ( sdata << bitcount & 0x80 )  SDAT = 1  ;
       {     if ( sdata <<= 1) SDAT = CY;       // ayb_ice

            SCLK = 1  ;

//            someNOP() ;

            SCLK = 0  ;

        }

     SDAT = 1 ;

    SCLK = 1  ;

//    _nop_()  ;

//    _nop_()  ;

    if ( SDAT == 1 )  ack = 0 ;

    else  ack = 1  ;

    SCLK = 0  ;

//    _nop_()  ;

//    _nop_()  ;

   return ( ack ) ;

}

/*  receive byte  */

unsigned char receivedata ()

{   unsigned char bitcount , rdata = 0 ;

    for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ )

        {    SCLK = 0  ;

//            someNOP() ;

            SCLK = 1  ;

//            _nop_() ;

//            _nop_() ;

//            if ( SDAT == 1 ) rdata = ( rdata << 1 ) + 1  ;
//           else  rdata <<= 1  ;
            rdata <<= 1;        // ayb_ice
            if(SDAT) rdata++    // ayb_ice

//            _nop_() ;

//            _nop_() ;

            SCLK = 0  ;

         }

     return ( rdata ) ;

}

/*   read data  */

unsigned char Read ( unsigned char Radd )

{   unsigned char Rbuf  ;

    startI2C () ;

    senddata ( 0xa0 ) ;

    senddata ( Radd ) ;

    startI2C () ;

    senddata ( 0xa1 ) ;

    Rbuf = receivedata () ;

    ackI2C ( 1 ) ;

    stopI2C () ;

    return ( Rbuf )  ;

}

/*   write data */

void  Write ( unsigned char Wadd , unsigned char Wdata )

{
     startI2C () ;

     senddata ( 0xa0 ) ;

     senddata ( Wadd ) ;

     senddata ( Wdata ) ;

     stopI2C ()  ;

//     delay ( 5 )  ;

     return  ;

}

  /*   page read  */

void pageread ( unsigned char headadd , unsigned char *Rbuf )

{   unsigned char pagecount ;

    headadd = headadd/8*8;      // ayb_ice

    startI2C () ;

    if ( senddata ( 0xa0 ) == 0 )  return ;

    if ( senddata ( headadd ) == 0 )   return  ;

    startI2C () ;

    if ( senddata ( 0xa1 ) == 0 )  return  ;

    for ( pagecount = 0 ; pagecount < 8 ; pagecount ++ )

        {
           *Rbuf = receivedata () ;

            if(pagecount == 7){
                ackI2C ( 1 ) ;
            }else{
                ackI2C ( 0 ) ;
            }

           Rbuf ++  ;

        }

//    ackI2C ( 1 )  ;

    stopI2C () ;

    return  ;

}

   /*   page write  */

void pagewrite ( unsigned char headadd , unsigned char *Wbuf )

{   unsigned char pagecount ;

    headadd = headadd/8*8;      // ayb_ice

    startI2C () ;

    if ( senddata ( 0xa0 ) == 0 ) return  ;

    if ( senddata ( headadd ) == 0 ) return  ;

    for ( pagecount = 0 ; pagecount < 8 ; pagecount ++ )

        {  if ( senddata ( *Wbuf ) == 0 )

              {    someNOP()   ;

                   someNOP()   ;

               }

           Wbuf ++  ;

        }

    stopI2C () ;

    delay ( 10 ) ;

    return  ;

}

使用特权

评论回复
12
发霉的味道|  楼主 | 2007-3-23 09:28 | 只看该作者

云里雾里啊

 headadd = headadd/8*8;      // ayb_ice

大侠改的有点让我云里雾里的感觉,特别是这个语句

使用特权

评论回复
13
ayb_ice| | 2007-3-23 09:31 | 只看该作者

随便说说

  页的首地址不是哪个地址都可以的。。。

使用特权

评论回复
14
lucidmask| | 2007-3-23 09:35 | 只看该作者

re

再发第二个启动总线前,发一个高电平应答到总线

使用特权

评论回复
15
ayb_ice| | 2007-3-23 09:40 | 只看该作者

随便说说

  感觉LZ对IIC总线还理解不透彻,建议多看几遍2402的DATASHEET。。。

使用特权

评论回复
16
发霉的味道|  楼主 | 2007-3-23 09:47 | 只看该作者

啊!!

偶看过了啊,研究了好久,datasheet说是读时是可以一次读完全片的啊,页写就要注意页地址问题.所以就这么写了.

使用特权

评论回复
17
ayb_ice| | 2007-3-23 10:00 | 只看该作者

随便说说

  我现在用的MCU都是自带EEPROM的和IAP的很久没有用2402了,不然可以传一个给你,你说的一次可以读完是对的,另外要注意速度的问题...

使用特权

评论回复
18
发霉的味道|  楼主 | 2007-3-23 10:08 | 只看该作者

同事也有建议

同事建议用单字节读写算了,何必在上面花那么多时间呢,嘿嘿...但是偶不服气,既然让偶碰到了这个问题,不弄清楚偶怎么也不甘心!!

使用特权

评论回复
19
发霉的味道|  楼主 | 2007-3-23 10:20 | 只看该作者

大侠改的方法还是不行啊,结果是一样的.

使用特权

评论回复
20
发霉的味道|  楼主 | 2007-3-23 10:28 | 只看该作者

!

也想过用MCU内部的EEPROM,不过单字节擦除时很不好用啊.

使用特权

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

本版积分规则

7

主题

58

帖子

0

粉丝