首页 > 其他分享 >EEPROM M24C64替换AT24C64出现读取数据为0xff情况解决办法

EEPROM M24C64替换AT24C64出现读取数据为0xff情况解决办法

时间:2023-12-22 12:44:49浏览次数:36  
标签:__ AT24C64 M24C64 读取数据 SCL SDA IIC I2C NOP

EEPROM M24C64替换AT24C64出现读取数据为0xff情况解决办法

硬件情况

STM32F103CBT6+模拟IIC,主频72MHz,IIC上拉电阻3.3kΩ

 

出现原因

  • 在IIC停止信号上,SCL、SDA翻转间隔不足以被M24C64识别,导致读写出错。
    修改前IIC停止代码如下:
void I2C_Stop(void)
{
    I2C_SCL_LOW();
    I2C_SDA_LOW(); // STOP:when CLK is high DATA change form low to high
    Delay_us(1);
    I2C_SCL_HIGH();
    I2C_SDA_HIGH(); // 发送I2C总线结束信号
    Delay_us(1);
}

  • 使用NOP指令测试M24C64能识别的最小翻转间隔代码如下:
void I2C_Stop(void)
{
    I2C_SCL_LOW();
    I2C_SDA_LOW(); // STOP:when CLK is high DATA change form low to high
    Delay_us(1);
    I2C_SCL_HIGH();

    __asm__ volatile("NOP");
    __asm__ volatile("NOP");
    __asm__ volatile("NOP");
    __asm__ volatile("NOP");
    __asm__ volatile("NOP");
    __asm__ volatile("NOP");

    I2C_SDA_HIGH(); // 发送I2C总线结束信号
    Delay_us(1);
}

测试

  • 在72MHz频率下,使用400MHz采样率的逻辑分析仪测得加NOP延时前翻转延时为57.5ns,无法被M24C64识别。
    image

  • 其余条件不变情况下,增加6条NOP指令后,翻转延时为142.5ns,M24C64可以识别,读写正常。
    image

  • 六条指令周期时长约 6 * 1 / 72000000 * 10^9=83.33ns约等于142.5-7.5=85ns

结论

  • 为了兼容多种IIC设备,在使用模拟IIC程序时,IIC停止等信号SDA、SCL间翻转应加适当延时,避免无法识别的情况。
  • 在此情况下应确保翻转延时大于142.5ns的极限延时,实际使用中应留有余量,可使用1us等常见延时。
void I2C_Stop(void)
{
    I2C_SCL_LOW();
    I2C_SDA_LOW(); // STOP:when CLK is high DATA change form low to high
    Delay_us(1);
    I2C_SCL_HIGH();
    Delay_us(1);//翻转延时,确保IIC设备能识别
    I2C_SDA_HIGH(); // 发送I2C总线结束信号
    Delay_us(1);
}


标签:__,AT24C64,M24C64,读取数据,SCL,SDA,IIC,I2C,NOP
From: https://www.cnblogs.com/ymchen/p/17921350.html

相关文章

  • CPU处理数据 vs IO读取数据
    CPU密集型(文件/数据的复杂) 指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPULoading100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPULoading很高。CPU密集的意思该任务需要大量的运算,而没有阻塞,CPU一直全速运行。......
  • 【ASP】读取数据库并显示字段的值例子
    1、不循环的例子,只有一条记录<% SetRs=Server.Createobject("Adodb.Recordset") sql="selecttop1*fromRc_SFZtmkg" Rs.opensql,conn,1,1 sfzDay=rs("tmbj")'把字段值赋值给变量 Rs.Close SetRs=Nothing%>显示 <td><%=Rs("t......
  • helloword执行过程,cpu从内存中读取数据
    1.cpu通过地址总线发出指令告诉内存控制器,我要操作哪块内存2.cpu通过控制总线向内存控制器发出读/写指令3.cpu通过数据总线,操作内存鼠标点击HelloWorld运行过程:1.点击鼠标,鼠标会发一个机器变更号---->usb控制器把信号传给---->系统总线---->南桥----->北桥---->cpu......
  • readline,readlines读取数据,为空原因
     对同一文件同时使用read()和readline()/readlines()函数注意点:使用了read()函数以后,文件流被占用,所以f.readline()和f.readlines()函数读出的结果均为空。使用了readlines()后,在使用readline()得到的也会是空,readlines占用了整个文件流。使用了readline(),再使用readlines(),是......
  • 从一个txt文件中读取数据,并且再把读取到的数据修改为想要的格式,再逐行写入到另一个txt
    packageservice;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.List;/***从一个txt文件中读取数据,并且再把读取到的数据修改为想要的格......
  • Netty源码学习5——服务端是如何读取数据的
    系列文章目录和关于我零丶引入在前面《Netty源码学习4——服务端是处理新连接的&netty的reactor模式》的学习中,我们了解到服务端是如何处理新连接的,即注册ServerSocketChannel对accept事件感兴趣,然后包装ServerSocketChannel为NioServerSockectChannel,最后由主Reactor在循环中利......
  • pandas写入和读取数据基本操作
    按行存储数据的二维列表写入数据到Excelimportpandasaspd#定义列表数据data=[['id','姓名','国家'],[1.0,'曹操','魏国'],[2.0,'刘备','蜀国'],[3.0,'孙权','吴国'],[4.0,......
  • 嵌入式linux SD读取数据导致死机问题
    一、碰到的问题通过ssh命令将文件写入到SD卡中,发现有一张SD卡(金士顿)可以成功写入,而另一张SD(闪迪)一直写入失败。应用层读取文件时,有一张SD卡(金士顿)可以成功读取数据;另一张SD卡(闪迪)有很大的概率会导致司机。二、SD卡驱动硬件电路图1.SD卡驱动硬件电路三、调试过程查看......
  • Angular 应用如何从 Transfer State 状态中读取数据
    在Angular应用程序中,数据的传递和共享是一个重要的问题。Angular提供了多种机制来处理这个问题,其中之一就是TransferState机制。本文将深入探讨上述代码中的AngularTransferState的用法,并介绍如何在Angular应用中有效地利用它。AngularTransferState简介AngularTransferS......
  • Java基础 字节输入流 读取数据 的两个方法API
    public int read()  →  一次读取一个字节数据public int read(byte[] buffer)  →  一次读取一个字节数组的数据,每次读取都会尽可能把数组装满我们创建的数组的长度尽量是1024的整数倍,例如1024*1024*5的长度 ......