⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cs1611p.c

📁 存储芯片CS1611驱动,51单片机对CS1161读写数据。适用24C02芯片
💻 C
字号:
//**********************************************************
//**文件名:CS1611P.C
//**Copyright(c)2004-2006
//**创建人:
//**日  期:2006.1.13
//**修改人:
//**日  期:
//**描  述:EE存取函数
//**
//**版  本:ver1.0
//**_____________________________________
//***********************************************************/
#include <reg52.h>
#include <intrins.h>
#include "outdef.h"

#define PAGE_BYTES 16

#define WriteDevice1161  0xa0
#define ReadDevice1161  0xa1

#define	SomeNop(); _nop_();_nop_();_nop_();_nop_();_nop_();

sbit EE_SDA = 	P3^5;//P3^5;//
sbit EE_SCL = 	P3^6;

extern bit WR24c02Fg;

void 	Write8Bit(uchar input);
uchar 	Read8Bit(void);
bit 	TestAck();
bit 	Write_Data(uchar par1,uchar par2,uchar *Wdata,uint RomAddress);


//========================================================================
bit Read24c02(uchar *RamAddress,uint RomAddress,uchar bytes)
{
  	uchar romadh,romadl;

   	romadl=(uchar)(RomAddress%128);
   	romadh=(RomAddress%128)>>8;
	WR24c02Fg = 1;
	EE_SDA=1;SomeNop();EE_SCL=1;SomeNop();EE_SDA=0;SomeNop();EE_SCL=0;//Start();
   	Write8Bit(romadh|WriteDevice1161|((RomAddress/128)<<1));
   	if(!TestAck())
    	return false;
   	Write8Bit(romadl);
   	if(!TestAck())
    	return false;
	EE_SDA=1;SomeNop();EE_SCL=1;SomeNop();EE_SDA=0;SomeNop();EE_SCL=0;//Start();
   	Write8Bit(romadh|ReadDevice1161|((RomAddress/128)<<1));
   	if(!TestAck())
    	return false;
   	while(bytes!=1)
    {
      	*RamAddress=Read8Bit();
		EE_SDA=0;EE_SCL=1;SomeNop();EE_SCL=0;SomeNop();EE_SDA=1;//Ack();
      	RamAddress++;
      	bytes--;
    }
   	*RamAddress=Read8Bit();
   	EE_SDA=1;EE_SCL=1;SomeNop();EE_SCL=0;//NoAck();
   	EE_SDA=0;SomeNop();EE_SCL=1;SomeNop();EE_SDA=1;//Stop();
WR24c02Fg = 0;
  	Delay_1ms(10);
  	return true;
}

//========================================================================
bit Write24c02(uchar *Wdata,uint RomAddress,uchar number)
{
	uint i;
    uchar j;
	uchar par1,par2;

	i=RomAddress%8;
	j=PAGE_BYTES-i;
WR24c02Fg = 1;
    if(i==0)
    {
        par1 = 0;
        par2 = number;
        if(!Write_Data(par1,par2,Wdata,RomAddress))
        	return false;
    }
    else
    {
        if(j<number)
        {
            par1=j;
            par2=0;
            if(!Write_Data(par1,par2,Wdata,RomAddress))
            	return false;
            par1=0;
            par2=number-j;
            Wdata+=j;
            RomAddress+=j;
            if(!Write_Data(par1,par2,Wdata,RomAddress))
            	return false;
         }
         else
         {
            par1=number;
            par2=0;
            if(!Write_Data(par1,par2,Wdata,RomAddress))
            	return false;
         }
   	}
WR24c02Fg = 0;
    return true;
}

//========================================================================
bit Write_Data(uchar par1,uchar par2,uchar *Wdata,uint RomAddress)
{
    uchar romadh,romadl;
wtloop:
    romadl=(uchar)(RomAddress%128);
    romadh=(RomAddress%128)>>8;
	if((par1==0) && (par2==0)) return true;
	if(par1!=0) goto wtlp1;
	if(par2<=PAGE_BYTES)
	{
	   	par1=par2;
	   	par2=0;
	}
    else
    {
        par1=PAGE_BYTES;
        par2=par2-PAGE_BYTES;
    }
wtlp1:
	EE_SDA=1;SomeNop();EE_SCL=1;SomeNop();EE_SDA=0;SomeNop();EE_SCL=0;//Start();
	Write8Bit(romadh|(WriteDevice1161|((RomAddress/128)<<1)));
	if(!TestAck())
		return false;
    Write8Bit(romadl);
    if(!TestAck())
    	return false;
	for(;par1!=0;par1--)
	{
		Write8Bit(*Wdata);
		if(!TestAck())
			return false;
		Wdata++;
		RomAddress++;
	}
	EE_SDA=0;SomeNop();EE_SCL=1;SomeNop();EE_SDA=1;//Stop();
	Delay_1ms(20);
    goto wtloop;
}

//========================================================================
void Write8Bit(uchar input)
{
   uchar temp;

   for(temp=8;temp!=0;temp--)
    {
      EE_SDA=(bit)(input&0x80);
      EE_SCL=1;
      SomeNop();
      EE_SCL=0;
      input=input<<1;
      SomeNop();
    }
}

//========================================================================
uchar Read8Bit(void)
{
   uchar i=8;
   uchar uData=0;

   EE_SDA=1;
   while(i--)
    {
      uData<<=1;
      EE_SCL=0;
      SomeNop();
      EE_SCL=1;
      SomeNop();
      uData |=EE_SDA;
    }
   EE_SCL=0;
   return uData;
}

//========================================================================
bit TestAck()
{
    uchar errtime=255;

    EE_SDA=1; SomeNop();
    EE_SCL=1; SomeNop();
    while(EE_SDA)
    {
       	errtime--;
       	if(!errtime)
        {
           EE_SDA=0;SomeNop();EE_SCL=1;SomeNop();EE_SDA=1;//Stop();
       	   	return false;
        }
    }
    EE_SCL=0;
    return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -