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

📄 amd29f040b.c

📁 基于如何开发MPC860处理器系统的核心业务模块QMC的开发程序
💻 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 + -