原创 第三十二课 串行E2PROM之24C02

2009-6-6 18:41 5239 7 7 分类: MCU/ 嵌入式

第三十二课 串行E2PROM之24C02


开发板上带的是24C08(8K,内部含有1024 个8 位字节),和24C02(2K,内部含有256 个8 位字节),的使用的头文件是一样的。在看下面详细程序讲解是,建议大家先看看24C02的器件手册,对它的操作时序有个大致的了解,这样在看程序的时候就知道为什么要那样写了。其实一般的芯片都有它的操作时序,驱动就是严格照着它的操作时序写的!


器件手册:中文版:pdf   英文版:pdf


程序讲解:


1、AT24C2.H头文件详细注释


/*-----------------------------------------*/
//File:   AT24C2.H
//Data:   2008.6.9//3:06 PM
//Amend: 08-8-1 19:31
//Version:  Ver0.2
//Thanks:   Web
//Code:   I love C51~


/*-----------------------------------------*/
#ifndef __AT24C02_H__
#define __AT24C02_H__


/*-----------------------------------------*/
#define unchar unsigned char
#define unint  unsigned int
#define unlong unsigned long


/*-----------------------------------------*/
#define WriteDeviceAddress 0xa0 //写
#define ReadDeviceAddress  0xa1 //读
sbit SCL = P0^6;    //串行接口定义对应开发板硬件
sbit SDA = P0^7;


/*-----------------------------------------*/
//函数声明
void delay_10ms(void);          //延时10ms  
void Start(void);                      //开始总线
void Stop(void);                      //结束总线
void NoAck(void);                  //发送ACk0
bit TestAck(void);                    //测试ACk
void Write8Bit(unchar input);        //写入8个Bit 到24C02
void Write24C02(unchar ch,unchar address);//写入一个字到24C02中的指定地址中
unchar Read8Bit(void);               //从24C02中读出8个Bit
unchar Read24C02(unchar address);    //从24C02指定地址位置中读出1个字节


/*--------------------------------------------------------------*/
//延时10ms
void delay_10ms(void)
{
 unsigned char i, j;
 for(i = 204; i > 0; i--)
 for(j = 23; j > 0; j--);
}


/*-----------------------------------------*/
//开始总线(时钟线保持高电平期间数据线电平
//从高到低的跳变作为I2C 总线的起始信号 )
void Start(void)
{
 SDA=1;
 SCL=1;
 SDA=0;
 SCL=0;
}


/*-----------------------------------------*/
//结束总线(时钟线保持高电平期间数据线电平
//从低到高的跳变作为I2C 总线的停止信号)
void Stop(void)
{
 SCL=0;
 SDA=0;
 SCL=1;
 SDA=1;
}


/*-----------------------------------------*/
//发送ACk0
void NoAck(void)
{
 SDA=1;
 SCL=1;
 SCL=0;
}


/*-----------------------------------------*/
//测试ACk(I2C 总线数据传送时每成功地传送一个
//字节数据后接收器都必须产生一个应答信号应答
//的器件在第9 个时钟周期时将SDA 线拉低表示其
//已收到一个8 位数据)
bit TestAck(void)
{
 bit ErrorBit;
 SDA=1;
 SCL=1;
 ErrorBit=SDA;
 SCL=0;
 return (ErrorBit);
}


/*-----------------------------------------*/
//写入8个Bit 到24C02
void Write8Bit(unchar input)
{
 unchar temp;
 for(temp=8;temp!=0;temp--)
 {
  SDA=(bit)(input&0x80);
  SCL=1;
  SCL=0;
  input<<=1;
 }
}


/*-----------------------------------------*/
//写入一个字节到24C02中的指定地址中
//(在字节写模式下主器件发送起始命令和从器
//件地址信息R/W 位置零给从器件在从器件产生
//应答信号后主器件发送CAT24WC01/02/04/08/16
//的字节地址主器件在收到从器件的另一个应答
//信号后再发送数据到被寻址的存储单元CAT24WC
//01/02/04/08/16 再次应答并在主器件产生停止
//信号后开始内部数据的擦写在内部擦写过程中
//CAT24WC01/02/04/08/16 不再应答主器件的任何请求)
void Write24C02(unchar ch,unchar address)
{
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(address);
 TestAck();
 Write8Bit(ch);
 TestAck();
 Stop();
 delay_10ms();     //延迟时间最大10ms!!!
}


/*-----------------------------------------*/
//从24C02中读出8个Bit
unchar Read8Bit(void)
{
 unchar temp,rbyte=0;
 for(temp=8;temp!=0;temp--)
 {
  SCL=1;
  rbyte<<=1;
  rbyte|=((unchar)(SDA));
  SCL=0;
 }
 return (rbyte);
}


/*-----------------------------------------*/
//从24C02指定地址位置中读出1个字节
unchar Read24C02(unchar address)
{
 unchar ch;
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(address);
 TestAck();
 Start();
 Write8Bit(ReadDeviceAddress);
 TestAck();
 ch=Read8Bit();
 NoAck();
 Stop();
 return (ch);
}


/*-----------------------------------------*/
#endif


本节重点:


1、24c02的从器件地址:


点击开大图


WriteDeviceAddress 0xa0 //写和ReadDeviceAddress  0xa1 //读的来历


2、读写操作时序的理解和代码编写:


点击开大图


演示视频(EEPROM掉电存储)


http://v.youku.com/v_show/id_XOTIzNjQ1MjA=.html


相关程序:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/6/d453d41a-52eb-4807-9c92-4e70bd6d6e62.rar


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条