AT24Cxx - 电可擦可写E2PROM

芯片介绍

基础介绍\引脚介绍

AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms)的。

串行E2PROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。其中,AT24C01具有8字节数据的页面写能力,AT24C02/04/08/16具有16字节数据的页面写能力,AT24C32/64具有32字节数据的页面写能力。

其引脚如图:

A0、A1、A2:通过器件地址输入端 A0 A1 和 A2 可以实现将最多 8 个 24WC01 和 24WC02 器件 4 个 242C04 器件,2 个 24WC08 器件和 1 个 24WC16 器件连接到总线上。即其除了用于地址跨页选择外,还充当主机的选择引脚。由于该芯片最多支持256个字节的连续写入,因此每256个字节地址输入端会进行相应的电平变化。

WP:写保护,当WP为高电平时,该芯片只能读数据。

SCL、SDA:I2C协议的时钟线与数据线,详见协议使用笔记I2C章节。

控制命令

7 6 5 4 3 2 1 0
1 0 1 0 A2 A1 A0 R/~W
  • 前四位为固定值 - 1010(0xAx)。

  • 根据芯片容量不同,从A0开始可作为地址线,从A2结尾可作为片选线。

以AT24C08为例:

AT24C08为一片容量为8Mbit(1Mbyte)的芯片,以256字节为一页,其共被分为4页,即需要两位地址线作为地址选择,以A2为0时为例(片选第一片,AT24C08最多可同时接入两片)选择情况如下:

3 2 1 选择地址(byte)
0/1 0 0 0 ~ 255
0 1 256~ 511
1 0 512 ~ 766
1 1 767 ~ 1023
  • 最后一位为读写信号,高电平为读,低电平为写。

地址命令

地址命令为8bit的地址数据,为AT24Cxx的页内相对地址,值得注意的是:当使用芯片为AT24C32及以上时,其地址命令为两个8bit地址,前为地址高八位,后为地址低八位,发送方式同其它时序。

基础读写操作

写字节\页写

写字节:

  • 其格式为:

开始信号 --> 控制命令 --> 。–> 写入地址 --> 。–> 写入数据 --> 。–> 停止信号

注:。处为等待响应。

页写:

  • 其格式为:

开始信号 --> 控制命令 --> 。–> 写入地址 --> 。–> 写入数据 --> 。–> …… --> 停止信号

注:。处为等待响应,……为省略。

使用页写 AT24C01 可一次写入 8 个字节数据 AT24C02/04/08/16 可以一次写入 16 个字节的
数据 页写操作的启动和字节写一样 不同在于传送了一字节数据后并不产生停止信号。

如果数据量大于限定的最大数据,则后续数据将会从预写入数据处覆盖先前的数据。

立即读字节\选择读\连续读

立即读字节:即读取单个字节

  • 立即读操作不需要发送读取数据地址,因为该数据地址为上次读数据的地址+1,即若上次读取的地址为N,则此次读取地址为N+1。若N为芯片最后一个地址(AT24C08为1023),则此次读取地址为 0。
  • 其格式为:

开始信号 --> 控制命令 --> 。–>读取数据 --> x --> 停止信号

注:。处为等待响应,x为发送非应答。

该读取方式由于使用情况略显复杂,因此在实际操作中使用较少,但在特定情况下使用方便。

选择读:

  • 选择读可读取芯片存储地址中任意地址地字节内容,即任意读一个字节
  • 其格式为:

开始信号 --> 控制命令(写) --> 。–> 读取地址 --> 。 --> 开始信号 --> 控制命令(读) --> 。 --> 读取数据 -->

x --> 停止信号

注:。处为等待响应,x为发送非应答。

主器件首先通过发送起始信号从器件地址和它想读取的字节数据的地址执行一个伪写操作,应答之后主器件重新发送起始信号和从器件地址此时R/W位置 1,响应并发送应答信号然后输出所要求的一个 8 位字节数据,主器件不发送应答信号但产生一个停止信号。

连续读:

  • 连续读操作可通过立即读或选择性读操作启动, 在立即读或选择读发送非应答时不发送非应答,发送应答并继续接收数据,此时地址指针会自动向后偏移1位。待接收数据完成后再发送非应答。
  • 此操作可以连续读任意个数据,可跨页,若读取数据大于其读取处至存储器尾地址的总字节数,则其将从绝对地址0处开始读取剩余数据。

代码示例

注意:以下代码以模拟I2C、AT24C08为例,需要初始化对应引脚。

此处仅介绍写字节与选择读的函数。

变量介绍

void IIC_StartOrStop(u8 mode);   //I2C开始结束
void IIC_WriteByte(u8 tData);    //I2C写字节
u8 IIC_Wait_ACK(void);          //I2C等待从机应答
u8 IIC_ReadByte(void);          //I2C读字节
void IIC_Send_ACK(void);        //I2C发送应答
void IIC_Send_NonACK(void);     //I2C发送非应答
/*以上函数变量详情请参照 - 协议使用笔记I2C章节 - 此处不做说明*/

写字节

void AT24CXX_WriteByte(u16 addr, u8 tData)     //addr - 芯片绝对地址,tData - 芯片发送的数据(8byte)
{u8 page = 0,offset = 0;page = addr / 256;                       //将绝对地址转换成相应页offset = addr % 256;                  //计算绝对地址在相应页的偏移量page <<= 1;page |= (0xa << 4);                        //组装控制命令,最后一位为 0 - 写IIC_StartOrStop(OPEN);                   //开始信号IIC_WriteByte(page);                  //发送控制命令IIC_Wait_ACK();                         //等待应答IIC_WriteByte(offset);                    //发送页内偏移地址IIC_Wait_ACK();                           //等待应答IIC_WriteByte(tData);                 //写数据IIC_Wait_ACK();                            //等待应答IIC_StartOrStop(CLOSE);                   //结束信号delayMs(10);                          //等待写入完成
}

选择读

u8 AT24CXX_ReadByte(u16 addr)            //addr - 读取地址 ,返回值 - 该地址处数据
{u8 rData,page = 0,offset = 0;page = addr / 256;offset = addr % 256;                //同上page <<= 1;page |= (0xa << 4);                    //伪写IIC_StartOrStop(OPEN);IIC_WriteByte(page); IIC_Wait_ACK();IIC_WriteByte(offset);IIC_Wait_ACK();page |= 1;                          //至最低为为读(1)IIC_StartOrStop(OPEN);IIC_WriteByte(page);IIC_Wait_ACK();rData = IIC_ReadByte();IIC_Send_NonACK();                    //发送非应答IIC_StartOrStop(CLOSE);return rData;                     //返回数据
}

AT24Cxx读写全面理解相关推荐

  1. java读取字节效率最高_java中字节流读写和字符流读写怎么理解?哪个效率更高...

    我们java中的io流分为两大类,字节流和字符流. 可是在具体使用的时候怎么视情况进行使用? 怎么使用更加有效率? 有两个例子,帮忙看看解释一下,用哪种比较有效率以及适用情况. 下面是用字符流进行读写 ...

  2. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...

  3. STM32软件模拟IIC---读写驱动AT24Cxx

    以下内容皆是个人学习过程中的总结,记录一下整个过程,用于后期复习,如有不对之处,麻烦各位大佬指出~ (喜欢的朋友麻烦点个关注~~~ 后期还会进行持续更新) 概述 AT24C系列为美国ATMEL公司推出 ...

  4. AX7A200教程(3): DDR3突发读写

    上一个章节我们新建工程,然后进行基本的初始化操作,这个章节将在上个工程的基础上进行突发读写 因ddr3读写部分控制信号比较多,所以ddr3读写控制模块比较复杂,本章节着重于一个256位数据的突发读写, ...

  5. mysql 读写分离 c_MYSQL的读写分离 - osc_9u3csz5k的个人空间 - OSCHINA - 中文开源技术交流社区...

    数据量增多,单机的数据库不足以支撑业务,需要用到数据库集群.而读写分离,就是将数据库的读和写分离,对应到数据库一般就是主从数据库,一主一从或者一主多从:业务服务器把数据写到主数据库中,读操作都去从库读 ...

  6. Symfony2 生成应用包

    转载地址:http://open.edusoho.com/doc/v1/35App-guide.html 创建应用包 此文档以最基础的输出'helloworld'字符的应用作为例子,创建一个名为hel ...

  7. java opc 读取到数据块的数据_MES系统功能数据传输的介绍

    MES系统是生产车间进行数据采集的管理系统,MES系统有个非常重要的功能是数据传输.我们通过数据传输使MES系统与外界产生联系和数据交互. 众所周知,相较于ERP产品,MES的一个特殊之处是其不仅仅与 ...

  8. 学python历程中

    蛋蛋人物学python历程中 相比shell而言,python执行效率高.可以跨平台,可移植性好,标准统一,在不同平台执行的结果一致.而且python模块丰富,应用场景更丰富.python采用强制缩进 ...

  9. 精通正则表达式的 12 个有用资源

         任何开发项目,不管使用何种编程语言,经常都需要从给定的数据中提取一些值然后进行验证.例如输入的校验.过滤 URL 变量之类.而正则表达式用来处理这样的任务可以说是轻而易举,而且代码量很少.另 ...

  10. 互联网公司分布式集群架构图入门解析(简单通俗易懂,超详细)

    一.小型公司网络架构 狗子是某大学计算机专业本科应届毕业生,由于自己的技术不错,再加上互联网产业的巨大利润的驱使,狗子决定走上创业这条路,于是,狗子联合了同学二黑,鸡子,狗蛋等人花费了几个月的时间写出 ...

最新文章

  1. SSH框架搭建的时候遇到的问题
  2. java 常量池详解
  3. iis7 上传限制问题
  4. 现在是2016-09-23,查询2个月后的月份和入职的月份相同的数据
  5. flask+uwsgi+supervisor+nginx在局域网服务器上部署实践
  6. CentOS下DB2数据库安装过程详解
  7. java 线程状态_Java线程的状态
  8. idea整个项目乱码解决办法
  9. OpenCv中 width 和 widthStep的区别
  10. 单片机- >网络模块(WIFI or 4G)->logstash->kafka->写入服务->es->grafana
  11. 香港消委会:大部分航空公司超卖机票无赔偿细则
  12. 秒杀活动的防刷限流技术
  13. android扫一扫 二维码显示结果中文乱码
  14. hexo博客yilia-puls主题使用aplayer音乐插件
  15. 完美解决Win10重命名文件导致资源管理器卡死
  16. 中职计算机应用专业课堂教学,新时期中职计算机专业课堂教学的创新应用
  17. 谁将引领未来高清音频!杜比TrueHD对比DTS-HD
  18. it科技类新闻怎么写?学会四个技巧,让你的文章吸引更多人观看
  19. Python-charle+fiddler
  20. cad2016中选择全图字体怎么操作_高大上PPT的四个关键词:极简、全图、创意、潮流...

热门文章

  1. 自定义ActionBar -- 更换返回键图标
  2. 研究将有pid和id的ListMapString,Map组成树
  3. matlab分栏画图,Tkinter编程应知应会(19)-分栏窗口控件PanedWindow
  4. 【爬虫】巧用 js2py (附带bug解决)
  5. 吴恩达机器学习课后作业——神经网络
  6. 前端程序员《HTML》学习笔记(3)之标签学习
  7. 利用iframe覆盖windowed plugin
  8. three 星空穿梭,常见的星空星星移动
  9. JavaScript系列-闭包
  10. linux系统镜像后缀及简单介绍