打印

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

[复制链接]
7287|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxinfa|  楼主 | 2007-3-31 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
flash, TE, AD, sd, ST
先是自己写了一个不行,用网上广泛流传的下面这个程序还是不行,感觉这个程序写的挺清晰的,位定义已经根据实际硬件进行了定义,也换过片子,晶振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);
  } 

相关帖子

沙发
mxinfa|  楼主 | 2007-3-31 16:55 | 只看该作者

马上测,有结果公布

马上测,有结果公布

使用特权

评论回复
板凳
mxinfa|  楼主 | 2007-3-31 16:58 | 只看该作者

读出来还是0xff

是不是前面我自己的程序就没有写进去啊?
写保护我是用一个18欧的电阻接地的,没有关系吗?用表量确实是低
ayb_ice麻烦再传个写的函数好吗?谢谢

使用特权

评论回复
地板
mxinfa|  楼主 | 2007-3-31 17:17 | 只看该作者

用了两个版本的写的函数读出来还是0xff

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

使用特权

评论回复
5
qjy_dali| | 2007-3-31 18:49 | 只看该作者

2楼I2C的程序写的和我的几乎一样!

使用特权

评论回复
6
ayb_ice| | 2007-4-2 08:18 | 只看该作者

传个字节写的部分给你

//------------------------------------------------------
// 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;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

199

帖子

1

粉丝