首页 分享 I2C读写EEPROM(AT24C02)Q&A

I2C读写EEPROM(AT24C02)Q&A

来源:花匠小妙招 时间:2025-12-21 01:12


传输时序:
    1.器件地址通过AT24C02上的A0、A1、A2三个地址位引脚提前设定;
    2.地址指的是挂载在总线上的存储的器件的地址;
    3.器件内部的存储地址是第一个要发送的数据(Data1);

SCB寄存器:
    位于内核中;

为什么要使用中断:
    硬件按SCL时序完成数据收发和ACK检测后,触发中断,中断服务函数读取硬件的状态标志,确认操作是否成功,再指挥硬件执行后续的数据发送/接收动作;

    若在轮询模式下使用while循环,CPU会死等应答信号,造成CPU资源浪费,ACK 检测是硬件的活,CPU 不参与、不等待,全程可以处理其他任务,仅当硬件检测到ACK结果(成功/失败)然后触发中断触发时CPU才花极短时间处理结果,这正是中断模式效率高的核心原因;

多地址模式中的第二地址:
    为挂载更多的设备在总线上;

    Debug时遇到的问题:
    1.在循环处打断点,设置循环次数,出现debug不停的现象,可以选择程序中的行号打断点,也可以选择汇编指令中的地址号打断点,ctrl+b调出菜单define断
    点位置和循环次数;
    2.设置条件断点 define a = 10
    3.在读写内存的时候设置断点,通过选择菜单中的read或write并写入要监测的变量;

I2C的数据传输:
    采用半双工的传输方式,主从设备通过地址帧握手实现数据传输;

I2C的数据寄存器:
    同SPI一样,I2C外设中的数据寄存器也是数据收发的窗口,不是正真的buffer寄存器;

Systick:
    是CM4的内核外设,其中重装载寄存器的值递减到0,触发一次中断,VAL保存的是当前倒计数的值,若需记录触发中断的次数需要软件记录;

数据传输时的状态读取:
    由软件记录Systick的中断次数,为等待状态设定等待时间上限,防止死等;

          数据流向:
    由stm32向eeprom写:32的内存(pBuffPtr指针,指向的时32内存中的一块区域,里面保存有要写入的内容) -> i2c外设(数据寄存器) —> 通过i2c总线到eeprom 

由stm32从eeprom读:eeprom通过i2c总线 -> i2c外设的数据寄存器 -> 32内存

             
为什么在向寄存器写入后又读一遍:   

SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);
/* Delay after an RCC peripheral clock enabling */
tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);    
UNUSED(tmpreg);
    为了实现硬件同步,在软件写入之后,寄存器会更新内容,在读的过程中会检查寄存器中的数据是否稳定,从而实现硬件同步的目的;

遇到了一次Debug显示的Pin值与程序中选择的Pin不一致:
    重新编译了一次再次Debug又一致了,可能时编译器缓存或硬件调试器缓存的问题;

为什么在 HAL_I2C_MspInit 函数里先强制复位I2C再释放复位:
    1.清理 “烂摊子”:保证 I2C 从一个干净、已知的状态开始初始化,清除之前可能残留的错误或异常设置。
    2.配合硬件启动:硬件要求这样做,能让 I2C 与其他部分在启动时同步,还能等时钟和电源稳定后再正常工作。
    3.规范与通用:遵循 HAL 库设计规范,形成标准流程,方便维护和移植,也为错误恢复提供基础。
    该函数会在HAL_I2C_Init中调用;
 

相关知识

单片机STC89C52RC 内部EEPROM
【STM32Cube
21. 常用存储器介绍 — [野火]GD32 H7库开发实战指南——基于野火GD32H737开发板 文档
21. 常用存储器介绍 — [野火]GD32 F303库开发实战指南——基于野火GD32F303系列开发板 文档
IDL读写操作
温湿度控制器
Python 文件操作中的读写模式:open(path, ‘
8个经典智能电子锁方案精选合辑
Android 存储学习之在外部存储中读写文件
MI 小米 9290022200 专业读写护眼台灯 379元

网址: I2C读写EEPROM(AT24C02)Q&A https://www.huajiangbk.com/newsview2512893.html

所属分类:花卉
上一篇: Node
下一篇: 男子花了94元从机场买下别人丢失

推荐分享