at24c16如何划分出多个读写区_mega32数组、内存以及AT24C16读写相关

article/2025/10/9 10:55:16

主控:mega32

编译器:iar2.31E

这两天折腾一个模块程序,一个温度补偿参数,本来是72个字节,现在扩展了三倍,变成288个,然后各种问题出现了。

第一次修改时想当然,直接把两个用到的全局变量数组改成了288个字节的,程序烧写进去以后,一旦同时调用这两个数组,mega32就会毫不犹豫的崩溃,反复重启,应该是内存溢出。

第二次,存储数据的数组不变,我把负责传输数据的改成了160,分两次向AT24C16写数据,这次程序没有崩溃,但是程序的结果让我崩溃了:首先是写入和读出来的数据乱七八糟,这也是我的原因,写入和读出的数据没有整理,随便写的,结果程序出错时看起来就很乱。等我意识到这点,半天已经过去了,后来学乖了,每次写0,就一个数写1,结果这次出现了更奇特的现象。由于数据分两次写入,第二次读写数据可以成功,但第一次死活不成功。两次的读写函数是同一个,当我把第二次读写屏蔽掉,第一次读写竟然又成功了!

又是崩溃的半天后,发现一个奇怪的现象,读写数据的时候,如果一包数据全是0,就会读写失败,其中哪怕有一个不是0,读写就没问题。我突然意识到,每次两包数据读写的时候,我随手在右下角敲个1,刚好在第二包里面,这样子第二包会成功,而第一包没有非零的数据,所以失败。于是,我在第一次、第二次读写中都加入一个1,果然,这下读写都成功了。我的读写函数是单字节操作,就是一次一个地址一个字节,不是按页写,竟然会有这种问题,只能说保护机制做的太好了。在一段时间内,如果一直保持高电平或者低电平(因为0不会有电平变化),就认为短路了,AT24C16会拒绝读写操作。

读写EEPROM没问题了,但是结果还是有问题,因为我的数据存储数据定义的是288个字节,在操作的时候,发现超过255的数据就把之前的覆盖了,数组大小有限制!没办法,改小吧,不知道是编译器原因还是什么。

总结:

1,mega32内存2K,全局变量太大很容易造成内存溢出;

2,mega32数组大小限制是256,我用的是无符号字符型,不知道整型的话限制是多少;

3,AT24C16在一段时间内的读写(10ms?),不能全部为0,不然芯片认为短路或者接地,拒绝操作;

打赏

f4daca01641a8e0761349c828c8aa605.png扫一扫,打赏作者吧~


http://chatgpt.dhexx.cn/article/ned1kIAL.shtml

相关文章

STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明STC8H开发(四): FwLib_STC8 封装库的介绍和使用注意事项STC8H开发(五…

STM32的硬件I2C与AT24C16

刚学STM32的时候就听闻STM32的硬件I2C存在重大bug,会导致运行卡死在等待ACK的过程中,所以一直以来对其避而远之,转而以模拟I2C取代之。最近这段时间一直在用STM32 CubeMX,图形化设置界面屡试不爽,连USB这种复杂外设都能…

STM32F030 硬件I2C驱动 AT24C16

网络上很多F1系列的ATC24的读写程序,但F0几乎没有。由于F0完全重写了I2C,所以以往的代码并不能直接使用,修改事件、接口上会浪费很多时间,特别是对于使用F0系列进行入门的新手。 在此十分感谢 畅学电子网 的对于AT24C16的资料&am…

EEPROM 之 AT24C16 - 备忘录

因为论坛里看到STM的I2C有点小bug,所以这里采用的是模拟I2C时序 【注】m0.6us表示的是这一段时间最小不能小于为0.6us,M0.6us表示的是这一段时间最大为0.6us 对AT24C16的操作有读和写,读又分为CURRENT ADDRESS READ、RANDOM READ、SEQUENTIAL…

S32K144:12.LPI2C驱动AT24C16

1.打开官方例程 2.修改引脚配置 3.时钟可按照实际情况修改,也可不用更改,本例时钟不做更改 4.配置LPI2C模块 设置从机地址:从机地址如下图所示,低三位表示为AT24C16的块地址,AT24C16将2KB的内存空间分为8个块&…

stm32cubemx I2C读取AT24C16

本文对如何使用stm32cube生成I2C工程不作说明,仅对在对AT24Cxx系列的使用时作出易忽略的说明; 1、at24cxx页面结构: 从该图可以看出16K(bit)共有128个页,每页由16byte构成。16k 128 * 16 * 8; 特别注意&…

STM32之 AT24C16(EEPROM)驱动代码(程序稳定,清晰明了)

AT24C16电路图 第一部分:IIC协议代码头文件(iic.h) #ifndef IIC_H #define IIC_H #include "stm32f10x.h" #include "sys.h" #include "delay.h"#define write 0 #define read 1//IIC总线地址接口定义 #define IIC_SCL PBout(7) #d…

GD32F4xx MCU控制I2C EEPROM(AT24C16)记录

1、AT24C16简介 1.1 主要参数 工作电压:1.8v ~ 5.5v存储空间:2048 Bytes ,分128页,16Bytes/页, 地址范围 0~2047。接口: I2C 总线I2C时钟频率: 1MHz( 5v ) , 400KHz( 1.8v, 2.5v, 2.7v)。1.2 电路连接 1.3 其他说明 AT24C16未使用器件地址引脚,总线上最多只可以连接一…

AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序

一、概述 在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下: 1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序 2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单…

IIC方式读驱动AT24C16芯片

闲来无事,找了块msp430的板子编写了个IIC驱动AT24C16的程序。 IIC作是一种简单,双向,同步的二进制总线,由SDA数据线和SCL时钟线组成,所有接到IIC总线上的各设备的SDA数据线都连接到总线的SDA数据线上,用来…

AT24C16页写和多页写

AT24C16 2K字节(存储内存) 128(页面数)* 16 (每页的字节数) 2^11 (寻址地址位数 11位)。 AT24C16有128(2^7128)页只需要7位地址,分为高3位和低4位,高3位在设备地址中,低4位在字地址中。 设备…

EEPROM(AT24C16)页写算法

1. 写在前面 学习单片机或者从事嵌入式开发的,对于EEPROM绝不会陌生,尤其的24系列的EEPROM很是经典,或者与此兼容的FRAM系列,如AT24C02、AT24C16、FM24C16等。 驱动起这个系列的EEPROM,可以说是没有任何难点&#xff0…

AT24C16 读写注意点

开篇一张时序图镇楼: 这篇文章介绍了AT24C16的页写、连续读、写保护功能:AT24C16 读写_D.luffy的博客-CSDN博客_at24c16 页写算法我是参考这篇文章的:https://acuity.blog.csdn.net/article/details/78550427?utm_ char ee_24clxx_writeby…

AT24C16 读写

at24c16 有8块 256字节组成,共2K字节16K bit I2C开始信号后,第一个字节为器件地址,由10103位块地址1位读写标志组成, 3位块地址刚好可以表示 8个块, 所以一次写完256字节,换到下一下块的时候,要…

进程间通信的方式(附代码分析)

进程间通信的方式 1. 进程间通信的几种方式 管道 比如 ls | grep 1;也就是将 进程 ls 拿到的结果作为 grep 1 这个进程的输入。实现了进程间的通信。 消息队列 消息队列就是我们的内核给我们创建的一种消息队列。我们可以往其中发送消息,也可以从其中接收消息。 …

linux进程--进程间通信方式(一)

一、多进程 首先,先来讲一下fork之后,发生了什么事情。 由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程…

进程间通信的方式——信号、管道、消息队列、共享内存

进程间通信的方式——信号、管道、消息队列、共享内存 多进程: 首先,先来讲一下fork之后,发生了什么事情。 由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别…

Android 进程间通信的几种实现方式

一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和S…

进程间通信的方式及原理

# 进程间通信的方式 文章目录 # 进程间通信的方式消息队列使用步骤 管道 消息队列 信号 信号量 socket 消息队列 首先消息队列就是内核维护的一块链表区域,只要是有足够权限的进程都可以向队列中添加消息,只要是有读权限的进程都可以在里面拿出消息 克…

C | 进程间通信的方式

C | 进程间通信的方式 1.无名管道 无名管道是实现亲缘间进程通信的一种方式,属于半双工通信。 无名管道的实现是队列,不能使用lseek对读写指针偏移。 无名管道有两个端:数据流入端和数据流出端,也叫写端和读端。它们是两个固定…