⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.c

📁 STC51系列的源码
💻 C
字号:
/********************************************************************************/
/* filename : EEPROM.c                                                          */
/* created  : xillinx                                                           */
/* descript : 处理EEPROM相关的函数                                              */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../EEPROM/EEPROM.h"

/********************************************************************************/
/* funname : IIC_delay()                                                        */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 简单的时间延时                                                     */
/********************************************************************************/
void IIC_delay_max(void)
{   _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
void IIC_delay_min(void)
{   _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

void IIC_delay_ms(unsigned int time)
{   unsigned int i,j;
    for(i=time;i>0;i--)
    {   for(j=0;j<0x1000;j++)
        {   ;
        }
    }
}

/********************************************************************************/
/* funname : I2C_initialize()                                                   */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 时钟信号和数据信号都释放变成高电平,注意先释放时钟,后释放数据更好   */
/********************************************************************************/
void I2C_initialize(void)
{   I2C_SCLK_PIN=0x0;
    IIC_delay_min();
    I2C_DATA_PIN=0x1;
    IIC_delay_min();
    I2C_SCLK_PIN=0x1;
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_start()                                                        */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 必须从空闲状态下,保持时钟信号为高电平,拉低数据信号                 */
/********************************************************************************/
void I2C_start(void)
{   I2C_DATA_PIN=0x0;  //* 启动信号
    IIC_delay_min();
    I2C_SCLK_PIN=0x0;  //* 准备发送数据
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_stop()                                                         */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 保持时钟信号为高电平,释放数据信号为高电平                          */
/********************************************************************************/
void I2C_stop(void)
{   I2C_SCLK_PIN=0x1;
    IIC_delay_min();
    I2C_DATA_PIN=0x1;
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_go_hi()                                                        */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 在时钟为低时把数据置为高,然后把时钟置为高                          */
/********************************************************************************/
void I2C_go_hi(void)
{   I2C_DATA_PIN=0x1;
    IIC_delay_min();
    I2C_SCLK_PIN=0x1;
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_send_bit()                                                     */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 发送一位数据给IIC器件                                              */
/********************************************************************************/
void I2C_send_bit(unsigned char mbit)
{   I2C_DATA_PIN=mbit;
    IIC_delay_min();
    I2C_SCLK_PIN=0x1;
    IIC_delay_max();
    I2C_SCLK_PIN=0x0;
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_send_8_bits()                                                  */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: 发送一位数据给IIC器件,结束之后,数据线由mdata的最后一位决定,时钟    */
/*           线输出低电平                                                       */
/********************************************************************************/
void I2C_send_8_bits(unsigned char mdata)
{   unsigned char i;
    for(i=0x0;i<0x8;i++)
    {   if(mdata&0x80)
        {  I2C_send_bit(0x1);
        }
        else
        {  I2C_send_bit(0x0);
        }
        mdata<<=0x1;
    }
    I2C_DATA_PIN=0x0;
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_read_ack()                                                     */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之  */
/* 后,在时钟的第9个脉冲期间释放数据总线, 由接收器发送一个ACK(把数据总线的电平   */
/* 拉低)来表示数据成功接收。                                                    */
/********************************************************************************/
unsigned char I2C_read_ack(void)
{   unsigned char num=0xFF;
    I2C_DATA_PIN=0x1;  //* 需要释放数据线
    IIC_delay_min();
    I2C_SCLK_PIN=0x1;  //* 读取ACK的时钟信号
    while(I2C_DATA_PIN==0x1)
    {   num--;
        if(num==0x0)
        {  break;
        }
    }
    I2C_SCLK_PIN=0x0;
    IIC_delay_min();
    I2C_DATA_PIN=0x0;
    IIC_delay_min();
    if(num==0x0)
    {  return 0x0;
    }
    else
    {  return 0x1;
    }
}

/********************************************************************************/
/* funname : I2C_send_ack()                                                     */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线接收数据时发送ACK                                           */
/********************************************************************************/
void I2C_send_ack(void)
{   I2C_DATA_PIN=0x0;
    IIC_delay_min();
    I2C_SCLK_PIN=0x1;
    IIC_delay_max();
    I2C_SCLK_PIN=0x0;
    IIC_delay_min();
}

/********************************************************************************/
/* funname : I2C_send_nack()                                                    */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线接收数据时发送NACK                                          */
/********************************************************************************/
void I2C_send_nack(void)
{   I2C_DATA_PIN=0x1;
    IIC_delay_min();
    I2C_SCLK_PIN=0x1;
    IIC_delay_max();
    I2C_SCLK_PIN=0x0;
    IIC_delay_min();
    I2C_DATA_PIN=0x0;
    IIC_delay_min();
}



/********************************************************************************/
/* funname : I2C_send_1_byte()                                                  */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线发送1字节数据                                               */
/********************************************************************************/
unsigned char I2C_send_1_byte(unsigned char mdata)
{   unsigned char status;
    I2C_start();
    I2C_send_8_bits(mdata);
    status=I2C_read_ack();
    I2C_stop();
    return status;
}
/********************************************************************************/
/* funname : I2C_recv_bit()                                                     */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线接收1位数据                                                 */
/********************************************************************************/
unsigned char I2C_recv_bit(void)
{   unsigned char mbit;
    I2C_SCLK_PIN=0x1;  //* 准备读取数据
    IIC_delay_min();
    mbit=I2C_DATA_PIN;
    IIC_delay_min();
    I2C_SCLK_PIN=0x0;  //* 贮备下一个读取数据
    IIC_delay_max();
    return mbit;
}

/********************************************************************************/
/* funname : I2C_recv_8_bits()                                                  */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线接收8位数据                                                 */
/********************************************************************************/
unsigned char I2C_recv_8_bits(void)
{   unsigned char i,mdata=0x0;
    I2C_DATA_PIN=0x1;
    for(i=0x0;i<0x8;i++)
    {   mdata<<=0x1;
        mdata|=I2C_recv_bit();
    }
    I2C_DATA_PIN=0x0;
    IIC_delay_min();
    return mdata;
}

/********************************************************************************/
/* funname : AT24C16_write()                                                    */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线写入数据                                                    */
/*           设备地址字节                                                       */
/*         | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |            */
/*         |   1  |   0  |   1  |   0  |  A10 |  A9  |  A8  |  R/W  |            */
/********************************************************************************/
unsigned char AT24C16_write(unsigned char page, unsigned char address, unsigned char * buffer ,unsigned char length)
{   unsigned char i;
    I2C_start();
    I2C_send_8_bits(AT24C16_WR_CMD|(page<<0x1));
    I2C_read_ack();
    I2C_send_8_bits(address);
    I2C_read_ack();
    for(i=0x0;i<length;i++)
    {   I2C_send_8_bits(buffer[i]);
        I2C_read_ack();
    }
    I2C_stop(); 
    IIC_delay_ms(10);
    return 0x1;
} 
/********************************************************************************/
/* funname : AT24C16_read()                                                     */
/* created : xillinx                                                            */
/* time    : 2008-08-06                                                         */
/* descript: I2C总线写入数据                                                    */
/********************************************************************************/
unsigned char AT24C16_read(unsigned char page, unsigned char address, unsigned char * buffer ,unsigned char length)
{   unsigned char addr_hi;
    unsigned char i;
    addr_hi=(address>>0x8)&0xFF;
    I2C_start();
    I2C_send_8_bits(AT24C16_WR_CMD|(page<<0x1));
    I2C_read_ack(); 
    I2C_send_8_bits(address);
    I2C_read_ack(); //* 这时的时钟为低电平
    I2C_go_hi();
    I2C_start();
    I2C_send_8_bits(AT24C16_RD_CMD|(page<<0x1));
    I2C_read_ack(); 
    for(i=0x0;i<length-0x1;i++)
    {   buffer[i]=I2C_recv_8_bits();
        I2C_send_ack();
    }
    buffer[i]=I2C_recv_8_bits();
    I2C_send_nack();
    I2C_stop();
    IIC_delay_ms(10);
    return 0x1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -