EEPROM驱动详解
在单片机开发中,经常使用EEPROM作为存储设备保存数据,如何根据数据手册编写驱动,我们以24LC16为例进行分析。
一.分析数据手册
1.1容量的计算
解释:16 Kbit 是多少字节的容量 ,1K是1024 16*1024/8=16*128=2048字节。
所以:24C01 容量 1*128=128字节
24C02 容量 2*128=256字节 24C08 容量 8*128=1024字节
1.2 地址空间
24LC16有2048个字节的地址空间,用户在分配地址范围时,地址范围为0x0--0x7ff,手册中写到2048个字节被分成8个块,每个块256字节。那么地址范围中的(9-11位)0-7代表着8个块地址。
二.看写操作时序
开始->写控制字->ACK->写字节地址->ACK- >数据->ACK->结束
1.开始位的时序
根据上图可知:
I2C开始条件:SCL高电平, SDA 由高变低
I2C结束条件:SCL高电平, SDA 由低变高
void I2CStart()
{SDA_OUT_high(); SCL_high();I2CDelay();SDA_OUT_low();I2CDelay();SCL_low();
}
2.写控制字:告诉机是读操作,还是写操作,读写那个块地址
用户编码地址范围(0-0x7ff)共2048个字节,那么地址0x700的地址,7就是块地址,写控制字时要将块地址写入从机。
2.1 写函数
static unsigned char I2C_WriteByte(unsigned char byte)
{unsigned char i;SDA_OUT(); for(i=0;i<8;i++){if(byte & 0x80) {SDA_OUT_high();}else{SDA_OUT_low();}I2CDelay();SCL_high();I2CDelay();SCL_LOW(); //scl=0 data changebyte <<= 1;} SDA_in(); //SDA PORT input I2CDelay();SCL_high();I2CDelay();if(I2C_SDA == 1) //ACK read SDA port {SCL_high(); no ackreturn 0;}SCL_LOW();I2CDelay();return 1;
}
使用 I2C_WriteByte()函数 写入控制字I2C_WriteByte(addr);
3.ACK 应答位
当主机给从机写入地址后,要求从机在接收一个字节后产生一个应答,因此主机会产生一个时钟
在这个时钟期间,从机必须把SDA 拉低,并在SCL高电平期间保持住。如果SDA没有拉低就是没有ACK,即NOACK。
static void I2CACK(void)
{SDA_OUT(); //SDA置输出口SDA_OUT_low();I2CDelay(); SCL_high(); I2CDelay(); SCL_low(); I2CDelay();
}
static void I2C_NOACK(void)
{SDA_OUT(); //SDA置输出口SDA_OUT_high();I2CDelay(); SCL_high(); I2CDelay(); SCL_low(); I2CDelay();
}
4.写地址 将数据放在EE的地址, I2C_WriteByte(data);
5. I2结束
void I2CStop()
{SDA_OUT_low(); SCL_high();I2CDelay();SDA_OUT_hight();I2CDelay();SCL_low();
}
6.一个完整的写函数
static unsigned char write_eeprom(unsigned int addr, void const *buf, unsigned int len)
{unsigned char w_wait,e2page,SlaveAddr; unsigned char const *src=(unsigned char *)buf;e2page = 16;I2CDelay();
reStart:SlaveAddr = 0xA0 + (unsigned char)((addr & 0x0700)>>7);I2CStart();I2C_WriteByte(SlaveAddr);I2C_WriteByte((unsigned char)(addr%0x100))) while(len--){I2C_WriteByte(*src++)) addr++;if((addr % e2page) == 0){break;}} I2CStop();DelayMs(5);if(len != 0xffff) {goto reStart;}I2CDelay();SCL_low();retrun 1;
}
三.看读操作时序进行EE读操作
读操作时,先写入芯片,要读的地址,然后在读,如上述标计:
1,2步写入写操作控制字及要读的地址;第3步是写入读控制字,数据就可以读出。
读函数代码:
static unsigned char I2C_Recv_byte(void)
{unsigned char byte;unsigned char i = 0;SDA_IN(); //SDA 置输入口for(i=0;i<8;i++){byte <<= 1;SCL_high(); I2CDelay();if(SDA == 1) {byte |= 0x01;}SCL_LOW(); I2CDelay();}return(byte);
}static unsigned char read_eeprom(unsigned int addr, void *buf, unsigned int len)
{unsigned char w_wait,SlaveAddr;unsigned char *dest=(unsigned char *)buf;I2CDelay(); SlaveAddr = 0xA0 + (unsigned char)((addr & 0x0700)>>7); I2CStart();I2C_WriteByte(SlaveAddr))I2C_WriteByte((unsigned char)(addr%0x100)))I2CStart();I2C_WriteByte((SlaveAddr+1)) //readwhile(len--){*dest++ = I2C_Recv_byte();if(n != 0){I2CACK();}addr++;}I2CNOACK();I2CStop(); DelayMs(1);
}
EEPROM驱动详解相关推荐
- 使用VS2010编译MongoDB C++驱动详解
最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...
- Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令)
Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令) 原创 2017年03月01日 22:58:39 标签: 开发人员 / UAV / 软件 / 硬件 一.开篇 开源精神常在!!! 谁说软件 ...
- MTK 驱动(64)---Mtk touch panel驱动/TP驱动详解
Mtk touch panel驱动/TP驱动详解 TP还算是比LCM好理解的多. 在启动过程中,先注册/mediatek/custom/command/kernel/touchpanel目录下的具体驱 ...
- imx6ul 驱动详解
链表的知识: struct list_head {struct list_head *next, *prev; }; API函数 函数 功能 LIST_HEAD 声明并初始化双向链表. INIT_LI ...
- linux usb gadget驱动详解(一)
由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...
- Z-STACK之cc2530LED驱动详解
Z-STACK 之LED驱动详解 最近一段时间学习ZigBee,用的TI公司的cc2530,协议栈是z-stack,为了深入了解整个Z-stack,我从底层的驱动代码开始看起,首先是LED驱 ...
- 博通wifi驱动详解
1 WLAN技术 WLAN是英文WirelessLAN的缩写,就是无线局域网的意思.无线以太网技术是一种基于无线传输的局域网技术,与有线网络技术相比,具有灵活.建网迅速.个人化等特点.将 ...
- LCD液晶屏驱动详解
开发环境: 开发板:JZ2440V3 CPU:samsunS3C2440 内核:Linux3.4.2 编译工具:arm-linux-gcc 4.3.2 LCD:4.3存液晶屏AT043TN24 参考文 ...
- nvme 驱动详解[转]
nvme 驱动详解 之1 http://blog.csdn.net/qqqqqq999999/article/details/47732319 首先打开driver/block下的kconfig文件, ...
最新文章
- 2020十大新兴技术揭晓!每一项都可能颠覆我们的生活
- 远程 不显示本地硬盘解决办法(高级版)
- java删除换行符号_如何从Java中删除文件中的换行符?
- redis热点key解决方案_缓存穿透,缓存雪崩,4种解决方案分析
- 本硕一致计算机科学与技术专业介绍,哈尔滨理工大学计算机科学与技术专业介绍...
- 20220212:力扣第277场周赛(下)
- 专有网络、云产品、路由器和交换机
- BAT程序员手把手带你学算法-数组篇(理论知识剖析+5道经典面试题目)
- java之模块学习-JAVA的IO流
- linux网络三次握手,linux网络编程系列(四)--tcp包头、三次握手、四次挥手、状态...
- [软件更新]暴风影音2009最新特别版光盘免费赠送(暴风门特别版)
- 推荐给中学生的数学课外书:《怎样解题——数学思维的新方法》
- html微信字体大小布局,微信小程序界面设计入门课程样式wxss中使用css课程字体fontsize字体大小...
- VC++ sourceforge.net中一些好的开源项目
- 程序员租女友被骗 揭秘“租友”市场背后那些坑
- 线性代数系列(四)--解方程组
- 矩阵与行列式的区别 行列式简单理解(二三阶)
- Java炸弹人实现及源码
- 北京朝阳一互联网公司被警方一锅端了!23人被带走…这种岗位千万别干!
- 免费好用的php系统,iCMS v7.0.2一款免费、简洁、高效、好用的PHP内容管理系统
热门文章
- 【超级跑车Gumpert Apollo酷炫汽车主题】
- C语言实现一到十的阶乘的和。
- Springboot毕设项目校园交友网站k73q9java+VUE+Mybatis+Maven+Mysql+sprnig)
- 究竟什么是服务器?起什么作用
- 抖音的销量是怎么来的
- Chrome DevTools 操作归纳
- 新标日初级上册单词1----4
- mapbox矢量切片_使用Tippecanoe工具处理大数据量的矢量数据切片
- window.location跳转和window.open跳转以及从url地址栏获取参数
- 倒水问题(算法挑战)