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

使用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
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 python使用python-pptx如何给幻灯片添加只读密码。
  • ¥15 深度神经网络传递自变量损失
  • ¥15 删除s的前驱节点,但是不知道错哪里了
  • ¥15 oracle数据库备份表如何操作
  • ¥15 软件定义网络mininet和onos控制器问题
  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错