yaoyao1314的个人空间 https://passport2.21ic.com/?930348 [收藏] [复制] [RSS]

日志

IIC和EEPROM介绍

已有 633 次阅读2013-4-6 05:13 |个人分类:51学习笔记|系统分类:兴趣爱好

1  常见存储器件介绍

  铁电 EEPROW   FLASH

共同特点 掉电后数据不丢失

各自特点

铁电 理论上可以无次擦写,操作简单,但是容量小

EEPROM 擦写次数在30W---100W,操作简单,容量中等。

FLASH 擦写次数10W---100W   操作复杂,如果要改变一个字节就得改变整个扇区,容量大

 

总线  以P0口为例   P0口----P7口合并为一个口则P0口就可以叫总线口

IIC总线就是 数据线和时钟线够成的串行总线,可以收发数据。主要用于连接外围存储器

IIC总线有三种类型的信号 开始信号,结束信号,应答信号

 

IIC 优点

  1 接口直接接在组件之上,IIC总线占用空间非常小

  2  支持多主机其中任何能够发送和接收的设备都可以成为主机,主控可以控制信号的传输和时钟频率。在任何一个时间点上只能有一个主机。

 3  连接在IIC总线上的每个电路和模块都有唯一的地址。以唯一地址进行通信。

 

电路图介绍


IIC起始和终止信号

SCL为高电平期间SDL由高电平转为低电平为起始信号

SCL为高电平期间SDL由低电平转为高电平为终止信号


 

SCL为高电平期间SDL数据必须保持稳定,只有SCL为低电平期间SDL才允许改变


 

I2C起始信号编码

void I2CSTART(void)

(  SDA = 1;

  DELAY();

 SCL = 1;

  DELAY();

   SDA = 0;

DELAY();

  SCL = 0;

);

 

I2C终止信号编码

void I2CSTOP(void)

{

   SCL = 0;

   DELAY();

   SDA = 0;

   DELAY();

   SCL = 1;

   DELAY();

   SDA = 1;

   DELAY();

}

 

I2C数据读写与应答

  I2C先传高位后传低位

  主机写数据时候  每发送一个字节,接收机需要应答一个 0 通过应答来判断从机是否接收成功

   主机读数据时 接收一个字节后,主机也需要发送一个 0 接收到最后一个字节时需要发非应答位1  发1 完成后在发送一个停止信号最终通信结束。

 

I2C写数据流程

首先  I2C起始信号,然后发送首字节,即器件地址(EEPROM地址)

 2  发送存储地址 (在器件中的存储地址)

3  发送数据

  写数据过程中等待应答

 

void write_eeprom(unsigned char addr, unsigend char databyte)

{

   I2CSTART();

   I2CSEND(0xa0);

   I2CSEND(ADDR);

   I2CSEND(DATABYTE);

   I2CSTOP();

}

void I2CSEND(unsigned char byte)

{

   unsigned char mask,i;

   mask = 0x80;

   for(i = 0;i < 8;i++)

   {

     SCL = 0;

     DELAY();

      if((mask & byte) == 0)

        SDA = 0;

      ELSE

        SD = 1;

      MASK >>= 1;

      DELAY();

      SCL = 1;

      DELAY();

   }

    SCL = 0;

     SDA = 1;

    DELAY();

    SCL = 1;

     DELAY();

      SCL = 0;

}

 

I2Cd读数据流程

首先I2C起始信号,然后发送首字节,即器件(EEPROM)地址。并且在读写方向位上选择“写操作”方向。
       第二个字节,发送数据的存储地址,就是要读取的数据所存储在EEPROM中的位置。
        第三个字节,重新发送I2C起始信号和器件地址,并且在方向位上选择“读操作”方向。
       在前三个字节操作过程,都要等待器件给与回应一个“应答位0”
       第四个字节,接收从器件发回的首字节后,单片机要主动返回一个“(非)应答位0”

特别注意:
   接收器件返回数据的中间字节,主机主动返回“应答位0”,但最后一个字节,主机要返回一个“非应答位1”,以此通知从机读取数据结束,发送停位。

unsigned char read_eeprom(unsigned char addr)
{
 unsigned char databyte,databyte2;

 I2CStart();
 I2CSend(0xa0);
 I2CSend(addr);
 I2CStart();
 I2CSend(0xa1);
 databyte = I2CRead();
 I2CStop();
 return databyte; 
}

unsigned char I2CRead(void)
{
 unsigned char byte, i;
 byte = 0;
 for(i = 0; i < 8; i++)
 {
  SCL = 0;
  SDA = 1;
  Delay();
  SCL = 1;
  Delay();
  byte <<= 1; 
  if(SDA == 1) {byte |= 0x01;  }  
    Delay();
 }
 SCL = 0;
 SDA = 1;
 Delay();
 SCL = 1;
 Delay();
 SCL = 0;
 return byte;
}

 

路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)