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. 创建私有CA及私有CA的使用
  2. 关于ubuntu启动项默认的修改以及chmod命令的使用
  3. python day29
  4. helm部署hadoop报错解决方法
  5. springboot 通过url访问本地文件
  6. C# 在服务器生成文件/文件夹并压缩下载到本地
  7. 代码安全审计工具推荐
  8. (附源码)基于springboot平衡膳食小程序 毕业设计 250859
  9. xp系统steam无法连接到更新服务器,xp系统打不开steam提示“无法链接至steam网络”的处理办法...
  10. 明白了虹膜,你就知道人类为什么有如此多样的瞳色了
  11. TM4C KEIL模板建立
  12. 运用计算机考试ppt,计算机一级考试的ppt word excel分别用的是哪个版本的??
  13. 布丁浅谈之Linux常用基本命令
  14. 餐厅到店点餐系统(APP)
  15. DDD(领域驱动设计)分层架构
  16. 转载 Linux内存管理(最透彻的一篇)
  17. 用p5.js实现动态形状笔刷
  18. [数值计算-12]:什么是函数逼近:插值、拟合、回归
  19. 倾向性评分匹配 Propensity Score Matching
  20. Java生成微信分享海报小工具EasyPoster

热门文章

  1. js获取当前url参数-通俗易懂
  2. MySQL体系结构图详解
  3. WPS快捷键之 通用基础
  4. 施耐德 m340 编程手册_施耐德电气自动化软件汇总
  5. EASY CHM使用
  6. 使用EasyCHM生成CHM文档
  7. CGLIB动态代理--实例/原理
  8. adams c语言,adams2013编译c语言用户子程序生成dll超详细教程讲解.docx
  9. MKD调试下载的时候提示:Contents mismatch at: xxxxxxxxH (Flash=xxH Required=xxH)
  10. 家用电冰箱3C认证检测标准