在单片机开发中,经常使用EEPROM作为存储设备保存数据,如何根据数据手册编写驱动,我们以24LC16为例进行分析。

一.分析数据手册

1.1容量的计算

The Microchip Technology Inc. 24AA16/24LC16B (24XX16*) is a 16 Kbit Electrically Erasable PROM,Organized as 8 blocks of 256 bytes (8 x 256 x 8)

解释: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驱动详解相关推荐

  1. 使用VS2010编译MongoDB C++驱动详解

    最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...

  2. Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令)

    Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令) 原创 2017年03月01日 22:58:39 标签: 开发人员 / UAV / 软件 / 硬件 一.开篇 开源精神常在!!! 谁说软件 ...

  3. MTK 驱动(64)---Mtk touch panel驱动/TP驱动详解

    Mtk touch panel驱动/TP驱动详解 TP还算是比LCM好理解的多. 在启动过程中,先注册/mediatek/custom/command/kernel/touchpanel目录下的具体驱 ...

  4. imx6ul 驱动详解

    链表的知识: struct list_head {struct list_head *next, *prev; }; API函数 函数 功能 LIST_HEAD 声明并初始化双向链表. INIT_LI ...

  5. linux usb gadget驱动详解(一)

    由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...

  6. Z-STACK之cc2530LED驱动详解

    Z-STACK 之LED驱动详解      最近一段时间学习ZigBee,用的TI公司的cc2530,协议栈是z-stack,为了深入了解整个Z-stack,我从底层的驱动代码开始看起,首先是LED驱 ...

  7. 博通wifi驱动详解

    1        WLAN技术 WLAN是英文WirelessLAN的缩写,就是无线局域网的意思.无线以太网技术是一种基于无线传输的局域网技术,与有线网络技术相比,具有灵活.建网迅速.个人化等特点.将 ...

  8. LCD液晶屏驱动详解

    开发环境: 开发板:JZ2440V3 CPU:samsunS3C2440 内核:Linux3.4.2 编译工具:arm-linux-gcc 4.3.2 LCD:4.3存液晶屏AT043TN24 参考文 ...

  9. nvme 驱动详解[转]

    nvme 驱动详解 之1 http://blog.csdn.net/qqqqqq999999/article/details/47732319 首先打开driver/block下的kconfig文件, ...

最新文章

  1. 2020十大新兴技术揭晓!每一项都可能颠覆我们的生活
  2. 远程 不显示本地硬盘解决办法(高级版)
  3. java删除换行符号_如何从Java中删除文件中的换行符?
  4. redis热点key解决方案_缓存穿透,缓存雪崩,4种解决方案分析
  5. 本硕一致计算机科学与技术专业介绍,哈尔滨理工大学计算机科学与技术专业介绍...
  6. 20220212:力扣第277场周赛(下)
  7. 专有网络、云产品、路由器和交换机
  8. BAT程序员手把手带你学算法-数组篇(理论知识剖析+5道经典面试题目)
  9. java之模块学习-JAVA的IO流
  10. linux网络三次握手,linux网络编程系列(四)--tcp包头、三次握手、四次挥手、状态...
  11. [软件更新]暴风影音2009最新特别版光盘免费赠送(暴风门特别版)
  12. 推荐给中学生的数学课外书:《怎样解题——数学思维的新方法》
  13. html微信字体大小布局,微信小程序界面设计入门课程样式wxss中使用css课程字体fontsize字体大小...
  14. VC++ sourceforge.net中一些好的开源项目
  15. 程序员租女友被骗 揭秘“租友”市场背后那些坑
  16. 线性代数系列(四)--解方程组
  17. 矩阵与行列式的区别 行列式简单理解(二三阶)
  18. Java炸弹人实现及源码
  19. 北京朝阳一互联网公司被警方一锅端了!23人被带走…这种岗位千万别干!
  20. 免费好用的php系统,iCMS v7.0.2一款免费、简洁、高效、好用的PHP内容管理系统

热门文章

  1. 【超级跑车Gumpert Apollo酷炫汽车主题】
  2. C语言实现一到十的阶乘的和。
  3. Springboot毕设项目校园交友网站k73q9java+VUE+Mybatis+Maven+Mysql+sprnig)
  4. 究竟什么是服务器?起什么作用
  5. 抖音的销量是怎么来的
  6. Chrome DevTools 操作归纳
  7. 新标日初级上册单词1----4
  8. mapbox矢量切片_使用Tippecanoe工具处理大数据量的矢量数据切片
  9. window.location跳转和window.open跳转以及从url地址栏获取参数
  10. 倒水问题(算法挑战)