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

📄 flash.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 C
📖 第 1 页 / 共 3 页
字号:
    while (Count > 0) {
	Length = Count;
	if (Length > (UINT16)(FlashPageByte - PageOffs))
	    Length = (UINT16)(FlashPageByte - PageOffs);
	PageAddr = (INT32)ByteAddr >> FlashPageBit;
	FlashBlockOffset(&PageAddr);
	for (i = PageOffs, j = 0; j < Length; i++, j++) {
	    FlashBuffer[i] = pSource[j];
	}
	FlashWriteRealPage(PageAddr, FlashBuffer);

	PageOffs = 0;
	ByteAddr += Length;
	pSource += Length;
	Count -= Length;

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

#if 0
void FlashReadPage(UINT32 PageAddr, UINT16 BufferAddr, BYTE *pTarget, UINT16 Count)
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
    UINT16		i, j;

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

    FlashWaitBusy();

    FLASH_SCK_LOW;
    FLASH_CS_LOW;

    FlashSendData(CMD_MEMORY_ARRAY_READ);	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((BufferAddr	>>  8) & 0xff);	FlashDelay(80);
    FlashSendData((BufferAddr	     ) & 0xff);	FlashDelay(80);
    FlashSendData((Count	>>  8) & 0xff);	FlashDelay(80);
    FlashSendData((Count	     ) & 0xff);	FlashDelay(80);

    FlashSendData(CMD_STATUS_REG_READ);

    for (i = 0; i < MAX_BUSY_DELAY; i++) {
	FlashDelay(2000);
	if (FlashSendReadData(CMD_STATUS_REG_READ) == STATUS_NOT_BUSY)
	    break;
    }
    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);
    }

    FlashReadData();

    for (i = 0; i < Count; i++) {
	pTarget[i] = FlashReadData();
    }

    FLASH_CS_HIGH;
#endif

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

void FlashReadPages(UINT32 PageAddr, UINT16 BufferAddr, BYTE *pTarget, UINT32 Count)
{
    UINT32		Length;

    while (Count > 0) {
	Length = Count;
	if (Length > (UINT16)(FLASH_PAGE_SIZE - BufferAddr))
	    Length = (UINT16)(FLASH_PAGE_SIZE - BufferAddr);
	FlashReadPage(PageAddr, BufferAddr, pTarget, Length);
	PageAddr++;
	BufferAddr = 0;
	pTarget += Length;
	Count -= Length;
    }
}
#endif

#ifdef SUPPORT_GPIO_BUS_FUNCTION
void FlashReadByte(UINT32 ByteAddr, BYTE *pTarget, UINT32 Count)
{
    UINT32		i, j;
    UINT32		Length;
    UINT32		PageAddr;
    UINT16		PageOffs;

    PageOffs = ByteAddr & (FlashPageByte - 1);
    while (Count > 0) {
	Length = Count;
	if (Length > (UINT16)(FlashPageByte - PageOffs))
	    Length = (UINT16)(FlashPageByte - PageOffs);
	PageAddr = (INT32)ByteAddr >> FlashPageBit;
	FlashBlockOffset(&PageAddr);
	FlashReadRealPage(PageAddr, FlashBuffer);
	for (i = PageOffs, j = 0; j < Length; i++, j++) {
	    pTarget[j] = FlashBuffer[i];
	}

	PageOffs = 0;
	ByteAddr += Length;
	pTarget += Length;
	Count -= Length;

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

BYTE FlashSelfTest()
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
    FlashInit();
    if (FlashMaker == 0xFF || FlashSizer == 0xFF)
	return 0;
    FlashBlockCheck();
    if (FlashBlockNumber > FLASH_TABLE_SIZE)
	return 0;
#else
    BYTE		Data;
    UINT16		i;

    FLASH_SCK_LOW;
    FLASH_CS_LOW;

    FlashSendData(CMD_STATUS_REG_READ);

    for (i = 0; i < (MAX_BUSY_DELAY >> 2); i++) {
	polling();
	FlashDelay(500);
	Data = FlashSendReadData(CMD_STATUS_REG_READ);
#ifdef MONITOR_FLASH_TEST
	psprintf(LineBuffer, "STATUS:%02x-%04x", Data, i);
	MenuPrintString(2, 1, LineBuffer);
#endif
	if (Data == STATUS_NOT_BUSY) {
	    break;
	}
    }

    FLASH_CS_HIGH;

    if (i >= (MAX_BUSY_DELAY >> 2)) {
#if 0
	while (1) {
	    polling();
	}
#endif
	return 0;
    }

#if 0
#if 1
    ((BYTE *)CalcByteBuffer)[100] = 0x12;
    ((BYTE *)CalcByteBuffer)[101] = 0xCF;
    ((BYTE *)CalcByteBuffer)[102] = 0x70;
#else
    ((BYTE *)CalcByteBuffer)[100] = 0xCF;
    ((BYTE *)CalcByteBuffer)[101] = 0x70;
    ((BYTE *)CalcByteBuffer)[102] = 0x12;
    ((BYTE *)CalcByteBuffer)[103] = 0x00;
#endif
//  FlashErasePage(-32L);
//  FlashWritePage(-32L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
    FlashEraseByte(-(FlashBlockPage << FlashPageBit));
    FlashWriteByte(-(FlashBlockPage << FlashPageBit), CalcByteBuffer, FlashPageByte);
    while (1);
#endif
#endif

#if 0
//  FlashReadPage(-32L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
    FlashReadByte(-(FlashBlockPage << FlashPageBit), CalcByteBuffer, FlashPageByte);

#ifdef MONITOR_FLASH_TEST
#if 0
    psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
	     ((UINT32 *)CalcByteBuffer)[0 / 4],
	     ((UINT32 *)CalcByteBuffer)[4 / 4],
#elif 1
    psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
	     *((UINT32 *)(CalcByteBuffer)),
	     *((UINT32 *)(CalcByteBuffer + 4)),
#else
    psprintf(LineBuffer, "%02x%02x%02x%02x-%02x%02x%02x%02x-%02x-%02x-%02x-%02x",
	     CalcByteBuffer[  3],
	     CalcByteBuffer[  2],
	     CalcByteBuffer[  1],
	     CalcByteBuffer[  0],
	     CalcByteBuffer[  7],
	     CalcByteBuffer[  6],
	     CalcByteBuffer[  5],
	     CalcByteBuffer[  4],
#endif
	     CalcByteBuffer[100],
	     CalcByteBuffer[101],
	     CalcByteBuffer[102],
	     CalcByteBuffer[103]);
    MenuPrintString(2, 2, LineBuffer);
#if 0
    psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
	     ((UINT32 *)CalcByteBuffer)[ 8 / 4],
	     ((UINT32 *)CalcByteBuffer)[12 / 4],
#elif 1
    psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
	     *((UINT32 *)(CalcByteBuffer +  8)),
	     *((UINT32 *)(CalcByteBuffer + 12)),
#else
    psprintf(LineBuffer, "%02x%02x%02x%02x-%02x%02x%02x%02x-%02x-%02x-%02x-%02x",
	     CalcByteBuffer[ 11],
	     CalcByteBuffer[ 10],
	     CalcByteBuffer[  9],
	     CalcByteBuffer[  8],
	     CalcByteBuffer[ 15],
	     CalcByteBuffer[ 14],
	     CalcByteBuffer[ 13],
	     CalcByteBuffer[ 12],
#endif
	     CalcByteBuffer[100],
	     CalcByteBuffer[101],
	     CalcByteBuffer[102],
	     CalcByteBuffer[103]);
    MenuPrintString(2, 3, LineBuffer);
#endif

#else

    FATType = FAT_TYPE_UNKNOWN;

//  FlashReadPage(65152L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
    FlashReadByte(65152L << FlashPageBit, CalcByteBuffer, FLASH_PAGE_SIZE);
    if (strcmp(CalcByteBuffer, "TMLH-CN") == 0) {
#ifdef MONITOR_FLASH_TEST
	strcpy(   LineBuffer, 	  "Card (1) ");
	strcpylen(LineBuffer + 9, CalcByteBuffer + 10, 19);
	MenuPrintString(2, 2, LineBuffer);
	strcpy(   LineBuffer,	  "File (1) ");
	strcpylen(LineBuffer + 9, CalcByteBuffer + 30, 19);
	MenuPrintString(2, 3, LineBuffer);
#endif
	FATType = FAT_TYPE_ZERO;
    }

//  FlashReadPage(-32L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
    FlashReadByte(-(FlashBlockPage << FlashPageBit), CalcByteBuffer, FLASH_PAGE_SIZE);
    if (FATType == FAT_TYPE_UNKNOWN) {
	if (strcmp(CalcByteBuffer + 200, "TMLH-CN") == 0) {
#ifdef MONITOR_FLASH_TEST
	    strcpy(   LineBuffer,     "Card (2) ");
	    strcpylen(LineBuffer + 9, CalcByteBuffer + 210, 19);
	    MenuPrintString(2, 2, LineBuffer);
	    strcpy(   LineBuffer,     "File (2) ");
	    strcpylen(LineBuffer + 9, CalcByteBuffer + 230, 19);
	    MenuPrintString(2, 3, LineBuffer);
#endif
	    FATType = FAT_TYPE_INDEX;
	}
    }
#endif

#if 0
#ifdef SUPPORT_TEST_FUNCTION
//  TestFlash();
#endif
    while (1) {
	polling();
    }
#endif

#if 0
//  FlashErasePage(-32L);
    FlashEraseByte(-(FlashBlockPage << FlashPageBit));
#endif

    return (CalcByteBuffer[100] == 0xCF &&
	    CalcByteBuffer[101] == 0x70 &&
	    CalcByteBuffer[102] == 0x12);
}

#ifdef SUPPORT_TEST_FUNCTION

#define	TEST_FLASH_PAGES	(32 * 64 * 1)		// FLASH_TOTAL_PAGE
#define	TEST_FLASH_ADDRESS	((FLASH_PAGE_SIZE * 4 + 64) / 4)

void TestFlash()
{
#ifdef SUPPORT_FLASH_WRITE
    UINT32		i, j, k;
    UINT32		DataSize, StartAddr;

#ifdef FLASH_TABLE_NO
    StartAddr = TEST_FLASH_PAGES * (FLASH_TABLE_NO - 1);
#else
    StartAddr = 0x8800;
#endif

#if 1
    for (DataSize = 0, i = 0, j = -1; i < TEST_FLASH_PAGES; i += 32) {
	if (j != i * 100 / TEST_FLASH_PAGES) {
	    j  = i * 100 / TEST_FLASH_PAGES;
	    psprintf(LineBuffer, "FLASH Erasing... (%02d%s)", j, "%");
	    MenuPrintMessage(3);
	}
	FlashErasePage(i + StartAddr);
    }
    psprintf(LineBuffer, "FLASH Erasing... (%02d%s) Over!", 100, "%");
    MenuPrintMessage(3);
#endif

#if 1
    for (DataSize = 0, i = 0, j = -1; i < TEST_FLASH_PAGES; i++) {
	if (j != i * 100 / TEST_FLASH_PAGES) {
	    j  = i * 100 / TEST_FLASH_PAGES;
	    psprintf(LineBuffer, "FLASH Writting... (%02d%s)", j, "%");
	    MenuPrintMessage(2);
	}
	FlashWritePage(i + StartAddr, 0x0000, (BYTE *)(ASC16 + DataSize), FLASH_PAGE_SIZE);
	DataSize += FLASH_PAGE_SIZE;
	if (DataSize >= FLASH_PAGE_SIZE * 8)
	    DataSize = 0;
    }
    psprintf(LineBuffer, "FLASH Writting... (%02d%s) Over!", 100, "%");
    MenuPrintMessage(2);
#endif

#if 1
    for (DataSize = 0, i = 0, j = -1; i < TEST_FLASH_PAGES; i++) {
#if 0
	if (j != i * 100 / TEST_FLASH_PAGES) {
	    j  = i * 100 / TEST_FLASH_PAGES;
	    psprintf(LineBuffer, "FLASH Reading... (%02d%s)", j, "%");
	    MenuPrintMessage(2);
	}
#endif
	FlashReadPage(i + StartAddr, 0x0000, CalcByteBuffer, FLASH_PAGE_SIZE);

	for (k = 0; k < FLASH_PAGE_SIZE; k++) {
	    if ((BYTE)(CalcByteBuffer[k]) != (BYTE)(ASC16[k + DataSize])) {
		break;
	    }
	}
	if (k < FLASH_PAGE_SIZE) {
	    psprintf(LineBuffer, "FLASH Read Page (%04d) Addr (%03d) ERROR!", i, k);
	    MenuPrintMessage(2);

	    psprintf(LineBuffer, "FLASH (%02x%02x%02x%02x) - DATA (%02x%02x%02x%02x)",
		     (BYTE)(CalcByteBuffer[k]),
		     (BYTE)(CalcByteBuffer[k + 1]),
		     (BYTE)(CalcByteBuffer[k + 2]),
		     (BYTE)(CalcByteBuffer[k + 3]),
		     (BYTE)(ASC16[k	+ i * FLASH_PAGE_SIZE]),
		     (BYTE)(ASC16[k + 1 + i * FLASH_PAGE_SIZE]),
		     (BYTE)(ASC16[k + 2 + i * FLASH_PAGE_SIZE]),
		     (BYTE)(ASC16[k + 3 + i * FLASH_PAGE_SIZE]));
	    MenuPrintMessage(3);
	    break;
	}
	else {
	    psprintf(LineBuffer, "FLASH Read Page (%04d) OK!", i + 1);
	    MenuPrintMessage(2);
	}

	DataSize += FLASH_PAGE_SIZE;
	if (DataSize >= FLASH_PAGE_SIZE * 8)
	    DataSize = 0;
    }
//  psprintf(LineBuffer, "FLASH Reading... (%02d%s) Over!", 100, "%");
//  MenuPrintMessage(2);

    if (i < TEST_FLASH_PAGES) {
	return;
    }
#endif

#if 0
    FlashErasePage(0x0000);
    FlashWritePage(0x0000, 0x0000, (BYTE *)(ASC16 + 0), FLASH_PAGE_SIZE);
#endif

#if 0
    FlashReadPage(0x0000 + StartAddr, 0x0000, CalcByteBuffer, FLASH_PAGE_SIZE);
#else
    FlashReadPages(0x0000 + StartAddr, 0x0000, CalcByteBuffer, FLASH_PAGE_SIZE * 2 + 200);
#endif
    psprintf(LineBuffer, "FLASH:%08x-%08x-%08x",
	     ((UINT32 *)CalcByteBuffer)[TEST_FLASH_ADDRESS / 4],
	     ((UINT32 *)CalcByteBuffer)[TEST_FLASH_ADDRESS / 4 + 1],
	     ((UINT32 *)CalcByteBuffer)[TEST_FLASH_ADDRESS / 4 + 2]);
    MenuPrintMessage(3);

    for (DataSize = 0, i = 0; i < 0x1000; i++, DataSize++) {
	((BYTE *)CalcByteBuffer)[(UINT32)i] = ((BYTE *)ASC16)[(UINT32)DataSize];
    }
    psprintf(LineBuffer, "DATA :%08x-%08x-%08x",
	     ((UINT32 *)CalcByteBuffer)[(UINT32)(TEST_FLASH_ADDRESS / 4)],
	     ((UINT32 *)CalcByteBuffer)[(UINT32)(TEST_FLASH_ADDRESS / 4 + 1)],
	     ((UINT32 *)CalcByteBuffer)[(UINT32)(TEST_FLASH_ADDRESS / 4 + 2)]);
    MenuPrintMessage(4);
#endif SUPPORT_FLASH_WRITE
}
#endif

#endif SUPPORT_FLASH_SERIAL

⌨️ 快捷键说明

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