⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 C
📖 第 1 页 / 共 3 页
字号:
    BusSetOutput();			// Default is Output
    FLASH_RE_HIGH;
    FLASH_WE_HIGH;
    FLASH_CLE_HIGH;
    FlashWriteData(CMD_READ_STATUS);
    FLASH_CLE_LOW;

    BusSetInput();
    Result = FlashReadData();

    FLASH_CE_HIGH;
    BusSetOutput();			// Default is Output

    return Result;
}

void FlashInit()
{
    FlashReset();
    FlashReadDeviceInfo();

    switch (FlashSizer) {
    case 0xE6:
    case 0x73:
    case 0x75:
	FlashLevel	= FLASH_TYPE_32MB;
	FlashPageBit	= 9;
	FlashPageByte	= 512;
	FlashBlockPage	= 32;
	FlashTotalBlock	= 2048;
	FlashTotalPage	= 32 * 2048L;
	break;
    case 0x36:
    case 0x76:
	FlashLevel	= FLASH_TYPE_64MB;
	FlashPageBit	= 9;
	FlashPageByte	= 512;
	FlashBlockPage	= 32;
	FlashTotalBlock	= 4096;
	FlashTotalPage	= 32 * 4096L;
	break;
    case 0x79:
	FlashLevel	= FLASH_TYPE_128MB;
	FlashPageBit	= 9;
	FlashPageByte	= 512;
	FlashBlockPage	= 32;
	FlashTotalBlock	= 8192;
	FlashTotalPage	= 32 * 8192L;
	break;
    case 0xA1:
    case 0xF1:
	FlashLevel	= FLASH_TYPE_128MB;
	FlashPageBit	= 11;
	FlashPageByte	= 2048;
	FlashBlockPage	= 64;
	FlashTotalBlock	= 1024;
	FlashTotalPage	= 64 * 1024L;
	break;
    case 0xDA:
	FlashLevel	= FLASH_TYPE_256MB;
	FlashPageBit	= 11;
	FlashPageByte	= 2048;
	FlashBlockPage	= 64;
	FlashTotalBlock	= 2048;
	FlashTotalPage	= 64 * 2048L;
	break;
    default:
	FlashSizer = 0xFF;
	break;
    }
}

#ifdef SUPPORT_FLASH_WRITE
BYTE FlashEraseRealPage(UINT32 PageAddr)
{
    BYTE		Result;

    FLASH_WP_HIGH;

    FLASH_CE_LOW;
    BusSetOutput();			// Default is Output
    FLASH_RE_HIGH;
    FLASH_WE_HIGH;

    FLASH_CLE_HIGH;
    FlashWriteData(CMD_ERASE_1st);
    FLASH_CLE_LOW;

    FLASH_ALE_HIGH;
					FlashWriteData((PageAddr      ) & 0xFF);
					FlashWriteData((PageAddr >>  8) & 0xFF);
    if (FlashTotalPage > 65536L)	FlashWriteData((PageAddr >> 16) & 0xFF);
    FLASH_ALE_LOW;

    FLASH_CLE_HIGH;
    FlashWriteData(CMD_ERASE_2nd);
    FLASH_CLE_LOW;

    FlashWaitBusy();
    Result = FlashReadStatus();
    FLASH_CE_HIGH;

    FLASH_WP_LOW;

    return !(Result & (1 << 0));
}

BYTE FlashWriteRealPage(UINT32 PageAddr, BYTE *pSource)
{
    BYTE		Result;
    UINT16		i;

    FLASH_WP_HIGH;

    FLASH_CE_LOW;
    BusSetOutput();			// Default is Output
    FLASH_RE_HIGH;
    FLASH_WE_HIGH;

    FLASH_CLE_HIGH;
    FlashWriteData(CMD_PROGRAM_1st);
    FLASH_CLE_LOW;

    FLASH_ALE_HIGH;
					FlashWriteData(0x00);
    if (FlashPageByte == 2048)		FlashWriteData(0x00);
					FlashWriteData((PageAddr      ) & 0xFF);
					FlashWriteData((PageAddr >>  8) & 0xFF);
    if (FlashTotalPage > 65536L)	FlashWriteData((PageAddr >> 16) & 0xFF);
    FLASH_ALE_LOW;

    for (i = 0; i < FlashPageByte; i++) {
	FlashWriteData(pSource[i]);
    }

    FLASH_CLE_HIGH;
    FlashWriteData(CMD_PROGRAM_2nd);
    FLASH_CLE_LOW;

    FlashWaitBusy();
    Result = FlashReadStatus();
    FLASH_CE_HIGH;

    FLASH_WP_LOW;

    return !(Result & (1 << 0));
}
#endif

void FlashReadRealPage(UINT32 PageAddr, BYTE *pTarget)
{
    UINT16		i;

    FLASH_CE_LOW;
    BusSetOutput();			// Default is Output
    FLASH_RE_HIGH;
    FLASH_WE_HIGH;

    FLASH_CLE_HIGH;
    FlashWriteData(CMD_READ_1_0);
    FLASH_CLE_LOW;

    FLASH_ALE_HIGH;
					FlashWriteData(0x00);
    if (FlashPageByte == 2048)		FlashWriteData(0x00);
					FlashWriteData((PageAddr      ) & 0xFF);
					FlashWriteData((PageAddr >>  8) & 0xFF);
    if (FlashTotalPage > 65536L)	FlashWriteData((PageAddr >> 16) & 0xFF);
    FLASH_ALE_LOW;

    if (FlashPageByte == 2048) {
	FLASH_CLE_HIGH;
	FlashWriteData(CMD_READ_3);
	FLASH_CLE_LOW;
    }

    BusSetInput();
    FlashWaitBusy();
    for (i = 0; i < FlashPageByte; i++) {
	pTarget[i] = FlashReadData();
    }

    FLASH_CE_HIGH;
    BusSetOutput();			// Default is Output
}

void FlashBlockCheck()
{
    unsigned char	i;

    FlashReadRealPage(0L, FlashBuffer);

    if (FlashBuffer[100] == FLASH_TABLE_ID1 &&
	FlashBuffer[101] == FLASH_TABLE_ID2 &&
	FlashBuffer[102] == FLASH_TABLE_ID3 &&
	FlashBuffer[103] <= FLASH_TABLE_SIZE) {
	FlashBlockNumber = FlashBuffer[103];
	for (i = 0; i < FlashBlockNumber; i++) {
	    FlashBlockBuffer[i] = ((unsigned long *)FlashBuffer)[i];
	}
    }
    else {
	FlashBlockNumber = 100;
    }
}

void FlashBlockOffset(UINT32 *pAddr)
{
    UINT32		BlockAddr;
    BYTE		i;

    BlockAddr = *pAddr;
    BlockAddr += FlashBlockPage;

    if (BlockAddr > 0L && BlockAddr < FlashBlockPage) {
	BlockAddr = FlashTotalPage - FlashBlockPage;
    }
    else
    if (FlashBlockNumber && FlashBlockNumber <= FLASH_TABLE_SIZE) {
	for (i = 0; i < FlashBlockNumber; i++) {
	    if (BlockAddr >= FlashBlockBuffer[i])
		BlockAddr += FlashBlockPage;
	    else
		break;
	}
    }

    *pAddr = BlockAddr;
}

#else	// Flash controlled by MCU

void FlashSendData(BYTE SendData)
{
    BYTE		BitMap;
    BYTE		i;

    BitMap = 0x80;
    for (i = 0; i < 8; i++) {
	if (SendData & BitMap) {
	    FLASH_SO_HIGH;
	}
	else {
	    FLASH_SO_LOW;
	}
//	FlashDelay(80);
	FLASH_SCK_HIGH;
	BitMap >>= 1;
//	FlashDelay(80);
	FLASH_SCK_LOW;
//	FlashDelay(80);
    }
    FlashDelay(280);
}

BYTE FlashReadData()
{
    BYTE		ReturnData = 0;
    BYTE		i;

    for (i = 0; i < 8; i++) {
	ReturnData <<= 1;
	FLASH_SCK_HIGH;
//	FlashDelay(40);
	FLASH_SCK_LOW;
//	FlashDelay(40);
	if (FLASH_SI_READ)
	    ReturnData |= 0x01;
//	FlashDelay(100);
    }
    FlashDelay(230);

    return ReturnData;
}

BYTE FlashSendReadData(BYTE SendData)
{
    BYTE		BitMap;
    BYTE		ReturnData = 0;
    BYTE		i;

    BitMap = 0x80;
    for (i = 0; i < 8; i++) {
	ReturnData <<= 1;
//	FlashDelay(100);
	if (SendData & BitMap) {
	    FLASH_SO_HIGH;
	}
	else {
	    FLASH_SO_LOW;
	}
//	FlashDelay(200);
	FLASH_SCK_HIGH;
	BitMap >>= 1;
//	FlashDelay(200);
	FLASH_SCK_LOW;
//	FlashDelay(100);
	if (FLASH_SI_READ)
	    ReturnData |= 0x01;
    }
    FlashDelay(400);

    return ReturnData;
}

#define	MAX_BUSY_DELAY		0x4000

void FlashWaitBusy()
{
    BYTE		Data;
    UINT16		i;

    FLASH_SCK_LOW;
    FLASH_CS_LOW;

    for (i = 0; i < MAX_BUSY_DELAY; i++) {
	FlashDelay(500);

	Data = FlashSendReadData(CMD_STATUS_REG_READ);

//	psprintf(LineBuffer, "STATUS:%02x-%04x", Data, i);
//	MenuPrintMessage(3);

	if (Data == STATUS_NOT_BUSY) {
	    break;
	}
    }

    FLASH_CS_HIGH;

    if (i >= MAX_BUSY_DELAY) {
//	psprintf(LineBuffer, "ERROR : FLASH Wait too long.(%04x)", i);
//	MenuPrintMessage(4);
	psprintf(LineBuffer, "无效卡或者卡接触不良");
	MenuPrintMessage(3);
	psprintf(LineBuffer, "请关机,检查卡");
	MenuPrintMessage(4);
	while (1);
    }
}

BYTE FlashReadBusy()
{
    return (FlashSendReadData(CMD_STATUS_REG_READ) != STATUS_NOT_BUSY);
}
#endif

#ifdef SUPPORT_FLASH_WRITE
#if 0
void FlashErasePage(UINT32 PageAddr)
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
    FlashBlockOffset(&PageAddr);
    FlashEraseRealPage(PageAddr);
#else
    FlashWaitBusy();

    FLASH_SCK_LOW;
    FLASH_CS_LOW;

    FlashSendData(CMD_MEMORY_ERASE_BUF);	FlashDelay(80);
    FlashSendData((PageAddr >> 24) & 0xff);	FlashDelay(80);
    FlashSendData((PageAddr >> 16) & 0xff);	FlashDelay(80);
    FlashSendData((PageAddr >>  8) & 0xff);	FlashDelay(80);
    FlashSendData((PageAddr	 ) & 0xff);	FlashDelay(80);
    FlashSendData(0x0b);			FlashDelay(80);
    FlashSendData(0xad);			FlashDelay(80);
    FlashSendData(0xfa);			FlashDelay(80);
    FlashSendData(0xce);			FlashDelay(80);

    FLASH_CS_HIGH;
#endif

#if 0
    PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
    PollingWatchDog();
#endif SUPPORT_WATCH_DOG
#ifdef SUPPORT_DSA_DEVICE
    PollingDSA();
#endif
}

void FlashWritePage(UINT32 PageAddr, UINT16 BufferAddr, BYTE *pSource, UINT16 Count)
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
    UINT16		i, j;

    FlashBlockOffset(&PageAddr);
    for (i = BufferAddr, j = 0; j < Count; i++, j++) {
	FlashBuffer[i] = pSource[j];
    }
    FlashWriteRealPage(PageAddr, FlashBuffer);
#else
    UINT16		i;

    FlashWaitBusy();

    FLASH_SCK_LOW;
    FLASH_CS_LOW;

    FlashSendData(CMD_MEMORY_PAGE_BUF1);	FlashDelay(80);
    FlashSendData((PageAddr >> 24) & 0xff);	FlashDelay(80);
    FlashSendData((PageAddr >> 16) & 0xff);	FlashDelay(80);
    FlashSendData((PageAddr >>  8) & 0xff);	FlashDelay(80);
    FlashSendData((PageAddr	 ) & 0xff);	FlashDelay(80);
    FlashSendData(0xfa);			FlashDelay(80);
    FlashSendData(0xce);			FlashDelay(80);
    FlashSendData(0x0b);			FlashDelay(80);
    FlashSendData(0xad);			FlashDelay(80);

    for (i = 0; (i < Count) && (i + BufferAddr < FLASH_PAGE_SIZE); i++) {
	FlashSendData(pSource[i]);
    }

    FLASH_CS_HIGH;
#endif

#if 0
    PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
    PollingWatchDog();
#endif SUPPORT_WATCH_DOG
#ifdef SUPPORT_DSA_DEVICE
    PollingDSA();
#endif
}
#endif

#ifdef SUPPORT_GPIO_BUS_FUNCTION
void FlashEraseByte(UINT32 ByteAddr)
{
    ByteAddr = (INT32)ByteAddr >> FlashPageBit;
    FlashBlockOffset(&ByteAddr);
    FlashEraseRealPage(ByteAddr);
}

void FlashWriteByte(UINT32 ByteAddr, BYTE *pSource, UINT32 Count)
{
    UINT32		i, j;
    UINT32		Length;
    UINT32		PageAddr;
    UINT16		PageOffs;

    PageOffs = ByteAddr & (FlashPageByte - 1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -