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

📄 96c66.c

📁 通过单片机实现对AT93C66进行控制
💻 C
字号:
/*******************************************************
93C46,93C66读写程序
93C46,93C66是通用的4线SPI串行总线的EEprom
分为16位和8位读写模式
以下是8位数据模式下93C46,93C66的通用读写程序
C51编写
*******************************************************/
#include "93c66.h"
/*93c66 操作子程序 */
/* 注意:这里使用的93c66 为8 位结构的EEROM*/
void delay1(uint num)
{
  while(num!=0){num=num-1;}
}
/***********************************************************************/
/*名称: START_93c66() */
/*说明: 用于93c66 的启动,防止由于CS_93c66 的改动而引起数据时序混乱 */
/***********************************************************************/
void START_93c66()
{
    // DIO_93c66=1; //防止DO 由于是低电平而无法输入
	// CS_93c66=1;
	 //开启93c66
	 CS_93c66=0;
	 DIO_93c66=0;
	 SK_93c66=0;
	 delay1(200);
	 CS_93c66=1;
}
/***************************************************************************/
/*名称:END_93c66() */
/*说明:用于93c66 的结束,防止由于CS_93c66 的改动而引起数据线为0 而无法输入*/
/***************************************************************************/
void END_93c66()
{
 CS_93c66=0;
 DIO_93c66=1;
 SK_93c66=1;
}
/***********************************************************************/
/*名称:SEND_DATA_93c66() */
/*说明:在93c66 启动下,送入指定位数的数据 */
/*输入: op_data 要输入的数据 */
/* num 输入的位数 */
/**********************************************************************/
void SEND_DATA_93c66(uint op_data,uchar num)
{
 uchar temp1;
 op_data=op_data<<(16-num); /*左移去掉无用位*/
 for(temp1=0;temp1<num;temp1++)
  {
	  if((op_data&0X8000)==00)
	   {DIO_93c66=0;}
	  else
	   {DIO_93c66=1;}
	  SK_93c66=1;//SK_93c66=1;SK_93c66=1;SK_93c66=1;
	  delay1(200);
	  SK_93c66=0;
	  delay1(200);
	  op_data=op_data<<1;
  }
}
/***********************************************************************/
/*名称: EWEN_93c66() */
/*说明: 93c66 的编程启动.操作码(100 11XXXXXXX) */
/***********************************************************************/
void EWEN_93c66()
{
 START_93c66();
 SEND_DATA_93c66(0X0013,0X05); /*送入3 位操作码+11*/
 SEND_DATA_93c66(0X0000,Addr_bit-2); /*送入9 位地址*/
 END_93c66();
}
/***********************************************************************/
/*名称: EWDS_93c66() */
/*说明: 93c66 的编程关闭.操作码(100 00XXXXXXX) */
/**********************************************************************/
void EWDS_93c66()
{
 START_93c66();
 SEND_DATA_93c66(0X0004,0X03);
 SEND_DATA_93c66(0X0000,Addr_bit);
 END_93c66();
}
/***********************************************************************/ /*名称:READ() */
/*说明:93c66 的字读取程序 */
/*输入:要读取的字节地址(9 位) */
/*输出:读取的字数值 */
/**********************************************************************/
uchar READ(uint address)
{
 uchar temp1;
 uchar temp2;
 START_93c66();
 SEND_DATA_93c66(0X0006,0X03);
 SEND_DATA_93c66(address,Addr_bit);
 temp2=0; /*存放返回数据的缓冲先清零*/
 for(temp1=0;temp1<8;temp1++) /*循环读出8 个数据*/
  {
	  temp2=temp2<<1;
	  SK_93c66=1;
	  delay1(200);
	  SK_93c66=0;
	  delay1(200);
	  if(DIO_93c66==1)
	   {temp2=temp2|0X01;}
  }
  END_93c66();
  return temp2;
}
/**********************************************************************/
/*名称:WRITE() */
/*说明:93c66 的字写入程序 */
/*输入: address 要写入的字节地址(9 位) */
/* op_data 要写入的数据(8 位) */
/*输出: 读取的字数值 */
/**********************************************************************/
uchar WRITE(uint address,uint op_data)
{
 uchar temp1;
 uint  temp2;
 EWEN_93c66();
 START_93c66();
 SEND_DATA_93c66(0X0005,0X03);
 SEND_DATA_93c66(address,Addr_bit);
 SEND_DATA_93c66(op_data,0X08);
 CS_93c66=0;
 delay1(200);
 CS_93c66=1;
 //DIO_93c66=1;
 //delay1(100);
 temp1=1;
 temp2=50000; //设置一个最大延时等待数值.注意在不同的晶振下延时是不同的
 while(!DIO_93c66)
  {
	  temp2=temp2-1;
	  if(temp2==0)
	   {
		   temp1=0;//temp1=0则写入失败
		   //delay1(60000);
		   break; //最大等待延时后说明擦除失败
	   }
  }
 END_93c66();
 EWDS_93c66();
 return temp1;
}
/***********************************************************************/
/*名称:ERASE() */
/*说明:93c66 的字擦除程序 */
/*输入: address 要擦除的字地址(9 位) */
/**********************************************************************/
uchar ERASE(uint address)
{
	data uchar temp1;
	data uint temp2;
	EWEN_93c66();
	START_93c66();
	SEND_DATA_93c66(0X07,0X03);
	//SEND_DATA_93c66(address,0X06);
	SEND_DATA_93c66(address,Addr_bit);
	CS_93c66=0;
	delay1(200);
	CS_93c66=1;
	temp1=1;
	temp2=50000;
	while(!DIO_93c66)
		{
			temp2=temp2-1;
			if(temp2==0)
			{
			  temp1=0;
			  break;
			}
		}
	END_93c66();
	EWDS_93c66(); //返回表示擦除状态的特征
	return temp1;
}

/**********************************************************************/
/*名称:ERAL() */
/*说明:93c66 的全部擦除程序 */
/**********************************************************************/
uchar ERAL()
{
	data uchar temp1;
	data uint temp2;
	EWEN_93c66();
	START_93c66();
	//SEND_DATA_93c66(0X04,0X03);
	//SEND_DATA_93c66(0X20,0X06);
	SEND_DATA_93c66(0X12,0X05);
	SEND_DATA_93c66(0X00,0X07);
	CS_93c66=0;
	delay1(200);
	CS_93c66=1;
	temp1=1;
	temp2=50000;
	while(!DIO_93c66)
	{
		temp2=temp2-1;
		if(temp2==0)
		{
		 temp1=0;
		 break;
	    }
	}
END_93c66();
EWDS_93c66(); //返回表示擦除状态的特征
return temp1;
}
/***********************************************************************/
/*名称:WRAL() */
/*说明:93c66 的写全部程序 */
/*输入: op_data 要写入的数据(16 位) */
/*输出: 读取的字数值 */
/***********************************************************************/
uchar WRAL(uint op_data)
{
	data uchar temp1;
	data uint temp2;
	EWEN_93c66();
	START_93c66();
	//SEND_DATA_93c66(0X04,0X03);
	//SEND_DATA_93c66(0X10,0X06);
	SEND_DATA_93c66(0X11,0X05);
	SEND_DATA_93c66(0X00,0X07);
	SEND_DATA_93c66(op_data,0x08);
	CS_93c66=0;
	delay1(200);
	CS_93c66=1;
	temp1=1;
	temp2=50000; //设置一个最大延时等待数值.注意在不同的晶振下延时是不同的
	while(!DIO_93c66)
	{
	    temp2=temp2-1;
		if(temp2==0)
			{
				temp1=0;
				break;
			}
	}
	END_93c66();
	EWDS_93c66();
	return op_data;
}

⌨️ 快捷键说明

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