求助:EEPROM 24C64等的程序(C51)不能用,帮看看? 点击:956 | 回复:0



新生代

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 8回
  • 年度积分:0
  • 历史总积分:32
  • 注册:2007年7月14日
发表于:2007-07-24 12:28:00
楼主
程序如下(其中问题已经在程序中给出了,就是在送出控制字后,ACK就是没办法得到0,所以没办法执行下去了,我都搞了两天了,郁闷呀,谁用过24CXX系列的,能帮帮忙吗,谢谢):
/*一个通用的24C01-24C256共9种EEPROM的字节读写操作程序, 
此程序有五个入口条件,分别为读写数据缓冲区指针, 
进行读写的字节数,EEPROM首址,EEPROM控制字节, 
以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:*/ 

#include "reg51.h"
#include "intrins.h"
#pragma ot(6,SIZE)

sbit SDA=P2^1;
sbit SCL=P2^0;
sbit P1_7=P1^7;
sbit P1_6=P1^6;
#define  ERRORCOUNT 10
enum
 eepromtype1{M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256} ;
enum eepromtype1 EEPROMTYPE1;

//DataBuff为读写数据输入/输出缓冲区的首址 
//ByteQuantity 为要读写数据的字节数量 
//Address 为EEPROM的片内地址 
//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1, 
//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址; 
//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256; 
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功; 
//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1 
//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1; 
//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了; 

bit rw24xx(unsigned char *databuff,unsigned char bytequantity,unsigned int add,
                               unsigned char ctlbyte,enum eepromtype1 EEPROMTYPE1)
{
 void delay(unsigned char delaycount);
 void iicstart(void);
 void iicstop(void);
 bit iicrecack(void);
 void iicnoack(void);
 void iicack(void);
 void iicsendbyte(unsigned char sendbyte);
 unsigned char iicreceivebyte(void);
 unsigned char data j,i=ERRORCOUNT;
 bit errorflag=1;
 while(i--)
 {
  iicstart();
  iicsendbyte(ctlbyte&0xfe);
     P1_6=!P1_6;                                        
   //P1_6接LED,测试用,,
  if(iicrecack())
   continue;
   P1_6=!P1_6;                       
     // 问题就在这 ,ACK不为0
  if(EEPROMTYPE1>M2416)
  {
   iicsendbyte((unsigned char)(add>>8));
   if(iicrecack())
    continue;
  }
  iicsendbyte((unsigned char)add);
  if(iicrecack())
   continue;
   if(!ctlbyte&0x01)
    {
 j=bytequantity;  //page write 
 errorflag=0;  //clr errorflag
 while(j--)
  {
   iicsendbyte(*databuff++);
   if(!iicrecack())
   continue;
   errorflag=1;
   break;
  }
    if(errorflag==1)
 continue;
 break;
}
   else
    {
 iicstart();
 iicsendbyte(ctlbyte);
 if(iicrecack())
  continue;
  while(--bytequantity)
  {
   *databuff++=iicreceivebyte();
   iicack();
  }
  *databuff=iicreceivebyte();
  iicnoack();
  errorflag=0;
  break;
}
 }
 ii


热门招聘
相关主题

官方公众号

智造工程师