24C64 EEPROM读写的C语言程序
2012-09-14
标签: I2C IIC 24C64


/*24C64子程序 */
bit I2C_Start(void);
void I2C_Stop(void);
void I2C_Ack(void);
void I2C_Nack(void);
bit I2C_Send_Byte( uchar);
uchar I2C_Receive_Byte(void);
void AT24C64_R(void *mcu_address, uint AT24C64_address, uint count);
void AT24C64_W(void *mcu_address, uint AT24C64_address, uint count);

void Delay_10_uS(void)
{
    char i = 10;
    while (i--);
}

void Delay_N_mS( uint n_milisecond) /* n mS delay */
{
    uchar i;
    while (n_milisecond--) {
        i = 37;
        while (i--);
    }
}

bit I2C_Start(void)
{
    Delay_10_uS();
    I2C_SDA = 1;
    Delay_10_uS();
    I2C_SCK = 1;
    Delay_10_uS();
    if ( I2C_SDA == 0) return 0;
    if ( I2C_SCK == 0) return 0;
    I2C_SDA = 0;
    Delay_10_uS();
    I2C_SCK = 0;
    Delay_10_uS();
    return 1;
}

void I2C_Stop(void)
{
    Delay_10_uS();
    I2C_SDA = 0;
    Delay_10_uS();
    I2C_SCK = 1;
    Delay_10_uS();
    I2C_SDA = 1;
    Delay_10_uS();
}

void I2C_Ack(void)
{
    Delay_10_uS();
    I2C_SDA = 0;
    Delay_10_uS();
    I2C_SCK = 1;
    Delay_10_uS();
    I2C_SCK = 0;
    Delay_10_uS();
}

void I2C_Nack(void)
{
    Delay_10_uS();
    I2C_SDA = 1;
    Delay_10_uS();
    I2C_SCK = 1;
    Delay_10_uS();
    I2C_SCK = 0;
    Delay_10_uS();
}

bit I2C_Send_Byte( uchar d)
{
    uchar i = 8;
    bit bit_ack;
    while ( i-- ) {
        Delay_10_uS();
        if ( d & 0x80 ) I2C_SDA = 1;
        else I2C_SDA = 0;
        Delay_10_uS();
        I2C_SCK = 1;
        Delay_10_uS();
        I2C_SCK = 0;
        d = d << 1;
    }
    Delay_10_uS();
    I2C_SDA = 1;
    Delay_10_uS();
    I2C_SCK = 1;
    Delay_10_uS();
    bit_ack = I2C_SDA;
    I2C_SCK = 0;
    Delay_10_uS();
    return bit_ack;
}

uchar I2C_Receive_Byte(void)
{
    uchar i = 8, d;
    Delay_10_uS();
    I2C_SDA = 1;
    while ( i--) {
        d = d << 1;
        Delay_10_uS();
        I2C_SCK = 1;
        if ( I2C_SDA ) d++;
        Delay_10_uS();
        I2C_SCK = 0;
    }
    return d;
}

void AT24C64_W(void *mcu_address, uint AT24C64_address, uint count)
{
    DOG_WDI = !DOG_WDI;
    DOGTIME = 0;
    while (count--) {
        I2C_Start();
        /*I2C_Send_Byte( 0xa0 + AT24C64_address /256 *2);*/ /* 24C16 USE */
        I2C_Send_Byte( 0xa0 );
        I2C_Send_Byte( AT24C64_address / 256 );
        I2C_Send_Byte( AT24C64_address % 256 );
        I2C_Send_Byte( *(uchar*)mcu_address );
        I2C_Stop();
        Delay_N_mS(10); /* waiting for write cycle to be completed */
        ((uchar*)mcu_address)++;
        AT24C64_address++;
    }
}

void AT24C64_R(void *mcu_address, uint AT24C64_address, uint count)
{
    DOG_WDI = !DOG_WDI;
    DOGTIME = 0;
    while (count--) {
        I2C_Start();
        /*I2C_Send_Byte( 0xa0 + AT24C64_address / 256 *2 );*/ /* 24C16 USE */
        I2C_Send_Byte( 0xa0 );
        I2C_Send_Byte( AT24C64_address / 256 );
        I2C_Send_Byte( AT24C64_address % 256 );
        I2C_Start();
        /*I2C_Send_Byte( 0xa1 + AT24C64_address /256 *2 );*/
        I2C_Send_Byte( 0xa1 );
        *(uchar*)mcu_address = I2C_Receive_Byte();
        I2C_Nack();
        I2C_Stop();
        ((uchar*)mcu_address)++;
        AT24C64_address++;
    }
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号