at24c16 有8块 256字节组成,共2K字节16K bit



I2C开始信号后,第一个字节为器件地址,由1010+3位块地址+1位读写标志组成, 3位块地址刚好可以表示 8个块, 所以一次写完256字节,换到下一下块的时候,要重新更改器件地址

共有三种写入模式:
字节写入模式: MODE脚可接高电平或低电平

多字节模式:MODE接高电平,一次最多写8个字节,24c16收到数据后,地址低4bit递增,当地址超出边界时,会回滚到本页的开头,相当于低4bit溢出了,而且写入时间加倍到20ms。

页写入模式:一次最多写入16字节。主机每发送一个字节,24c16收到确认,内部地址递增(仅限低4bit,所以1次可写16字节)。

写保护功能:
8个块(每个块256byte)中,高四个块是可以写保护的,防止误改。
从边界地址—到顶部0x07FF之间被保护,边界地址由PB1 PB0两个引脚电平和0x07FF这个字节确定。
PB0 PB1选择四个块,地址0x07FF里面的内容的高4bit选择行号,一个块里有16行,每行16字节。低4bit 必须是0。所以边界地址是以行为单位的。

写保护的顺序:
1、将要保护的数据写入内存的顶部,最多但不包括location7FFh
2、硬件选择PB0 PB1 电平
3、通过在地址指针(位置7FFh的4个MSB)中写入正确的底部边界地址并将位b2(保护标志)设置为“0”来设置保护。

注意:位置7FFh的低4bit必须写入0,然后当PRE引脚接高电平时,保护将起作用。

备注:只有当PRE为高电平,并且7FFH存储的地址的bit2位为0,保护才起作用。其它情况,7FFH可以作为普通存储单元。


    /*****************************************************************************函数名称 : readAT24C16功能描述 :从at24c16读取数据输入参数 : 要读的开始地址,读出来的数据存放到数组的指针,数据长度返回参数 : hal_ok/hal_error使用说明 : 无*****************************************************************************/
HAL_StatusTypeDef readAT24C16(uint16_t addr,uint8_t *data, uint16_t len)
{uint8_t rNum=0;uint16_t lenLeft=len;uint8_t deviceId;uint8_t *p=data;/*is the address overfolw*/if(addr+len>E2PROM_SIZE)   return HAL_ERROR;/*calculate the current read position to know how many word can read continully*/rNum=16-addr & E2PROM_PAGE_MASK;if(rNum == 0)  rNum=16;rNum = lenLeft>=rNum ? rNum : lenLeft;//剩余未读字节数如果大于rNum, 则读rNum个,如果小于rNum,则一次读完了/*read the data from e2prom*/while(lenLeft){//这里计算页地址,当地址小于256时,右移8位会小于0,所以器件地址为基地址A1//如果读取的地址大于256时,右移8位则不会小于0,所以器件地址为 基地址A1 | 3位页地址deviceId=(addr>>8)<0 ?  E2PROM_BASE_RID : (E2PROM_BASE_RID | (uint8_t)((addr>>7)&0x0E));if(HAL_I2C_Mem_Read(&hi2c2,deviceId,addr&0x00FF,I2C_MEMADD_SIZE_8BIT,p,rNum, 20)!=HAL_OK){printf("i2c read error\r\n");continue;}addr+=rNum;//已经读了rNum个了,所以地址后移rNum个lenLeft-=rNum;//剩余未读数据减少rNum个p+=rNum;rNum=lenLeft>16? 16 : lenLeft;//如果剩余大于16个,则下次再读16个,如果小于,则一次读完}return HAL_OK;}

上页的函数,会调用

HAL_I2C_Mem_Read(&hi2c2,deviceId,addr&0x00FF,I2C_MEMADD_SIZE_8BIT,p,rNum, 20)!

来读取16个字节。这个函数再调用下面的函数来读取

I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)

读取的流程为:
设置CR1应答ACK-------产生START-------wait SB set -----发送器件地址-----wait ADDR set 表示地址发送完-----清除ADDR-----wait TXE set表示发送寄存器目前是空的---------发送子地址-------wait TXE set-------再次产生START------wait SB set ------发送器件地址-------wait ADDR set ------退回上一层。接收数据。

AT24C16 读写相关推荐

  1. EEPROM AT24C16读写注意事项

    AT24C16每页有16个字节,128页,共2048字节.128页分成8块,每块256字节. I2C开始信号后,第一个字节为器件地址,由1010+3位块地址+1位读写标志组成, 3位块地址刚好可以表示 ...

  2. Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_04_AT24C16

    一,打开文件(可以随文下载放置在文档中打开).(如下图1所示) 图1 二,调整原理图大小,适合可视,另存工程文件.(如下图2,3,4所示) 图2 图3 图4 三,点击Source Code标签.(如下 ...

  3. at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验

    Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...

  4. STM32快速读写AT24C16 代码 模拟I2C

    本帖只适用AT24C16及以下的芯片,AT24C32及以上的芯片读写方式不一样,故不适用!!! 如果你的代码可以正常读写24C01/02,直接拿来读取24C16是可以的,但是只能读取256字节. AT ...

  5. at24c16如何划分出多个读写区_如何1分钟遍历100T数据?

    如何快速遍历一个超大数据集 ? 文件是存储在磁盘上的,文件的读写访问速度受限于磁盘的物理限. 如果才能在1 分钟内完成 100T 大文件的遍历呢? 磁盘存储结构 磁盘是一种可持久保存,持续读写数据的存 ...

  6. at24c16如何划分出多个读写区_漫话:如何给女朋友解释为什么Windows上面的软件都想把自己安装在C盘...

    周末,我在家里面看电视,女朋友正在旁边鼓捣她的电脑,但是好像并不是很顺利,于是就有了以下对话. 计算机存储 我们使用的计算机中,保存信息的介质有两类: 一类是内部存储器,一断电就会把记住的东西丢失. ...

  7. at24c16如何划分出多个读写区_51单片机向at24c16EPROM写入一个数据每问题,写入多个数据,读出的数据都一样...

    #include#defineucharunsignedcharsbitsda=P2^0;sbitscl=P2^1;uchara;voiddelay(){;;}voidstart()//开始信号{sd ...

  8. at24c16如何划分出多个读写区_读写AT24C02,并用1602显示

    #include #include /*********************************LCD定义部分********************************/ //输入方式设 ...

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

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

  10. 基于STM32的I2C通信 2(读写AT24C02)

    本文采用STM32的模拟I2C对 EEPROM(AT24C02)进行读写操作. 1.EEPROM(24C02):I2C接口 1.1-24C02器件介绍: AT24C02的总容量是256个字节,也就是2 ...

最新文章

  1. php 学习笔记 数组1
  2. c++ qt 编译问题求解答
  3. python开发需要掌握的知识_(深度学习)Python必须掌握基础知识,python,必会,知识点...
  4. JVM方法区内存分配
  5. os.walk获取同级目录具有随机性
  6. jqgrid学习(2)搜索
  7. 浙大计算机基础知识题1,浙大作业1计算机基础知识题.docx
  8. 有关linux用户和用户组管理的知识详解
  9. poj 楼天成的男人八题系列 A New Stone Game 博弈问题
  10. AAAI 2020上的NLP有哪些研究风向?
  11. 教你如何使用数字组件,制作有灵魂的数据可视化大屏
  12. html怎么做一个正方形,使用HTML+CSS做一个正方体
  13. w10桌面不显示计算机了,win10系统电脑开机后不显示桌面的详细方案
  14. 深入存储驱动:Overlay2
  15. 写作是普通人积累财富成本最低最有效的方式
  16. VNC Connect远程工具使用-使用体验极高
  17. unity黑白滤镜_unity3D 把图片变黑白的Shader
  18. 我的一些杭电计算机考研资料
  19. revit二次开发的一些前期准备
  20. 微信小程序:使用拖动(touchstart、touchmove、touchend)以及 scroll-view 实现 下拉加载上一项导航,上拉加载下一导航功能;

热门文章

  1. 计算机查看图片的打开方式,win7系统图片打开方式没有windows照片查看器的解决步骤...
  2. java nlpir_NLPIR分词工具的使用(java环境下)
  3. 学历查询和专业代码查询
  4. matlab转换器dcdc,关于如何用 Simulink 设计 DC/DC 转换器的分析和介绍
  5. Python绘制酷炫的弦图
  6. html如何修改按钮样式,css怎么设置按钮样式?
  7. 好看的css按钮样式收集
  8. JDK命令一、javah命令(C Header and Stub File Generator)
  9. Echarts滚动条
  10. CentOS更换阿里yum源