AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms)的。串行E2PROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。其中,AT24C01具有8字节数据的页面写能力,AT24C02/04/08/16具有16字节数据的页面写能力,AT24C32/64具有32字节数据的页面写能力

AT24CXX的驱动是基于IIC的,在基本的IIC上加入了一些通讯协议,具体如下

1.随机写

主器件发送起始命令和从器件地址
信息(R/W 位置 0)给从器件,主器件在收到从器件产生应答信号后,主器件发送 1 个 8 位字节地
址写入 AT24C01/02/04/08/16 的地址指针,对于 AT24C31/64/128/256 来说,所不同的是主器件发
送两个 8 位地址字写入 AT24C32/64/128/256 的地址指针。主器件在收到从器件的另一个应答信号
后,再发送数据到被寻址的存储单元。AT24Cxx 再次应答,并在主器件产生停止信号后开始内部
数据的擦写,在内部擦写过程中,AT24Cxx 不再应答主器件的任何请求

2.页写

。在页写模式下,AT24C01/02/04/08/16/32/64/128/256 
可一次写入 8 /16/16/16/16/32/32/64/64 个字节数据。页写操作的启动和字节写一样,不同的是在
于传送了一字节数据后并不产生停止信号。主器件被允许发送 P(AT24C01:P=7;
AT24C02/04/08/16: P=15;AT24C32/64:P=31;AT24C128/256:P=63)个额外的字节。每发送
一个字节数据后 AT24Cxx 产生一个应答位, 且内部低位地址加 1,高位保持不变。如果在发送停
止信号之前主器件发送超过 P+1 个字节,地址计数器将自动翻转,先前写入的数据被覆盖。 接
收到 P+1 字节数据和主器件发送的停止信号后,AT24Cxx 启动内部写周期将数据写到数据区。 所
有接收的数据在一个写周期内写入 AT24Cxx

3.立即读

也就是说,立即读取读取的是存储器内部指针的当前数据,不需要我们设定地址

4.随机读

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

随机读需要设定需要读的地址,然后有一次伪写入过程,这个伪写入是为了修改存储器内部的工作指针

5.顺序读

。顺序读操作可通过立即读或选择性读操作启
动。在 AT24Cxx 发送完一个 8 位字节数据后,主器件产生一个应答信号来响应,告知 AT24CXX
主器件要求更多的数据,对应每个主机产生的应答信号 AT24Cxx 将发送一个 8 位数据字节。当
主器件不发送应答信号而发送停止位时结束此操作。 从 AT24Cxx 输出的数据按顺序由 N 到 N+1
输出。读操作时地址计数器在 AT24Cxx 整个地址内增加,这样整个寄存器区域在可在一个读操
作内全部读出。当读取的字节超过 E(AT24C01,E=127;AT24C02,E=255;AT24C04,E=511;
AT24C08,E=1023;AT24C16,E=2047;AT24C32,E=4095;AT24C64,E=8191;AT24C128,
E=16383;AT24C256,E=32767)计数器将翻转到零并继续输出数据字节

顺序读其实就是在前两个的基础上,一个数据读完了不发送noack二十发送ACK这样就可以一直读下去,需要自己计数因为存储器内部指针会自动循环的

所以只要按照时序图的标准来祝贺IIC基础驱动,就能实现一个存储器的驱动了

代码如下

  1. #ifndef __24CXX_H
  2. #define __24CXX_H
  3. #include "iic.h"
  4. #include "delay.h"
  5.  
  6. #define AT24C01 127
  7. #define AT24C02 255
  8. #define AT24C04 511
  9. #define AT24C08 1023
  10. #define AT24C16 2047
  11. #define AT24C32 4095
  12. #define AT24C64 8191
  13. #define AT24C128 16383
  14. #define AT24C256 32767
  15.  
  16. #define EE_TYPE AT24C02
  17.  
  18. #define AT_ADDR 0xa0
  19.  
  20. #define AT_CHECK_ADDR 0X00
  21. #define AT_CHECK_VALUE 0X52
  22.  
  23. u8 At24cxxReadOneByte(u16 ReadAddr); //指定地址读取一个字节
  24.  
  25. void At24cxxWriteOneByte(u16 WriteAddr,u8 DataToWrite); //指定地址写入一个字节
  26.  
  27. void At24cxxWriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//指定地址开始写入指定长度的数据
  28.  
  29. u32 At24cxxReadLenByte(u16 ReadAddr,u8 Len); //指定地址开始读取指定长度数据
  30.  
  31. void At24cxxWrite(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite); //从指定地址开始写入指定长度的数据
  32.  
  33. void At24cxxRead(u16 ReadAddr,u8 *pBuffer,u16 NumToRead); //从指定地址开始读出指定长度的数据
  34.  
  35. u8 At24cxxCheck(void); //检查器件
  36.  
  37. void At24cxxInit(void); //初始化IIC
  38.  
  39. #endif
  1. #include "24cxx.h"
  2.  
  3. //初始化IIC接口
  4. void At24cxxInit(void)
  5. {
  6. IIcInit();
  7. }
  8.  
  9. //在AT24CXX指定地址读出一个数据
  10. //ReadAddr:开始读数的地址
  11. //返回值 :读到的数据
  12. u8 At24cxxReadOneByte(u16 ReadAddr)
  13. {
  14. u8 temp=0;
  15. IIcStart();
  16. if(EE_TYPE>AT24C16)
  17. {
  18. IIcSendByte(AT_ADDR); //发送写命令
  19. IIcWaitAck();
  20. IIcSendByte(ReadAddr>>8);//发送高地址
  21. }else IIcSendByte(AT_ADDR+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
  22. IIcWaitAck();
  23. IIcSendByte(ReadAddr%256); //发送低地址
  24. IIcWaitAck();
  25. IIcStart();
  26. IIcSendByte(AT_ADDR+1); //进入接收模式
  27. IIcWaitAck();
  28. temp=IIcReadByte(0);
  29. IIcStop();//产生一个停止条件
  30. return temp;
  31. }
  32.  
  33. //在AT24CXX指定地址写入一个数据
  34. //WriteAddr :写入数据的目的地址
  35. //DataToWrite:要写入的数据
  36. void At24cxxWriteOneByte(u16 WriteAddr,u8 DataToWrite)
  37. {
  38. IIcStart();
  39. if(EE_TYPE>AT24C16)
  40. {
  41. IIcSendByte(AT_ADDR); //发送写命令
  42. IIcWaitAck();
  43. IIcSendByte(WriteAddr>>8);//发送高地址
  44. }else IIcSendByte(AT_ADDR+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
  45. IIcWaitAck();
  46. IIcSendByte(WriteAddr%256); //发送低地址
  47. IIcWaitAck();
  48. IIcSendByte(DataToWrite); //发送字节
  49. IIcWaitAck();
  50. IIcStop();//产生一个停止条件
  51. DelayMs(10);
  52. }
  53.  
  54. //在AT24CXX里面的指定地址开始写入长度为Len的数据
  55. //该函数用于写入16bit或者32bit的数据.
  56. //WriteAddr :开始写入的地址
  57. //DataToWrite:数据数组首地址
  58. //Len :要写入数据的长度2,4
  59. void At24cxxWriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
  60. {
  61. u8 t;
  62. for(t=0;t<Len;t++)
  63. {
  64. At24cxxWriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
  65. }
  66. }
  67.  
  68. //在AT24CXX里面的指定地址开始读出长度为Len的数据
  69. //该函数用于读出16bit或者32bit的数据.
  70. //ReadAddr :开始读出的地址
  71. //返回值 :数据
  72. //Len :要读出数据的长度2,4
  73. u32 At24cxxReadLenByte(u16 ReadAddr,u8 Len)
  74. {
  75. u8 t;
  76. u32 temp=0;
  77. for(t=0;t<Len;t++)
  78. {
  79. temp<<=8;
  80. temp+=At24cxxReadOneByte(ReadAddr+Len-t-1);
  81. }
  82. return temp;
  83. }
  84.  
  85. //检查AT24CXX是否正常
  86. //这里用了24XX的最后一个地址(255)来存储标志字.
  87. //如果用其他24C系列,这个地址要修改
  88. //返回1:检测失败
  89. //返回0:检测成功
  90. u8 At24cxxCheck(void)
  91. {
  92. u8 temp;
  93. temp=At24cxxReadOneByte(AT_CHECK_ADDR);//避免每次开机都写AT24CXX
  94. if(temp==AT_CHECK_VALUE)return 0;
  95. else//排除第一次初始化的情况
  96. {
  97. At24cxxWriteOneByte(AT_CHECK_ADDR,AT_CHECK_VALUE);
  98. temp=At24cxxReadOneByte(AT_CHECK_ADDR);
  99. if(temp==AT_CHECK_VALUE)return 0;
  100. }
  101. return 1;
  102. }
  103.  
  104. //在AT24CXX里面的指定地址开始读出指定个数的数据
  105. //ReadAddr :开始读出的地址 对24c02为0~255
  106. //pBuffer :数据数组首地址
  107. //NumToRead:要读出数据的个数
  108. void At24cxxRead(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
  109. {
  110. while(NumToRead)
  111. {
  112. *pBuffer++=At24cxxReadOneByte(ReadAddr++);
  113. NumToRead--;
  114. }
  115. }
  116.  
  117. //在AT24CXX里面的指定地址开始写入指定个数的数据
  118. //WriteAddr :开始写入的地址 对24c02为0~255
  119. //pBuffer :数据数组首地址
  120. //NumToWrite:要写入数据的个数
  121. void At24cxxWrite(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
  122. {
  123. while(NumToWrite--)
  124. {
  125. At24cxxWriteOneByte(WriteAddr,*pBuffer);
  126. WriteAddr++;
  127. pBuffer++;
  128. }
  129. }

STM32驱动AT24CXX系列芯片的更多相关文章

  1. STM32系列芯片命名规范

    1.STM32的基础知识 STM32是意法半导体公司,基于ARM Cortex®-M0,M0+,M3, M4和M7内核生产的系列通用MCU.截止当前时间为止(20190515),STM32有STM32 ...

  2. 【转载】如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结

    [好文章值得分享,摘自作者:jesse] 来源:www.armjishu.com作者:jesse转载请注明出处 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM ...

  3. AMS5601的ardunio和STM32驱动开发

    AMS5601的ardunio和STM32驱动开发 本文有麦粒电子撰写,并提供相应产品服务. 前言 目前ams关于磁编码芯片用的比较多的可能是ams5600,能够输出pwm信号,电压信号以及I2C通信 ...

  4. STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...

  5. 海思3516系列芯片SPI速率慢问题深入分析与优化(基于PL022 SPI 控制器)

    海思3516系列芯片SPI速率慢问题深入分析与优化(基于PL022 SPI 控制器) 我在某个海思主控的项目中需要使用SPI接口来驱动一块液晶屏,液晶屏主控为 st7789,分辨率 240x240,图 ...

  6. 爱特梅尔ATMEL全系列芯片解密单片机破解

    爱特梅尔ATMEL全系列芯片解密单片机破解 ATMEL芯片介绍: ATMEL公司为全球性的业界领先企业,致力于设计和制造各类微控制器.电容式触摸解决方案.先进逻辑.混合信号.非易失性存储器和射频 (R ...

  7. 在keil 4中添加stc系列芯片的方法--【sky原创】

    在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...

  8. esp8266的STM32驱动

    esp8266的STM32驱动,数据发送接收由DMA完成,释放CPU. 目前只能发送返回消息为成功或失败的AT命令,并判断是否成功,详见esp8266_cmd():其它返回消息不可预知的命令(如查看A ...

  9. STM32驱动W25X64存储器

    W25X64 是华邦公司推出的大容量 SPI  FLASH 产品,W25X64 的容量为 64Mbit(8M),该系列还有 W25Q80/16/32 等.W25X16,W25X32,W25X64分别有 ...

随机推荐

  1. [转]java构造方法的访问修饰符

    http://my.oschina.net/u/1464678/blog/210359 1.       类(class) 可见性修饰符: public—在所有类中可见,在其他包中可以用import导 ...

  2. SQL Server 自定义快捷键

    SQL Server程序员经常要在SSMS(SQL Server Management Studio)或查询分析器(2000以前)中编写T-SQL代码.以下几个技巧,可以提升工作效率. 以下说明以SS ...

  3. UVALive 2523 Machine Schedule(二分图求最大匹配数)

    题意:有两台机器,上面有多个工作区域,有多个任务,分别可以在两台机器的某一个区域上完成,两台机器一开始都在0区域上工作,每次更改区域,都会重新启动一次,让我们求出最小的重启次数. 思路:将两个区域连线 ...

  4. java 设计模式之单利模式以及代理模式(静态)

    1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...

  5. POJ - 3666 Making the Grade(dp+离散化)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  6. WordPress安装到zen-cart产品页中

    把WordPress安装到zen-cart一个子目录里吧,设置好固定连接等这个文件/includes/templates/template_default/templates/tpl_product_ ...

  7. EF开发程序经常用的几个东西

    PM> Install-Package EntityFramework PM> Install-Package AutoFac PM> Install-Package AutoMap ...

  8. Cacti安装详细步骤(转)

    一.cacti概述 1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户. ...

  9. leveldb性能分析

    Leveldb是一个google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计.特别是LSM算法. 那 ...

  10. subversion javahl

    新建android项目时,总是说"javahl, require version 1.8"云云. dpkg -l | grep libsvn-java1.6 apt-get upd ...