MINI 板子 iic 使用24C256的一个 bug

2019-08-18 18:53发布

由于要使用24wc256 将原来板子上的02 更换为256
1.修改24cxx.h文件下的      #define EE_TYPE AT24C256
2.修改24cxx.c 文件下的     u8 AT24CXX_Check(void)
[mw_shl_code=applescript,true]u8 AT24CXX_Check(void)
{
        u8 temp;
        temp=AT24CXX_ReadOneByte(32767);//                          
        if(temp==0X55)return 0;                  
        else
        {
                AT24CXX_WriteOneByte(32767,0X55);
            temp=AT24CXX_ReadOneByte(32767);          
                if(temp==0X55)return 0;
        }
        return 1;                                                                                          
}[/mw_shl_code]
测试出现乱码
开机 单独读一个字节时 正确 再读错误为255
此时bug出现   2.3  和3.0 的例程里面均有该bug
下面为3.0例程的 源程序
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                  
    u8 temp=0;                                                                                   
    IIC_Start();  
    if(EE_TYPE>AT24C16)
    {
        IIC_Send_Byte(0XA0);       //·¢ËÍдÃüÁî
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr>>8);//·¢Ë͸ߵØÖ·
        IIC_Wait_Ack();        
    }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));     

    IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);  
    IIC_Wait_Ack();        
    IIC_Start();              
    IIC_Send_Byte(0XA1);           //&#189;&#248;&#200;&#235;&#189;&#211;&#202;&#213;&#196;&#163;&#202;&#189;               
    IIC_Wait_Ack();     
    temp=IIC_Read_Byte(0);           
    IIC_Stop();//&#178;ú&#201;ú&#210;&#187;&#184;&#246;&#205;&#163;&#214;&#185;&#204;&#245;&#188;&#254;        
    return temp;
}

eeprom大于 16时就会使用高低地址  源程序出错在使用了两次等待应答   将上面的应答屏蔽即可 如下
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                  
    u8 temp=0;                                                                                   
    IIC_Start();  
    if(EE_TYPE>AT24C16)
    {
        IIC_Send_Byte(0XA0);       //·&#162;&#203;&#205;&#208;&#180;&#195;ü&#193;&#238;
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr>>8);//·&#162;&#203;&#205;&#184;&#223;&#181;&#216;&#214;·
//        IIC_Wait_Ack();           屏蔽或者删除即可
    }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //·&#162;&#203;&#205;&#198;÷&#188;&#254;&#181;&#216;&#214;·0XA0,&#208;&#180;&#202;&#253;&#190;&#221;      

    IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //·&#162;&#203;&#205;&#181;&#205;&#181;&#216;&#214;·
    IIC_Wait_Ack();        
    IIC_Start();              
    IIC_Send_Byte(0XA1);           //&#189;&#248;&#200;&#235;&#189;&#211;&#202;&#213;&#196;&#163;&#202;&#189;               
    IIC_Wait_Ack();     
    temp=IIC_Read_Byte(0);           
    IIC_Stop();//&#178;ú&#201;ú&#210;&#187;&#184;&#246;&#205;&#163;&#214;&#185;&#204;&#245;&#188;&#254;        
    return temp;
}


再次测试问题解决
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。