?? 96c66.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 + -