打印

关于AT24C16数据丢失的问题

[复制链接]
2831|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
westvest|  楼主 | 2008-2-27 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机采用MSP430,以前的芯片读写正常,掉电后数据都在,但后来买入的很多芯片掉电数据就丢失了,只有很少部分是正常的,请问这是什么问题,咨询过厂商,他说应该不是芯片的问题,下面是我的代码,请高人指点
/************************I2C bus  interface with EEPROM***************************/
void startI2C(void)
{
P3DIR|=BIT7;
P3OUT|=BIT7+BIT6;
_NOP();
_NOP();
_NOP();
_NOP();
P3OUT&=~BIT7;
_NOP();
_NOP();
_NOP();
_NOP();
P3OUT&=~BIT6;
}

void stopI2C(void)
{
P3DIR|=BIT7;//SDA
P3OUT&=~(BIT7+BIT6);
_NOP();
_NOP();
_NOP();
_NOP();
P3OUT|=BIT6;//SCL
_NOP();
_NOP();
_NOP();
_NOP();
P3OUT|=BIT7;
}

void  WBYTE_I2C(uchar W_Byte)
{
       uchar i;
    P3DIR|=BIT7;  
    for(i=0; i<8; i++)
        {
               P3OUT&=~BIT7;
            if(W_Byte & 0x80)
                P3OUT|=BIT7;
            P3OUT|=BIT6;
                     delay(10);
            P3OUT&=~BIT6;
            W_Byte <<= 1;
        }
    P3DIR&=~BIT7;
    P3OUT|=BIT6;
       delay(10);
    P3OUT&=~BIT6;
    delay(10);
}


uchar  RBYTE_I2C(void)
{     
       uchar i;
       uchar R_Byte;
       uchar TmpByte;
    P3DIR&=~BIT7;
    P3OUT&=~BIT6;
    for(i = 0; i < 8; i++)
        {
            P3OUT|=BIT6;
            _NOP();
            _NOP();
            _NOP();
            _NOP();
            if((P3IN&BIT7)==BIT7)
                TmpByte =0x01 ;
            else
                TmpByte =0;
            P3OUT&=~BIT6;
            R_Byte <<= 1;
            R_Byte |= TmpByte; 
        }
    return(R_Byte);
           
}

uchar  I2C_rduchar(uchar page, uchar addr)
{
      uchar uctemp;
      page=((page&0x03)<<1)+0xa0;
      startI2C();
      WBYTE_I2C(page);
      WBYTE_I2C(addr);
      page|=BIT0;
    startI2C();
    WBYTE_I2C(page);
    uctemp=RBYTE_I2C();
    stopI2C();
    return(uctemp);
}

void  I2C_wruchar(uchar page, uchar addr, uchar W_Byte)
{
      page=((page&0x03)<<1)+0xa0;
    startI2C();
    WBYTE_I2C(page);
    WBYTE_I2C(addr);
    WBYTE_I2C(W_Byte);
    stopI2C();
}

void I2C_rdulong(uchar page, uchar addr)
{
       uchar *Ptemp;
  
       Ptemp=(uchar *)&I2C_rdtemp;/*?*/
    *Ptemp++=I2C_rduchar(page, addr);
    *Ptemp++=I2C_rduchar(page, addr+1);
    *Ptemp++=I2C_rduchar(page, addr+2);
    *Ptemp=I2C_rduchar(page, addr+3);
   
}

void I2C_wrulong(uchar page, uchar addr)
{
       uchar *Ptemp;
    Ptemp=(uchar *)&I2C_wrtemp;
    I2C_wruchar(page, addr, *Ptemp++);
    delay(2000);
    I2C_wruchar(page, addr+1, *Ptemp++);
    delay(2000);
    I2C_wruchar(page, addr+2, *Ptemp++);
    delay(2000);
    I2C_wruchar(page, addr+3, *Ptemp);
    delay(2000);
   
}

相关帖子

沙发
ljh2269| | 2008-2-27 10:00 | 只看该作者

应该在外围电路上

可以提高一下抗干扰能力

使用特权

评论回复
板凳
ayb_ice| | 2008-2-27 13:50 | 只看该作者

我也认为不是芯片的问题

使用特权

评论回复
地板
dai_weis| | 2008-2-27 21:11 | 只看该作者

你的WP怎么处理的?

上电和掉电过程中要保证WP引脚的电平要确定为禁止写

使用特权

评论回复
5
westvest|  楼主 | 2008-2-28 09:42 | 只看该作者

WP是接地的

WP是接地的啊,奇怪的是有少数芯片可以正常使用的,掉电后数据还在,以前买的芯片没问题的,后来买的就有这个问题,一千片里有很少一部分可以用,外围电路方面VDD与SCL和SDA之间分别有个10K的电阻,A0,A1,A2,WP.GND接地

使用特权

评论回复
6
ayb_ice| | 2008-2-28 09:50 | 只看该作者

有些芯片没有禁止写引脚

都没有问题,所以与WP应该没有关系...

使用特权

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

本版积分规则

8

主题

18

帖子

0

粉丝