?? c51wrreadat45db041_form070813.c
字號:
/*************************************************************/
/*Name : RESET_AT45() */
/*Discription : 執行完一個操作以后重置 */
/*************************************************************/
void RESET_AT45(void)
{
CS_AT45_DIS;
SCK_AT45_HIGH;
SI_AT45_HIGH;
CS_AT45_EN; //CS片選低電平有效
SCK_AT45_LOW;
}
/****************************************************************/
/*Name :END_AT45()
/*Discription :用于AT45的結束
/****************************************************************/
void END_AT45(void)
{
CS_AT45_DIS; //CS片選高電平無效
SI_AT45_HIGH;
SCK_AT45_HIGH;
}
/*************************************************************/
/*Name :SEND_DATA_AT45() */
/*Discription :在AT45啟動下,送入指定位數的數據 */
/*輸入: op_data 要輸入的數據 */
/* num 輸入的位數 */
/* 最高位先送出 */
/*************************************************************/
void SEND_DATA_AT45(unsigned char buffer)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (buffer & 0x80)
{
SI_AT45_HIGH;
}
else
{
SI_AT45_LOW;
}
SCK_AT45_LOW ;
SCK_AT45_HIGH;
buffer<<=1;
}
}
/************************************************************/
/*Name :GET_DATA_AT45() */
/*Discription :在AT45啟動下,讀入指定位數的數據 */
/*輸入: 無 */
/*輸出:讀入的8位數據 */
/* 最高位先送出 */
/*************************************************************/
unsigned char GET_DATA_AT45(void)
{
unsigned char i,rByte=0;
for(i=0;i<8;i++)
{
SCK_AT45_LOW;
SCK_AT45_HIGH;
rByte<<=1;
rByte|=SO_AT45;
}
return rByte;
}
/***********************************************************************/
/*Name :AT45_status() */
/*Discription :AT45的字讀取程序 */
/*輸出 :寄存器狀態,查詢是否為忙,以及卡是否未壞 */
/***********************************************************************/
unsigned char AT45_status(void)
{
unsigned char Result=0;
/*開啟AT45.........................................................*/
CS_AT45_EN;
SEND_DATA_AT45(0xD7);
Result=GET_DATA_AT45();
/*關閉AT45.........................................................*/
CS_AT45_DIS; //CS片選高電平無效
return Result;
}
/***********************************************************************/
/*描述: */
/* 將指定數據寫入main中某頁的某個地址,先擦除此頁,再寫入指定地址 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/* BFA - 指定main page中的起始寫入地址 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/***********************************************************************/
unsigned char AT45_MainWr(unsigned char buffer,unsigned int PA,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<255)
{
if(AT45_status()==0x9c) break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x82);break;
case 2:SEND_DATA_AT45(0x85);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)((PA<<1)|(BFA>>8)));
SEND_DATA_AT45((unsigned char)BFA);
//發送數據
for(i=0;i<len;i++){SEND_DATA_AT45(*(pHeader+i));}
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 將從指定頁指定地址讀出數據 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/* BFA - 指定main page中的起始寫入地址 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/***********************************************************************/
unsigned char AT45_MainRe(unsigned int PA,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c) break;
}
if(i==255) return 0;
CS_AT45_EN;
SEND_DATA_AT45(0xD2);
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)((PA<<1)|(BFA>>8)));
SEND_DATA_AT45((unsigned char)BFA);
for(i=0;i<4;i++)
{
SEND_DATA_AT45(0x00);
}
//發送數據
for(i=0;i<len;i++){*(pHeader+i)=GET_DATA_AT45();}
CS_AT45_DIS;
return 1;
}
/********************************************************************/
/*描述: */
/* 從BUFFER中的指定地址開始讀出指定長度的數據,讀到最后從buffer的開頭重讀。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* 在該指令序列中,操作碼84H選擇BUFFER 1,87H選擇BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 待存數據的頭指針 */
/* len - 待存數據的長度1~264 */
/********************************************************************/
unsigned char AT45_BufRe(unsigned char buffer,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0xD4);break;
case 2:SEND_DATA_AT45(0xD6);break;
}
SEND_DATA_AT45(0x00);
SEND_DATA_AT45((unsigned char)(BFA>>8));
SEND_DATA_AT45((unsigned char)BFA);
SEND_DATA_AT45(0x00);
for(i=0;i<len;i++){*(pHeader+i)=GET_DATA_AT45();}
CS_AT45_DIS;
return 1;
}
/********************************************************************/
/*描述: */
/* 將指定數據寫入從某個地址(0~263)開始的BUFFER中。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* 在該指令序列中,操作碼84H選擇BUFFER 1,87H選擇BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 待存數據的頭指針 */
/* len - 待存數據的長度1~264 */
/********************************************************************/
unsigned char AT45_BufWr(unsigned char buffer,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)
{
// Green_led_off;
break;
}
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x84);break;
case 2:SEND_DATA_AT45(0x87);break;
}
SEND_DATA_AT45(0x00);
SEND_DATA_AT45((unsigned char)(BFA>>8));
SEND_DATA_AT45((unsigned char)BFA);
for(i=0;i<len;i++){SEND_DATA_AT45(*(pHeader+i));}
CS_AT45_DIS;
return 1;
}
/*******************************************************/
/*描述: */
/* 連續讀 */
/*參數: */
/* PA - 頁地址,0~2047 */
/* BFA - 指定main 頁的起始讀取地址,0-264 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/*******************************************************/
unsigned char AT45_ArrayRead(unsigned int PA,unsigned int BFA,
unsigned char *pHeader,unsigned int len)
{
unsigned int i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
SEND_DATA_AT45(0xE8);
//地址,
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)((PA<<1)|(BFA>>8)));
SEND_DATA_AT45((unsigned char)BFA);
for(i=0;i<4;i++)
{
SEND_DATA_AT45(0x00);
}
for(i=0;i<len;i++){*(pHeader+i)=GET_DATA_AT45();}
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 將指定數據寫入從某個地址(0~263)開始的頁中:包含2個動作,首先將指定數據*/
/* 寫入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始寫入地址,此寫入*/
/* 動作不影響BUFFER中其它地址中的數據,然后再將BUFFER中的整個數據寫入到某指*/
/* 定頁中(帶預擦除)。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/* BFA - 指定BUFFER中的起始寫入地址 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/********************************************************************/
unsigned char AT45_Bf2MainWr_inErase(unsigned char buffer,unsigned int PA,
unsigned int BFA,unsigned char *Header,unsigned char len)
{
unsigned char i=0;
AT45_BufWr(buffer,BFA,Header,len);
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x83);break;
case 2:SEND_DATA_AT45(0x86);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)(PA<<1));
SEND_DATA_AT45(0x00);
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 比較將MAIN中的內容傳到BUFF中 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/* len - 指定數據的長度 */
/***********************************************************************/
unsigned char AT45_Main2BUF(unsigned char buffer,unsigned int PA)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x53);break;
case 2:SEND_DATA_AT45(0x55);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)(PA<<1));
SEND_DATA_AT45(0x00);
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 比較buff和main中的頁是否內容一致 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/* BFA - 指定BUFFER中的起始寫入地址 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/***********************************************************************/
unsigned char AT45_Bf2MainBUFcmp(unsigned char buffer,unsigned int PA)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255)return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x60);break;
case 2:SEND_DATA_AT45(0x61);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)(PA<<1));
SEND_DATA_AT45(0x00);
CS_AT45_DIS;
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -