"); //-->
第三十二课 串行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、读写操作时序的理解和代码编写:
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
改寫Makefile遇到的怪事..
iPhone 17全系CAD图出炉:设计杂乱无章!4款机型3种外观
matlab-CHAP203
Microchip低成本带CAN控制器的单片机PIC18F66K80
DeepSeek超越150万模型:成全球最受欢迎开源大模型
INA110构成的共模电压可达±1000V的差动放大器
拆个示波器无源探头,看看里面到底有啥秘密
牛人总结,开关电源六大电路对比
matlab-Chap212
matlab-Chap213
引导vxWorks的问题
M4芯片苹果MacBook Air蓄势待发,消息称苹果营销团队已开始备战
求教!关于文件系统。。
小米高端化再进一步:下周手机、汽车双旗舰发布
消息称奇瑞跟进全民智驾,小蚂蚁等入门车型全系标配
好不容易找到一套指纹识别算法
拆解按摩器:有意思的按键与LED控制电路,学习借鉴一下!
iPhone 16e首发苹果自研5G基带 C1,古尔曼称C2、C3已在测试中
Microchip dsPIC33 DSC数字电源
Microchip低成本dsPIC® DSC电机控制方案
To smhsu
INA102构成的人体生物电信号前置放大器
MPLAB® ICD 3的使用演示
运算放大器精密调零电路(REF200)
matlab-CHAP201
驱动50Ω负载的线性放大器
低失真AGC放大器(AD824)
matlab-Chap211
多家汽车产业链公司切入“人形机器人”赛道
Microchip Android系统配件开发平台