登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

24C02怎么读出来是0xff,求助!

作者:mxinfa 栏目:单片机
24C02怎么读出来是0xff,求助!
先是自己写了一个不行,用网上广泛流传的下面这个程序还是不行,感觉这个程序写的挺清晰的,位定义已经根据实际硬件进行了定义,也换过片子,晶振11.0592,写保护脚已经接到0(没有写保护了),读出来总是0xff,两天了焦头烂额了,谢谢各位
//   24C02读写程序

  #define uCHAR unsigned CHAR
  #define uint unsigned int
  #include <reg52.h>
  #include <stdio.h>
  #include <absacc.h>
   sbit scl=P3^5;  //24C02 SCL
   sbit sda=P3^4;  //24C02 SDA

  sbit DOG=P1^7;  //狗
  uCHAR x24C02_read(uCHAR address);  //从24C02的地址address中读取一个字节数据
  void x24C02_write(uCHAR address,uCHAR info);  
  //向24C02的address地址中写入一字节数据info
  void x24C02_init();   //24C02初始化子程序
  void delay1(uCHAR x);
  void FLASH();
  void x24c01_init();
  void start();
  void stop();
  void writex(uCHAR j);
  uCHAR readx();
  void clock();
  void delay1(uCHAR x)
  {
     uint i;
     for(i=0;i<x;i++);
     DOG=~DOG;
  }
  void FLASH()
  {
//     uCHAR u;
     DOG=~DOG;
  }
  void x24C02_init()
  {
     scl=1; FLASH(); sda=1; FLASH();
  }
  void start()
  {
     sda=1; FLASH(); scl=1; FLASH(); sda=0; FLASH(); scl=0; FLASH();
  }
  void stop()
  {
     sda=0; FLASH(); scl=1; FLASH(); sda=1; FLASH();
  }
  void writex(uCHAR j)
  {
     uCHAR i,TEMP;
     TEMP=j;
     for (i=0;i<8;i++){
        TEMP=TEMP<<1; scl=0; FLASH(); sda=CY; FLASH(); scl=1;
  FLASH();
     }
     scl=0; FLASH(); sda=1; FLASH();
  }
  uCHAR readx()
  {
     uCHAR i,j,k=0;
     scl=0; FLASH(); sda=1;
     for (i=0;i<8;i++){
        FLASH(); scl=1; FLASH();
        if (sda==1) j=1;
        else j=0;
        k=(k<<1)|j; scl=0;
     }
     FLASH(); return(k);
  }
  void clock()
  {
     uCHAR i=0;
     scl=1; FLASH();
     while ((sda==1)&&(i<255))i++;
     scl=0; FLASH();
  }
  uCHAR x24C02_read(uCHAR address)
  {
     uCHAR i;
     start(); writex(0xa0);
     clock(); writex(address);
     clock(); start();
     writex(0xa1); clock();
     i=readx(); stop();
     delay1(10);
     return(i);
  }
  void x24C02_write(uCHAR address,uCHAR info)
  {
     EA=0;
     start(); writex(0xa0);
     clock(); writex(address);
     clock(); writex(info);
     clock(); stop();
     EA=1;
     delay1(50);
  }



2楼: >>参与讨论
ayb_ice
传个给你,但只有连续读功能
/*----------------------------------------------------------------------
*----------------------------------------------------------------------
*
*                        优 利 德 集 团 有 限 公 司
*                 U N I-T R E N D  G R O U P  L I M I T E D
*                       http: //www.uni-trend.com.cn
*
*----------------------------------------------------------------------
* 文 件 名: AT24C02.c
* 创 建 人: 艾艳斌(E-mail:ayb_ice@yahoo.com.cn)
* 版    本: V1.0 / 2007-03-23
* 描    述: ATMEL 24C02模拟IIC程序(只有连续读)
*----------------------------------------------------------------------
* 修 改 人:
* 版    本:
* 描    述:
*----------------------------------------------------------------------
*----------------------------------------------------------------------
*/

//传个给你,但只有连续读功能,这是我前段时间回复的帖子,基本程序都有,很容易添加其它程序


sbit IIC_SDA = P1^3;
sbit IIC_SCL = P1^2;


#define U8 unsigned CHAR

#define _2402_READ      0xA1    // 读
#define _2402_WRITE     0xA0    // 写

#define IIC_FALSE       0       // 失败
#define IIC_TRUE        1       // 成功

#define IIC_ACK         0       // ACK
#define IIC_NACK        1       // NACK

#define IIC_DELAY 20            // 根据CPU速度适当修改



//------------------------------------------------------
// iic_delay
//------------------------------------------------------
//
// I2C延时
//
void iic_delay(void)
{
    U8 delay;

    delay = IIC_DELAY;
    while(delay) delay--;
}

//------------------------------------------------------
// iic_start
//------------------------------------------------------
//
// I2C开始信号
//
void iic_start(void)
{
    IIC_SDA = 1;
    IIC_SCL = 1;
    iic_delay();

    IIC_SDA = 0;
    iic_delay();
    IIC_SCL = 0;
    IIC_SDA = 1;
}
//------------------------------------------------------
// iic_stop
//------------------------------------------------------
//
// I2C停止信号
//
void iic_stop(void)
{
    IIC_SDA = 0;
    iic_delay();
    IIC_SCL = 1;
    iic_delay();
    IIC_SDA = 1;

    iic_delay();
    IIC_SCL = 0;
}
//------------------------------------------------------
// iic_send
//------------------------------------------------------
//
// 发送一个字节
// byte = 数据
// 返回: IIC_FALSE = 失败, IIC_TRUE = 成功
//
U8 iic_send(U8 byte)
{
    U8 i;

    for(i=8; i; i--){
        byte <<= 1;
        IIC_SDA = CY;
        iic_delay();
        IIC_SCL = 1;
        iic_delay();
        IIC_SCL = 0;
    }
    iic_delay();
    IIC_SDA = 1;
    iic_delay();
    IIC_SCL = 1;
//-----------------------------------
// 等待从机应答,超时失败自动退出
    for(i=0xFF; i; i--){
        if(!IIC_SDA){
            IIC_SCL = 0;
            return IIC_TRUE;
        }
    }

    iic_stop();
    return IIC_FALSE;
}

//------------------------------------------------------
// iic_receive
//------------------------------------------------------
//
// 接收一个字节
// ack : 应答信号ACK或NACK
// 返回: 接收的字节
// 注: 软件模拟方式无法判断是否成功或失败,所以总是成功
//
U8 iic_receive(U8 ack)
{
    U8 i;
    U8 TEMP;

    IIC_SDA = 1;
    TEMP = 0;
    for(i=8; i; i--){
        TEMP <<= 1;
        IIC_SCL = 1;
        iic_delay();
        if(IIC_SDA) TEMP++;
        IIC_SCL = 0;
        iic_delay();
    }
//-----------------------------------
// 主机应答从机
//  IIC_SDA = 0;    // ACK
    IIC_SDA = ack;  // ACK or NACK =>2007-02-06
    iic_delay();
    IIC_SCL = 1;
    iic_delay();
    IIC_SCL = 0;

    iic_delay();
    IIC_SDA = 1;    // 接收结束时IIC_SDA=1
    return TEMP;
}
//------------------------------------------------------
// lm75a_xread
//------------------------------------------------------
//
// LM75A连续读
// register_add = 寄存器地址(0~3)
// NUMBER = 连续读字节数
// pi = 数据保存地址
// 返回: IIC_FALSE = 失败, IIC_TRUE = 成功
// 注: 为了简化软件,只有连续读,没有单字节读,但定义有单字节读宏
//
U8 iic_xread(U8 register_add, U8 NUMBER, U8* pi)
{
    iic_start();
    if(iic_send(_2402_WRITE) == IIC_FALSE){
        return IIC_FALSE;
    }
    if(iic_send(register_add) == IIC_FALSE){
        return IIC_FALSE;
    }
    iic_start();
    if(iic_send(_2402_READ) == IIC_FALSE){
        return IIC_FALSE;
    }
    for( ; NUMBER; NUMBER--){
        if(NUMBER == 1)
            pi[0] = iic_receive(IIC_NACK);      // 读取最后一个字节
        else
            pi[0] = iic_receive(IIC_ACK);     
3楼: >>参与讨论
mxinfa
马上测,有结果公布
马上测,有结果公布

4楼: >>参与讨论
mxinfa
读出来还是0xff
是不是前面我自己的程序就没有写进去啊?
写保护我是用一个18欧的电阻接地的,没有关系吗?用表量确实是低
ayb_ice麻烦再传个写的函数好吗?谢谢

5楼: >>参与讨论
mxinfa
用了两个版本的写的函数读出来还是0xff
试了两个版本的写函数读出来还是0xff,板子上这片24C02至少还能读出来0xff,试了其他三片,一片AT24C02,两片24C04厂家看不清好像是st chn,连什么东西都读不出来,不会碰到了传说中的假片了吧?
大家给个建议呀?
ayb_ice怎么看?

6楼: >>参与讨论
qjy_dali
2楼I2C的程序写的和我的几乎一样!
 
7楼: >>参与讨论
ayb_ice
传个字节写的部分给你
//------------------------------------------------------
// iic_send
//------------------------------------------------------
//
// 发送一个字节,失败后会停止总线(发送stop)
// byte = 数据
// 返回: IIC_FALSE = 失败, IIC_TRUE = 成功
//
U8 iic_send(U8 byte)
{
    U8 i;

    for(i=8; i; i--){
        byte <<= 1;
        IIC_SDA = CY;
        iic_delay();
        IIC_SCL = 1;
        iic_delay();
        IIC_SCL = 0;
    }
    iic_delay();
    IIC_SDA = 1;
    iic_delay();
    IIC_SCL = 1;
//-----------------------------------
// 等待从机应答,超时失败自动退出
    for(i=0xFF; i; i--){
        if(!IIC_SDA){
            IIC_SCL = 0;
            return IIC_TRUE;
        }
    }
//-----------------------------------
// 失败停止总线
    iic_stop();
    return IIC_FALSE;
}
//------------------------------------------------------
// iic_write
//------------------------------------------------------
//
// 写一个字节
// address = LCD RAM 数据地址
// lcd_data = 数据
// 返回: IIC_FALSE = 失败, IIC_TRUE = 成功
//
U8 iic_write(U8 address, U8 lcd_data)
{
    iic_start();
    if(iic_send(_2402_WRITE) == IIC_FALSE){
        return IIC_FALSE;
    }
    if(iic_send(address) == IIC_FALSE){
        return IIC_FALSE;
    }
    if(iic_send(lcd_data) == IIC_FALSE){
        return IIC_FALSE;
    }
    iic_stop();
    return IIC_TRUE;
}

参与讨论
昵称:
讨论内容:
 
 
相关帖子
求教:利用51单片机制作的数字温度计
ARM新手请教啊
请问单片机是不是自动循环的
急,找不到编程方式?
做基于B/S的嵌入式WEB,实现信息的交互,用HTML行吗?还是用CGI?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号