打印

24c16子程序不能连续读写字节,真晕死了.如何解决啊?!

[复制链接]
3711|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-9-26 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一个程序不能用,第二个程序只能一个字节一个字节读写,不能连续读写,有什么办法解决我下面这个子程序问题??多谢!
nclude "reg52.h"
#include "absacc.h"
#include "math.h"
#include "stdio.h"
#include "intrins.h"
#include "ad7896h.h"
#include "ds18b20h.h"
#include "timer.h"
#include "24c16.h"
#include "keyh.h"
#include "dac.h"
#include "pwmh.h"

uchar IDATA c_SumValue[7];
uchar IDATA VlotageSum[7];
void delay10(uint x);
void I_init(void);


void wait(void)
{
  byte i=50;
  for(i=0;i<8;i++);
}
void delay10(uint x)
{
  uint i=0;
  for(i=0;i<x;i++)
   _nop_();
}
void I_init(void)
{
  SCL = 1 ;
  SDA=1  ;
  wait();
}    
/*
void start_bit(void)
{
SCL=1;_nop_();
SDA=1;_nop_();
SDA=0;_nop_();
SCL=0;_nop_();
}

void stop_bit(void)
{
SDA=0;_nop_();
SCL=1;_nop_();
SDA=1;_nop_();
}

void mast_ack(void)
{
SCL=0;_nop_();
SDA=0;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
SDA=1;_nop_();
}

void ack(void)
{
//unsigned char i=0;    
SDA=1;
SCL=0;_nop_();
SCL=1;_nop_();
//while(SDA){;}
//while((SDA==1)&&(i<255))i++;
_nop_();
wait();
SCL=0;_nop_();
}

void no_ack(void)
{
//unsigned char i=0;
SDA=1;_nop_();
SCL=1;_nop_();
//while(SDA){;}
//while((SDA==1)&&(i<255))i++;
_nop_();
wait();
SCL=0;_nop_();
}

write_8bit(uchar ch)
{
uchar i=8;
SCL=0;_nop_();
while(i--)
{
SDA=(bit)(ch&0x80);_nop_();
ch<<=1;
SCL=1;_nop_();
SCL=0;_nop_();
}
}

uchar read24c16(uint address)
{
//unsigned char page=(address/256)<<1;
uchar data rdata;
uchar i=8;
EA=0;//
start_bit();
//write_8bit(OP_WRITE|page);
write_8bit(0XA0);
ack();
write_8bit(address);
ack();//αд
start_bit();
//write_8bit(OP_READ|page);
write_8bit(0XA1);
ack();
while(i--)
{
rdata<<=1;
SCL=0;_nop_(); SCL=1;_nop_();
if(SDA) rdata|=0x01;
}
no_ack();
stop_bit();
EA=1;
return rdata;
}

void write24c16(uint address,uchar ddata)
{
//unsigned char page=(address/256)<<1;
EA=0;  //
start_bit();
//write_8bit(OP_WRITE|page);
write_8bit(0XA0);
ack();
write_8bit(address);
ack();
write_8bit(ddata);
ack();
stop_bit();
EA=1;
//delay10(10);
}

void page_wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
//unsigned char page=(firstw_ad/256)<<1;
uchar data *ufirstr_ad;
ufirstr_ad=firstr_ad;
start_bit();
//write_8bit(OP_WRITE|page);
write_8bit(0XA2);
ack();
write_8bit(firstw_ad);
ack();
while(counter--)
{
write_8bit(*ufirstr_ad);
ufirstr_ad++;
ack();
}
stop_bit();
//delay10(10);
}

void page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad)
{
//unsigned char page=(firstrd_ad/256)<<1;
uchar j=8;
uchar data *ufirstwr_ad;
ufirstwr_ad=firstwr_ad;
start_bit();
//write_8bit(OP_WRITE|page);
write_8bit(0XA2);
ack();
write_8bit(firstrd_ad);
ack();
start_bit();
//write_8bit(OP_READ|page);
write_8bit(0XA3);
ack();
while(count--)
{
uchar i=8;
while(i--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
ufirstwr_ad++;
mast_ack();
}
while(j--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
no_ack();
stop_bit();
}

void read_wri16(void)
{
    
    c_SumValue[0]=VariablePi&0xff;
    c_SumValue[1]=(VariablePi&0xff00)>>8;
    page_wr(0,2,c_SumValue);
    page_rd(0,2,c_SumValue);
    VariableVl=VlotageSum[1]*256+VlotageSum[0];
    VariableVl=VariableVl&0xfff;  
}
*/
void ack(void)
{
unsigned char i=0;    
SDA=1;
SCL=0;_nop_();
SCL=1;_nop_();
while((SDA==1)&&(i<255))i++;
_nop_();
SCL=0;_nop_();
}
void I_start(void)
{
  SCL = HIGH ;
  wait();
  SDA=LOW;
  wait();
  SCL=LOW;
  wait();

void I_stop(void)
{
  SDA=LOW;
  wait();
  SCL = HIGH ;
  wait();
  SDA=HIGH  ;
  wait();
  SCL=LOW;
  wait();
}
void I_send(byte a)
{
   byte i;
   for(i=0;i<8;i++)
   {
     if(a & 0x80)
      SDA=HIGH;
     else
      SDA=LOW;
     a=(a<<1);
     SCL = HIGH ;
     wait();
     SCL=LOW;
     wait();
   }
   SDA=HIGH;
   wait();
   SCL = HIGH ;
   wait();
   SCL=LOW;
   wait();
}
byte I_receive(void)
{
  byte a=0;
  byte i;
  for(i=0;i<8;i++)
  {
    a = a*2;
    SCL = HIGH ;
     wait();
    if(SDA) 
     a |= 1;
    SCL=LOW;
     wait(); 
  }
  SDA=HIGH;
   wait();
  return(a);
}
void I_addres_wri(byte ds,byte x,byte a)
{
  I_start();
  I_send(ds);
  I_send(x);
  I_send(a);
  I_stop();
  delay10(0x500);
}
byte I_addres_red(byte ds,byte x)
{
  byte a;
  I_start();
  I_send(ds);
  I_send(x);
  I_start();
  I_send(ds+1);
  a=I_receive();
  I_stop();
  return(a);
}
void wri_n(uchar z,uchar * x,uchar y,byte ds)

{
  uchar i;
  uchar a;
  for(i=0;i<y;i++)
  {
    a=*(x+i);
    I_addres_wri(ds,z+i,a);
  }
}
 rea_n(uchar z,uchar * x,uchar y,byte ds)
{
  uchar i;
  for(i=0;i<y;i++)
  {
    *(x+i)=I_addres_red(ds,z+i);
  }
}

void read_wri16(void)
{
    c_SumValue[0]=VariablePi&0xff;
    c_SumValue[1]=(VariablePi&0xff00)>>8;
    wri_n(0,c_SumValue,2,0xa2);
    rea_n(0,VlotageSum,2,0Xa2);
    VariableVl=VlotageSum[1]*256+VlotageSum[0];
    VariableVl=VariableVl&0xfff;
}

相关帖子

沙发
古道热肠| | 2007-9-26 17:10 | 只看该作者

哈哈,原来是你

  自己想办法去搞定,这个不难的。

使用特权

评论回复
板凳
lbx_00| | 2007-9-26 19:51 | 只看该作者

就是不能连续,有内部操作时间的,

使用特权

评论回复
地板
ayb_ice| | 2007-9-27 07:39 | 只看该作者

就是不能连续,有内部操作时间的,

使用特权

评论回复
5
yezhenyu| | 2007-9-27 08:15 | 只看该作者

俺用过24LC32可以连续读写,可惜是汇编的。

使用特权

评论回复
6
xzhenggen|  楼主 | 2007-9-27 08:34 | 只看该作者

古版主你是谁啊?我加了你的QQ,能否发一个即时消息告诉我

使用特权

评论回复
7
zhaoyu2005| | 2007-9-27 08:44 | 只看该作者

我有24c02的,C51的要不?

还没有用到24c16的,印象中C16的好像页是16字节,不知记错没?

使用特权

评论回复
8
古道热肠| | 2007-9-27 08:59 | 只看该作者

QQ上那么多叫“古道热肠”的

   就看大家还能否认得出我来,认出来了算有缘分,交流交流。

使用特权

评论回复
9
ayb_ice| | 2007-9-27 09:00 | 只看该作者

粗略看了下,也没有什么问题...

只是程序有点乱,也没返回什么成功,失败值,可靠性较差...
仔细整理一下问题不大...

使用特权

评论回复
10
xzhenggen|  楼主 | 2007-9-27 12:33 | 只看该作者

重写一个算了,TNND这么麻烦。

使用特权

评论回复
11
xzhenggen|  楼主 | 2007-9-27 13:29 | 只看该作者

我的板上是这样接的:

#1 A0  接地
#2 A1 接地
#3 A2 接地
#4 GND 接地
#5 SDA P3^5
#6 SCL P3^4
#7 WP 接地
#8 VCC 5V

使用特权

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

本版积分规则

55

主题

529

帖子

1

粉丝