📄 flashmem.c
字号:
SYS_FLASH_WRITE_DISABLE_RTN (); /* lower Vpp */
break;
case (FLASH_29LV160T):
case (FLASH_29LV160B):
case (FLASH_29LV040B):
SYS_FLASH_WRITE_ENABLE_RTN (); /* enable write */
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FIRST;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_CHIP_ERASE;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FOURTH;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_FIFTH;
*pFA = FLASH29_CMD_SECTOR;
do {
retVal = sysFlashDataPoll (pFA, (FLASH_DEF) 0xffffffff);
} while ((*pFA != (FLASH_DEF) 0xffffffff) && (retVal == OK));
SYS_FLASH_WRITE_DISABLE_RTN (); /* disable write */
break;
default:
retVal = ERROR;
}
return (retVal);
}
/******************************************************************************
*
* sysFlashErase - erase the contents of flash memory
*
* This routine clears the contents of flash memory.
*
* Flash 28F\f2xxx\f1 devices are erased by writing a flash erase command to
* the device and verifying that each flash location is set to a high value
* (0xFF).
*
* Flash 29F\f2xxx\f1 devices are erased by writing the six-byte erase code
* into specific address locations, which sets all byte locations to a high
* value (0xFF).
*
* RETURNS: OK, or ERROR if the contents of flash memory cannot be erased.
*/
STATUS sysFlashErase
(
UINT8 flashType /* type of flash memory on-board */
)
{
volatile FLASH_DEF * pFA = FLASH_CAST (FLASH_ADRS);
STATUS retVal = OK;
int ix;
switch (flashType)
{
case (FLASH_28F008):
case (FLASH_28F016):
case (FLASH_28F160):
case (FLASH_28F320):
SYS_FLASH_WRITE_ENABLE_RTN (); /* raise Vpp */
*pFA = FLASH28_CMD_ERASE_SETUP; /* setup */
*pFA = FLASH28F008_CMD_ERASE; /* erase */
/* Check Write State Machine Status */
do
*pFA = FLASH28F008_CMD_READ_STATUS;
while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);
/* Check Erase Error Status */
if ((*pFA & FLASH28F008_STAT_EWS) != 0)
{
*pFA = FLASH28F008_CMD_CLEAR_STATUS;
retVal = ERROR;
}
pFA = FLASH_CAST (FLASH_ADRS);
*pFA = FLASH28_CMD_RESET;
SYS_FLASH_WRITE_DISABLE_RTN (); /* lower Vpp */
break;
case (FLASH_28F640J3A):
case (FLASH_28F320J3A):
case (FLASH_28F128J3A):
SYS_FLASH_WRITE_ENABLE_RTN (); /* raise Vpp */
*pFA = FLASH28_CMD_ERASE_SETUP; /* setup */
*pFA = FLASH28F008_CMD_ERASE; /* erase */
/* Check Write State Machine Status */
do
{
} while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);
/* Check Erase Error Status */
if ((*pFA & FLASH28F008_STAT_EWS) != 0)
{
*pFA = FLASH28F008_CMD_CLEAR_STATUS;
retVal = ERROR;
}
pFA = FLASH_CAST (FLASH_ADRS);
*pFA = FLASH28_CMD_RESET;
SYS_FLASH_WRITE_DISABLE_RTN (); /* lower Vpp */
break;
case (FLASH_28F256):
case (FLASH_28F512):
case (FLASH_28F010):
case (FLASH_28F020):
{
/* program the device to all zeros */
if (sysFlashWrite (NULL, FLASH_SIZE, 0, flashType, 0) == ERROR)
return (ERROR);
SYS_FLASH_WRITE_ENABLE_RTN (); /* raise Vpp */
*pFA = FLASH28_CMD_ERASE_SETUP; /* setup */
*pFA = FLASH28_CMD_ERASE; /* erase */
sysFlashDelay (10000);
for (; (pFA < FLASH_CAST ((UINT32)FLASH_ADRS + (UINT32)FLASH_SIZE))
&& (retVal == OK); pFA++)
for (ix = 0; TRUE; ix++)
{
*pFA = FLASH28_CMD_ERASE_VERIFY; /* verify */
sysFlashDelay (6); /* wait for verify */
if (*pFA == (FLASH_DEF) 0xffffffff) /* done? */
break;
if (ix == 1000)
{
retVal = ERROR;
break;
}
*pFA = FLASH28_CMD_ERASE_SETUP; /* setup */
*pFA = FLASH28_CMD_ERASE; /* erase */
sysFlashDelay (10000);
}
pFA = FLASH_CAST (FLASH_ADRS);
*pFA = FLASH28_CMD_RESET;
*pFA = FLASH28_CMD_READ_MEM;
sysFlashDelay (6);
SYS_FLASH_WRITE_DISABLE_RTN (); /* lower Vpp */
break;
}
case (FLASH_29F010):
case (FLASH_29LV160T):
case (FLASH_29LV160B):
case (FLASH_29LV040B):
{
SYS_FLASH_WRITE_ENABLE_RTN (); /* enable write */
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FIRST;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_CHIP_ERASE;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FOURTH;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_FIFTH;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_SIXTH;
do {
retVal = sysFlashDataPoll (pFA, (FLASH_DEF) 0xffffffff);
} while ((*pFA != (FLASH_DEF) 0xffffffff) && (retVal == OK));
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FIRST;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_READ_RESET;
SYS_FLASH_WRITE_DISABLE_RTN (); /* disable enable */
break;
}
case (FLASH_29C040A):
case (FLASH_29LV1024):
/*
* You can erase these entire chips, but there is really no
* need, as a write automatically erases the sector being
* written. In particular, we will not generally want all
* of the chip erased from sysFlashSet().
*/
{
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FIRST;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_CHIP_ERASE;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_FOURTH;
*(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_FIFTH;
*(FLASH_CAST FLASH29_REG_FIRST_CYCLE) = FLASH29_CMD_SIXTH;
/*
* Atmel chip spec says it will take 20 ms max and does not
* define a mechanism for polling for completion
*
* It seems that this driver cannot always safely use taskDelay()
*/
sysFlashDelay (20000);
break;
}
default:
retVal = ERROR;
}
return (retVal);
}
/******************************************************************************
*
* sysFlashWrite - write data to flash memory
*
* This routine copies specified data of a specified length, <size>, into a
* specified offset, <offset>, in the flash memory. Data is passed as a string,
* <pFB>, if not NULL. If NULL, data is taken as a repeated sequence of
* <value>.
* The parameter <flashType> should be set to the flash device code.
* The parameter <offset> must be appropriately aligned for the width of
* the Flash devices in use.
*
* Flash 28F\f2xxx\f1 devices are programmed by a sequence of operations:
* .iP
* set up device to write
* .iP
* perform write
* .iP
* verify the write
* .LP
*
* Flash 29F\f2xxx\f1 devices are programmed by a sequence of operations:
* .iP
* set up device to write
* .iP
* perform write
* .iP
* wait for the write to complete
* .LP
*
* RETURNS: OK, or ERROR if the write operation fails.
*
* SEE ALSO: sysFlashSet()
*/
STATUS sysFlashWrite
(
FLASH_DEF * pFB, /* string to be copied; use <value> if NULL */
int size, /* size to program in bytes */
int offset, /* byte offset into flash memory */
UINT8 flashType, /* type of flash memory on-board */
FLASH_DEF value /* value to program */
)
{
volatile FLASH_DEF * pFA; /* flash address */
STATUS retVal = OK;
int ix;
int sectorSize = 128;
int twc = 2; /* time for write completion */
#ifdef FLASH_DEBUG_PRINT
printf("sysSectorWrite: pFB = %s, offset = 0x%x, size = %d\n",pFB,offset,size);
#endif /* FLASH_DEBUG_PRINT */
switch (flashType)
{
case (FLASH_28F008):
case (FLASH_28F016):
case (FLASH_28F160):
case (FLASH_28F320):
SYS_FLASH_WRITE_ENABLE_RTN (); /* raise Vpp */
for (pFA = FLASH_CAST (FLASH_ADRS + offset); (pFA < FLASH_CAST
(FLASH_ADRS + size + offset)) && (retVal == OK); pFA++)
{
if (pFB != NULL)
value = *pFB++;
*pFA = FLASH28_CMD_PROG_SETUP; /* write setup */
*pFA = value; /* data to write */
/* Check Write State Machine Status */
do
{
*pFA = FLASH28F008_CMD_READ_STATUS;
}
while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);
/* Check Byte Write Error Status */
if ((*pFA & FLASH28F008_STAT_BWS) != 0)
{
*pFA = FLASH28F008_CMD_CLEAR_STATUS;
retVal = ERROR;
}
}
pFA = FLASH_CAST (FLASH_ADRS);
*pFA = FLASH28_CMD_RESET;
SYS_FLASH_WRITE_DISABLE_RTN (); /* lower Vpp */
break;
case (FLASH_28F320J3A):
case (FLASH_28F640J3A):
case (FLASH_28F128J3A):
SYS_FLASH_WRITE_ENABLE_RTN (); /* raise Vpp */
#ifdef INCLUDE_FLASH_WRITE_BUFFER
#define FLASH28_BUFFER_SIZE (32 * (FLASH_WIDTH / FLASH_CHIP_WIDTH))
#define FLASH28_CMD_CONFIRM_WRITE (FLASH_DEF) 0xD0D0D0D0
#define FLASH28_CMD_WRITE_TO_BUFFER (FLASH_DEF) 0xE8E8E8E8
#define FLASH28_CMD_WSM_ERROR (FLASH_DEF) 0x003a003a
{
volatile FLASH_DEF * pFlash; /* flash address */
int nBytes;
int adrs;
nBytes = size;
adrs = offset;
#ifdef FLASH_DEBUG_PRINT
printf("sysSectorWrite: using write buffer algorithm\n");
#endif /* FLASH_DEBUG_PRINT */
pFA = FLASH_CAST (FLASH_ADRS + adrs);
pFlash = pFA;
while (nBytes >= FLASH28_BUFFER_SIZE && (retVal == OK))
{
/* write to buffer command */
*pFA = FLASH28_CMD_WRITE_TO_BUFFER;
while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);
/* write number of data to write */
*pFA = (FLASH_DEF) (((FLASH28_BUFFER_SIZE / FLASH_WIDTH - 1) << 16)
| (FLASH28_BUFFER_SIZE / FLASH_WIDTH - 1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -