第三十二课 串行E2PROM之24C02
开发板上带的是24C08(8K,内部含有1024 个8 位字节),和24C02(2K,内部含有256 个8 位字节),的使用的头文件是一样的。在看下面详细程序讲解是,建议大家先看看24C02的器件手册,对它的操作时序有个大致的了解,这样在看程序的时候就知道为什么要那样写了。其实一般的芯片都有它的操作时序,驱动就是严格照着它的操作时序写的!
程序讲解:
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
文章评论(0条评论)
登录后参与讨论