?? amd29f040b.c
字號:
#include "flash.h"
#define Q7(ix) ((ix & 0x80) >> 7) /* DQ7 bit */
#define Q6(ix) ((ix & 0x40) >> 6) /* DQ6 bit */
#define Q5(ix) ((ix & 0x20) >> 5) /* DQ5 bit */
#define Q3(ix) ((ix & 0x08) >> 3) /* DQ3 bit */
#define Q2(ix) ((ix & 0x04) >> 2) /* DQ2 bit */
void AMD_Reset(void)
{
*AM29F040B_ADRS = 0xf0;
}
STATUS AMD_DataPolling(char *pFA, char value)
{
STATUS retVal = OK;
volatile UINT8 * pTest = (UINT8 *) pFA; int vBit; /* programmed value of DQ7 */
vBit = Q7(value);
while (Q7(*pTest) != vBit)
{
if (Q5(*pTest) == 1)break;
}
if (Q7(*pTest) != vBit) /* check Q7 & Q5 race */
retVal = ERROR;
return (retVal);
}
STATUS AMD_ToggleBit(char *pFA, int bit)
{
STATUS retVal = OK;
UINT8 PreData;
UINT8 CurrData;
UINT8 tBit;
switch(bit)
{
case 2:
tBit = 0x04;
break;
case 6:
tBit = 0x40;
break;
default:
return ERROR;
break;
}
PreData = *pFA;
PreData &= tBit;
CurrData = *pFA;
CurrData &= tBit;
while(CurrData == PreData)
{
retVal = ERROR;
if(Q5(*pFA) == 1)break;
PreData = CurrData;
CurrData = *pFA;
CurrData &= tBit;
}
CurrData = *pFA;
CurrData = *pFA;
CurrData &= tBit;
if(CurrData != PreData)retVal = OK;
else{
retVal = ERROR;
AMD_Reset();
}
return retVal;
}
int AMD_AutoSelect(int command, UINT32 sector)
{
int retVal;
*AMD_FIRST_CYCLE = AMD_CMD_FIRST;
*AMD_SECOND_CYCLE = AMD_CMD_SECOND;
*AMD_FIRST_CYCLE = AMD_CMD_SELECT;
switch(command)
{
case MANUFACTURERID:
retVal = *((char *)AM29F040B_ADRS)
break;
case DEVICEID:
retVal = *((char *)AM29F040B_ADRS + 1);
break;
case SECTORPROTECTVERIFY:
retVal = *((char *)(sector + 2);
break;
default:
retVal = 0xff;
}
return retVal;
}
STATUS Program_Bytes(UINT32 offset, int size, char *data)
{
char *pFA;
char value;
STATUS retVal = OK;
for(pFA = (char *)(AM29F040B_ADRS + offset); (pFA <
(AM29F040B_ADRS + offset + size))&&(retVal == OK);pFA++)
{
*AMD_FIRST_CYCLE = AMD_CMD_FIRST;
*AMD_SECOND_CYCLE = AMD_CMD_SECOND;
*AMD_FIRST_CYCLE = AMD_CMD_PROGRAM;
if(*data != NULL)value = *data;
*pFA = value;
do{
retVal = (AMD_DataPolling(pFA, value)==ERROR)
}while((*pFA == value)&&(reVal == OK))
}
return retVal;
}
STATUS AMD_ChipErase(void)
{
char *pFA;
STATUS retVal = OK;
pFA = (char *)AM29F040B_ADRS;
*AMD_FIRST_CYCLE = AMD_CMD_FIRST;
*AMD_SECOND_CYCLE = AMD_CMD_SECND;
*AMD_FIRST_CYCLE = AMD_CMD_ERASE;
*AMD_FIRST_CYCLE = AMD_CMD_FOURTH;
*AMD_SECOND_CYCLE = AMD_CMD_FIFTH;
*AMD_FIRST_CYCLE = AMD_CMD_CHIP;
while((*pFA != 0xff)&&(retVal == OK))
retVal = AMD_ToggleBit(pFA, 6);
return retVal;
}
STATUS AMD_SectorErase(char *pFA)
{
STATUS retVal = OK;
*AMD_FIRST_CYCLE = AMD_CMD_FIRST;
*AMD_SECOND_CYCLE = AMD_CMD_SECND;
*AMD_FIRST_CYCLE = AMD_CMD_ERASE;
*AMD_FIRST_CYCLE = AMD_CMD_FOURTH;
*AMD_SECOND_CYCLE = AMD_CMD_FIFTH;
*pFA = 0x30;
while((*pFA != 0xff)&&(retVal == OK))
retVal = AMD_ToggleBit(pFA, 6);
return retVal;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -