打印

读写24C256程序有毛病,找到位置了,就是不知道怎么解决

[复制链接]
3161|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
woshidasha|  楼主 | 2010-3-9 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的主函数就是往eeprom,得0x0100地址写入0x55;
之后再读出来,运行到我做标记的地方,就返回了错误,并且是“地址写失败”错误
可以在最上面的“容错处理函数”中找到



/**********************************************
*   函数名称:容错处理函数                    *
*   时间:2008年01月23号                      *
*   入口参数:type->错误类型码                *
*   出口参数:无                              *
***********************************************/
void error(unsigned char type)
{
switch (type & 0xF8)
        {
  case 0x20:     /*址址写失败*/
   TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
   break;
  case 0x30:     /*数据写失败*/
   TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
   break;
  case 0x38:     /*仲裁失败*/
   break;
  case 0x48:     /*址址读失败*/
   TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
   break;
  }
}
/**********************************************
*   函数名称:I2C总线单字节写入函数           *
*   入口参数:addr->写入地址,data->数据      *
*   出口参数:无                              *
***********************************************/

/*unsigned char*/
unsignet char twi_write(unsigned int addr, unsigned char data)
{
unsigned char addr_low;
addr_low=addr;
/*设置波特率*/
TWBR = 30;//15;               
/*发出START信号*/
TWCR = (1 << TWINT) |(1 << TWSTA) | (1 << TWEN);
/*等待TWINT置位,TWINT置位表示START信号已发出*/
while (!(TWCR & (1 << TWINT)));
/*检验TWI状态寄存器,屏蔽预分频位*/
if ((TWSR & 0xF8) != 0x08)
     {
      error(TWSR);
      return 0;
     }
/*SLA_W 芯片地址*/


TWDR = 0xA0|0x02;
//TWDR = 0xA8;

/*TWINT位清零,启动发送地址*/
TWCR = (1 << TWINT) | (1 << TWEN);
/*等待TWINT置位,TWINT置位表示总线命令SLA+W已发出*/
while (!(TWCR & (1 << TWINT)));
/*检验TWI状态寄存器,屏蔽预分频位*/
if ((TWSR & 0xF8) != 0x18)
     {
      error(TWSR);
      return 0;
     }
/*addr 操作地址的高8位*/
TWDR = addr>>8;
/*TWINT位清零,启动发送数据*/
TWCR = (1 << TWINT) | (1 << TWEN);
/*等待TWINT置位,TWINT置位表示总线数据已发送*/
while (!(TWCR & (1 << TWINT)));
/*检验TWI状态寄存器,屏蔽预分频位*/
if ((TWSR & 0xF8) != 0x28)
     {
      error(TWSR);
      return 0;
     }
/*addr 操作地址的低8位*/
TWDR = addr_low;
/*TWINT位清零,启动发送数据*/
TWCR = (1 << TWINT) | (1 << TWEN);
/*等待TWINT置位,TWINT置位表示总线数据已发送*/
while (!(TWCR & (1 << TWINT)));
/*检验TWI状态寄存器,屏蔽预分频位*/
if ((TWSR & 0xF8) != 0x28)
     {
      error(TWSR);
      return 0;
     }
/*data 写入数据*/
TWDR = data;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x28)
     {
      error(TWSR);
      return 0;   
     }
/*发出STOP信号*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
//return 1;
}
/**********************************************
*   函数名称:I2C总线单字节读取函数           *
*   时间:2008年01月23号                      *
*   入口参数:addr->读取地址,data->数据指针  *     
*   出口参数:无                              *
***********************************************/
unsigned char twi_read(unsigned int addr)
{
unsigned char addr_low,rdata;
addr_low=addr;
/*设置波特率*/
TWBR = 30;//15;


/*发出START信号*/
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
     {
      error(TWSR);
      return 0;
     }


/****************************************************/
/****************************************************/
/****************************************************/
/****************************************************/  
/***************运行到这里***********************/


/*SLA_W 芯片地址*/
TWDR = 0xA0|0x02;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));

if ((TWSR & 0xF8) != 0x18)
     {
      error(TWSR);
      return 0;
     }
  
  

/****************************************************/
/****************************************************/
/****************************************************/
/****************************************************/

/*addr 操作地址的高8位*/
TWDR = addr>>8;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x28)
     {
      error(TWSR);
      return 0;
     }
/*addr 操作地址的低8位*/
TWDR = addr_low;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));



/*if ((TWSR & 0xF8) != 0x28)
     {
      //error(TWSR);
      //return 0;
   page[0][0]=1;
   page[0][1]=0;
     }*/
  
/*start 启动*/
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x10)
        {
        // error(TWSR);
         //return 0;
      page[0][0]=1;
      page[0][1]=1;   
        }
/*SLA_R 芯片地址*/


TWDR = 0xA1|0x02;
//TWDR = 0xA9;

TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
/*if ((TWSR & 0xF8) != 0x40)
     {
      //error(TWSR);
      //return 0;
   page[0][0]=1;
   page[0][1]=2;   
     }*/
/*读取数据*/
TWCR = (1 << TWINT) | (1 << TWEN);


/******************************************/
//page[0][0]=0;
//page[0][1]=1;
while (!(TWCR & (1 << TWINT)));
/*if ((TWSR & 0xF8) != 0x58)
        {
         error(TWSR);
         return 0;
        }*/
rdata = TWDR;
/*发出STOP信号*/
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
//return 1;
return rdata;
}

相关帖子

沙发
chen3bing| | 2010-3-9 12:29 | 只看该作者
时序有问题,好好看看数据手册。

使用特权

评论回复
板凳
woshidasha|  楼主 | 2010-3-9 12:37 | 只看该作者
那里时序有问题???

能指出来吗????

我看不出来。

谢谢

使用特权

评论回复
地板
woshidasha|  楼主 | 2010-3-9 12:48 | 只看该作者
就是这张图,不就是读它的时序吗

未命名.rar

11.52 KB

使用特权

评论回复
5
chen3bing| | 2010-3-9 13:26 | 只看该作者
每一步的操作时间都符合要求吗?

使用特权

评论回复
6
chen3bing| | 2010-3-9 13:26 | 只看该作者
你的晶振是多少赫兹的?

使用特权

评论回复
7
woshidasha|  楼主 | 2010-3-9 13:34 | 只看该作者
终于发现我的毛病出在哪里了!!!!!!!!!

虽然大家,没给出正确意见,但是,还是非常感谢大家的热心帮助。

现在,我就把问题说明一下

我的主函数是初始化完成之后,调用写rom函数。

写完之后,我马上就调用读取函数,但是eeprom的擦写是要时间的,大约2mS,因此,会出现错误,

为了避免这种错误,我在TWI_write后面增加一个延时函数,之后,就没有问题了,经调试,大约需要2~3mS,为了确保安全,我延时5mS。

最后,再次感谢大家。

使用特权

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

本版积分规则

55

主题

244

帖子

3

粉丝