Description
Source
Call Graph
Start Line: 155
unsigned char amd_Program(struct NorFlashInfo *pNorFlashInfo, unsigned int address, unsigned int data)
{
unsigned int pollingData;
unsigned int busAddress;
unsigned char done = 0;
unsigned char busWidth;
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
// The program command sequence is initiated by writing two unlock write cycles.
WriteCommand(busWidth,
NorFlash_GetByteAddressInChip(pNorFlashInfo, AMD_OFFSET_UNLOCK_1),
AMD_CMD_UNLOCK_1);
WriteCommand(busWidth,
NorFlash_GetByteAddressInChip(pNorFlashInfo, AMD_OFFSET_UNLOCK_2),
AMD_CMD_UNLOCK_2);
// Followed by the program set-up command.
WriteCommand(busWidth,
NorFlash_GetByteAddressInChip(pNorFlashInfo, AMD_OFFSET_UNLOCK_1),
AMD_CMD_PROGRAM);
// The program address and data are written next,
// which in turn initiate the Embedded Program algorithm.
busAddress = NorFlash_GetAddressInChip(pNorFlashInfo, address);
WriteRawData(busWidth, busAddress, (unsigned char*)&data);
// Data polling
do {
ReadRawData(busWidth, busAddress, (unsigned char *)&pollingData);
// Check if the chip program algorithm is completed.
if ((pollingData & AMD_POLLING_DQ7) == (data & AMD_POLLING_DQ7)) {
// Program operation successful. Device in read mode.
done = 1;
}
else {
// check if chip Program algrithm exceeded timing limits
if (pollingData & AMD_POLLING_DQ5 ) {
// I/O should be rechecked.
ReadRawData(busWidth, busAddress, (unsigned char *)&pollingData);
if ((pollingData & AMD_POLLING_DQ7) == (data & AMD_POLLING_DQ7)) {
// Program operation successful. Device in read mode.
done = 1;
}
else {
// Program operation not successful, write reset command.
amd_Reset(pNorFlashInfo, 0);
return NorCommon_ERROR_CANNOTWRITE;
}
}
}
} while (!done);
return 0;
}