45°青年 2023-03-25 18:22 采纳率: 83.3%
浏览 37
已结题

使用AT24C02时数据读取错误的问题

请问使用AT24C02先存储数据后读取数据,总线应答位都正常(为0),但是读取不出来数据,有什么可能的原因么

驱动代码如下
/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/
#include "AT24C02.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
 
//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
 
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;    
}
//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;                      // 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}
 
//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
    
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}
 
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;
 
    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}
 
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
        SCL = 1;
    IIC_Delay(DELAY_TIME);
    da <<= 1;
    if(SDA) da |= 1;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    }
    return da;    
}
 
void IIC_DAC_XieData(unsigned char date){
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(0x40);
    IIC_WaitAck();
    IIC_SendByte(date);
    IIC_WaitAck();
    IIC_Stop();
}
 
unsigned char IIC_ADC_GetData(unsigned char di_zhi){
    unsigned char date;
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(di_zhi);
    IIC_WaitAck();
    IIC_Stop();
    IIC_Start();
    ET1=0;
    IIC_SendByte(0x91);
    IIC_WaitAck();
    date=IIC_RecByte();
    ET1=1;
    IIC_SendAck(1);
    IIC_WaitAck();
    IIC_Stop();
    return date;
    
}
 
unsigned char IIC_EEPROM_XieData(unsigned char di_zhi,date){
    unsigned char u;
    IIC_Start();
    IIC_SendByte(0xA0);
    IIC_WaitAck();
    IIC_SendByte(di_zhi);
    IIC_WaitAck();
    IIC_SendByte(date);
    u=IIC_WaitAck();
    IIC_Stop();
    return u;
}
unsigned char IIC_EEPROM_GetData(unsigned char di_zhi){
    unsigned char date=0,u;
    IIC_Start();
    IIC_SendByte(0xa0);
    IIC_WaitAck();
    IIC_SendByte(di_zhi);
    IIC_WaitAck();
    //IIC_Stop();
    IIC_Start();
    IIC_SendByte(0xa1);
    IIC_WaitAck();
    date=IIC_RecByte();
    IIC_SendAck(1);
    //IIC_WaitAck();
    IIC_Stop();
    return date;
}


  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-25 20:12
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • IT_service_mesh 2023-03-25 18:25
    关注

    参考GPT和自己的思路:可能的原因如下:

    1. AT24C02芯片的硬件故障,例如芯片烧坏或损坏。

    2. IIC总线的操作有误,例如数据发送时没有等待应答,或者读取数据时没有正确处理应答位。

    3. 地址设定有误。在存储数据的时候,可能没有正确设置芯片内部的地址指针,导致数据无法读取。

    4. 频率或者时序设置有误。在IIC总线通讯的过程中,两端的时序和工作频率都需要一致,如果设置错误就会导致读取错误或者无法读取。

    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 Qt 不小心删除了自带的类,该怎么办
  • ¥15 我需要在PC端 开两个抖店工作台客户端.(语言-java)
  • ¥15 有没有哪位厉害的人可以用C#可视化呀
  • ¥15 可以帮我看看代码哪里错了吗
  • ¥15 设计一个成绩管理系统
  • ¥15 PCL注册的选点等函数如何取消注册
  • ¥15 问一下各位,为什么我用蓝牙直接发送模拟输入的数据,接收端显示乱码呢,米思齐软件上usb串口显示正常的字符串呢?
  • ¥15 Python爬虫程序
  • ¥15 crypto 这种的应该怎么找flag?
  • ¥15 代码已写好,求帮我指出错误,有偿!