我的主函数就是往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;
} |