瑞萨单片机写EEPROM问题

[复制链接]
 楼主| weiwanli 发表于 2015-1-5 16:09 | 显示全部楼层 |阅读模式
单片机写24LC256,如想在地址0x300写入0x01,在地址0x301写入0x28。当调用IIC的读函数时,0x01可以读出来,0x28没有读出来。小弟认为IIC的读函数没有问题,写函数有问题,查了半天,没搞明白哪地方出错了,来论坛发帖求救
 楼主| weiwanli 发表于 2015-1-5 16:09 | 显示全部楼层
void IIC_Start(void)
{
        SDA_Output();
        SDA=1;
        NOP();
        SCL=1;
        NOP();
        SDA=0;
        NOP();
}
/***************停止信号**************/
void IIC_Stop(void)
{
        SDA_Output();
        SDA=0;
        NOP();
        SCL=1;
        NOP();
        SDA=1;
        NOP();
}
/***********等待应答信号***********/
void IIC_Responsion(void)
{
        unsigned char i;
        SDA_Input();
        SCL=1;
        NOP();
       
        while((SDA==1)&&(i<250))i++;
        SCL=0;
        NOP();
}
/************写一个字节************/
void IIC_Write_byte(unsigned char date)
{
        unsigned char i,temp;
        SDA_Output();
        temp=date;
        for(i=0;i<8;i++)
        {
                  SCL=0;
                NOP();
                if(temp&0x80)
                {
                        SDA = 1;
                }
                else
                {
                        SDA        = 0;
                }       
                temp=temp<<1;
                NOP();
                  SCL=1;
                NOP();       
        }
        SCL=0;
        NOP();
        SDA=1;
        NOP();
}
/************读一个字节************/
unsigned char IIC_Read_byte(void)
{
        unsigned char i,temp;
       
        SDA=1;
        SDA_Input();
        delay_ms(2);
        NOP();
        for(i=0;i<8;i++)
        {
                  SCL=0;
                NOP();NOP();NOP();
                temp=(temp<<1)|SDA;
                SCL=1;
                NOP();NOP();NOP();
        }
        SCL=0;
        NOP();
        return temp;
}
/*********对任意地址写数据*********/
void IIC_Write_add(unsigned int address,unsigned char date)
{
       
        IIC_Start();
        IIC_Write_byte(Device_Adress);
        IIC_Responsion();
        IIC_Write_byte((address>>8)&0xff);
        IIC_Responsion();
        IIC_Write_byte( address&0xff);
        IIC_Responsion();
        IIC_Write_byte(date);
        IIC_Responsion();  
        IIC_Stop();
}
/*********对任意地址读数据*********/
unsigned char IIC_Read_add(unsigned int address)
{
        unsigned char date;
        // In_Put Mode
        IIC_Start();
        IIC_Write_byte(Device_Adress);
        IIC_Responsion();
        IIC_Write_byte((address>>8)&0xff);
        IIC_Responsion();
        IIC_Write_byte( address&0xff);
        IIC_Responsion();
        IIC_Start();
        IIC_Write_byte(Device_Adress|Read_Single);
        IIC_Responsion();
        date=IIC_Read_byte();
        IIC_Stop();
        return date;
}
 楼主| weiwanli 发表于 2015-1-5 16:12 | 显示全部楼层
        IIC_Write_add(0x300,0x01);
        NOP();
        IIC_Write_add(0x301,0x28);
        NOP();


这就是写数据的代码,难道中间的延时太少了??
JY-DX-JY 发表于 2015-1-5 16:28 | 显示全部楼层
加长延时。
wyq165 发表于 2015-1-5 16:31 | 显示全部楼层
weiwanli 发表于 2015-1-5 16:12
IIC_Write_add(0x300,0x01);
        NOP();
        IIC_Write_add(0x301,0x28);

两次擦除写之间需要延时的,因为你发过去的数据,EE需要擦除。特别是连续写和页写

评分

参与人数 1威望 +1 收起 理由
weiwanli + 1 解释的很详细,感谢!

查看全部评分

ayb_ice 发表于 2015-1-5 17:03 | 显示全部楼层
写需要时间,一般在5~20MS,看手册
 楼主| weiwanli 发表于 2015-1-8 11:09 | 显示全部楼层
灰常感谢,看了下手册,按页或者字节连续写的最大延时为5ms。我再试试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

31

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

31

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部