打印

24LC02的IIC问题求解

[复制链接]
1761|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiao20041128|  楼主 | 2012-8-30 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
iic, I2c, sd, AD, TE
使用下面的IIC程序调试24LC02时,写byte数据0-255,读出来只有128-255是对的,写0-127读出来都是127,到底哪里有问题?在线等高人帮看下!

使用的下面这两个函数:
unsigned char ReadByte( unsigned char addr )
void WriteByte( unsigned char addr, unsigned char data )


#define I2C_Speed              200
#define I2C1_SLAVE_ADDRESS7    0xA0
#define I2C_PageSize           256

                        
#define SCL_H    PT01AD0_PT1AD03    = 1
#define SCL_L    PT01AD0_PT1AD03    = 0
#define SCL_OUT         DDR01AD0_DDR0AD03  = 1       
   
#define SDA_H    PTP_PTP3   = 1
#define SDA_L           PTP_PTP3   = 0

#define SDA_OUT         DDRP_DDRP3 = 1
#define SDA_IN         DDRP_DDRP3 = 0
#define SDA_read PTP_PTP3


unsigned char TestA=0;

/************************************************************************
函数原型:          void I2C_delay(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC延时函数
************************************************************************/
void I2C_delay( void )
{        
           unsigned int i = I2C_Speed;        
           while( i )
           {
                i--;
           }
}

/************************************************************************
函数原型:          unsigned char I2C_Start(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC启动
************************************************************************/
void I2C_Start( void )
{
       
        SCL_OUT;                               
        SDA_OUT;
       
        SDA_H;
        SCL_H;
        I2C_delay();         
        SDA_L;
        I2C_delay();
        SCL_L;
        I2C_delay();
}

/************************************************************************
函数原型:          void I2C_Stop(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC停止
************************************************************************/
void I2C_Stop( void )
{
        SCL_OUT;                               
        SDA_OUT;
       
        SCL_L;
        I2C_delay();
        SDA_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SDA_H;
        I2C_delay();
}

/************************************************************************
函数原型:          void I2C_Ack(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC应答
************************************************************************/
void I2C_Ack( void )
{        
        SCL_OUT;                               
        SDA_OUT;
       
        SCL_L;
        I2C_delay();
        SDA_L;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SCL_L;
        I2C_delay();
    SDA_IN;       
}

/************************************************************************
函数原型:          void I2C_NoAck(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC不应答
************************************************************************/
void I2C_NoAck( void )
{        
        SCL_OUT;                               
        SDA_OUT;
       
        SCL_L;
        I2C_delay();
        SDA_H;
        I2C_delay();
        SCL_H;
        I2C_delay();
        SCL_L;
        I2C_delay();
}

/************************************************************************
函数原型:          void I2C_WaitAck(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC等待应答
************************************************************************/
unsigned char I2C_WaitAck( void )          //返回为:=1有ACK,=0无ACK
{
        SCL_OUT;                               
/*        SDA_OUT;
       
        SCL_L;
        I2C_delay();
        SDA_H;                        
        I2C_delay();
                        */
        SDA_IN;
        SCL_H;
       
        I2C_delay();         
        if(SDA_read)
        {
                SCL_L;
                return FALSE;
        }
        SCL_L;

        return TRUE;
}

/************************************************************************
函数原型:          void I2C_SendByte(unsigned char SendByte)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC写一个byte CR
************************************************************************/
void I2C_SendByte( unsigned char SendByte )  
{
        unsigned char i=8;       
       
        SCL_OUT;                               
        SDA_OUT;
   
                       
        while(i--)
        {
               
                SCL_L;
                I2C_delay();
                if(SendByte&0x80)
                        SDA_H;  
                else
                        SDA_L;   
                SendByte<<=1;
                I2C_delay();
                SCL_H;
                I2C_delay();
        }
        SCL_L;
}          

/************************************************************************
函数原型:          unsigned char I2C_ReceiveByte(void)
参数说明:          无
返回值:            无                                                                                 
功能说明:   IIC读一个byte CR
************************************************************************/
unsigned char I2C_ReceiveByte( void )  
{
        unsigned char i=8;
        unsigned char ReceiveByte=0;
       
        SCL_OUT;                               
        SDA_OUT;
                           
        while(i--)
        {
                ReceiveByte<<=1;      
                SCL_L;
                I2C_delay();
                SCL_H;
                I2C_delay();  
                SDA_IN;      
                if(SDA_read)
                {
                        ReceiveByte|=0x01;
                }
        }
        SCL_L;
        return ReceiveByte;
}


void WriteByte( unsigned char addr, unsigned char data )
{
    I2C_Start();         
    I2C_SendByte(I2C1_SLAVE_ADDRESS7);        
    TestA = I2C_WaitAck();
    I2C_SendByte(addr);        
    TestA = I2C_WaitAck();
    I2C_SendByte(data);
    TestA = I2C_WaitAck();
    I2C_Stop();
}

unsigned char ReadByte( unsigned char addr )
{
    unsigned char data;
         
    I2C_Start();         
    I2C_SendByte(I2C1_SLAVE_ADDRESS7);        
    TestA = I2C_WaitAck();
    I2C_SendByte(addr);        
    TestA = I2C_WaitAck();
   
    I2C_Start();
    I2C_SendByte(I2C1_SLAVE_ADDRESS7|0x01);
    TestA = I2C_WaitAck();
   
    data = I2C_ReceiveByte( );
  //  I2C_NoAck( );
    I2C_Stop();
   
    return data;
}

相关帖子

沙发
airwill| | 2012-8-30 19:07 | 只看该作者
会不会是芯片的问题, 买到的不良品?

使用特权

评论回复
板凳
yewuyi| | 2012-8-31 09:01 | 只看该作者
会不会是芯片的问题, 买到的不良品?
airwill 发表于 2012-8-30 19:07



这么多连续字节出现同一个错误的可能性实在是太低太低了。

要想验证是不是不良芯片造成的很简单啊,另外找几个厂家的EEPROM装上去就是了。

使用特权

评论回复
地板
xiao20041128|  楼主 | 2012-9-7 11:21 | 只看该作者
存储时间问题,晕死
加长一点点就好了

使用特权

评论回复
5
tyw| | 2012-9-7 11:42 | 只看该作者
一般5ms,差点的10ms

使用特权

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

本版积分规则

21

主题

69

帖子

0

粉丝