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

📄 extflash.c

📁 PIC18F4550_USB开发原代码
💻 C
字号:
#include <p18cxxx.h>





#define BUSYP	PORTBbits
#define BUSY	RB0  		// INPUT
#define SCLP	PORTCbits
#define SCL	RC6		// OUTPUT
#define SDOP	PORTCbits
#define SDO	RC7		// OUTPUT
#define SDIP	PORTCbits
#define SDI	RC2		// INPUT

#define ERSC	0x90F6
#define SRC		0xFFFFFFFE
#define RSE		0x94
#define RBE		0x98
#define RME		0x9C
#define RMEC	0xA0
#define RMB		0xA4
#define WEB		0xA8
#define WEBC	0xAC
#define WBMEP	0xB0
#define WBMP	0xB4

void wob (unsigned long,unsigned char);		// Value and Length
unsigned char rob (void);				// Received Byte
void M_reset (void);				// Reset Memory
void M_erase (void);				// Erase all memory
unsigned char M_rob (unsigned int,unsigned char);	// Read One Byte: Page and Address
unsigned char M_rmb (void);			// Read Many Bytes
void M_wob (unsigned char,unsigned char);	// Write One Byte: Address and Data
void M_wmb (unsigned char);			// Write Many Bytes: Data
void M_wbme (unsigned int);			// Write Buffer to Memory with Erase: Page
void M_read (unsigned char *,unsigned long,unsigned char);	// Read memory: Target array, Location and How many
void M_write (unsigned char *,unsigned int,unsigned char);	// Write one page: Source array, Location and How many
void	initExtFlash(void);

/** EXTFLASH READ VARIABLES *****************/
#pragma udata access systems=0x00
volatile near unsigned int ck1,ck2;
near unsigned char check[128];
#pragma udata


#pragma romdata wordbase=0x0800
const rom char wb[]={
0XFF
};
#pragma romdata


void	initExtFlash(void)
{
	TRISBbits.TRISB0=1;  // Initlize BUSY bit

	
	TRISCbits.TRISC6=0; // SCL's direction is OUT from MCU
	TRISCbits.TRISC2=1; // SDI's direction is IN to MCU
	TRISCbits.TRISC7=0; // SDO's direction is OUT from MCU
	
	SCLP.SCL=0;
	SDOP.SDO=0;
}





void wob (unsigned long CM,unsigned char i)
{
	while (i!=0)
	{
		SDOP.SDO = CM & 0x00000001;
		CM = CM >> 1;
		SCLP.SCL=1;
		i--;
		Nop ();
		SCLP.SCL=0;
	}
}
unsigned char rob (void)
{
	unsigned char i,rcbyte;

	i=8;
	while (i!=0)
	{
		SCLP.SCL=0;
		SCLP.SCL=1;

		rcbyte = rcbyte >> 1;
		if (SDIP.SDI)
		{	rcbyte |= 0x80;	}
		else
		{	rcbyte |= 0x00;	}

		SCLP.SCL=0;
		i--;
	}
	return (rcbyte);
}


void M_reset (void)
{
	wob (SRC,32);

	while (BUSYP.BUSY)
	{	continue;	}
}


void M_erase (void)
{
	M_reset ();

	wob (ERSC,16);

	while (BUSYP.BUSY)
	{	continue;	}
}


unsigned char M_rob (unsigned int Mpage,unsigned char Maddress)
{
	unsigned char temp;

	wob (RME,8);
	wob (Maddress,8);
	wob (Mpage,16);
	temp = rob ();
	return (temp);
}


unsigned char M_rmb (void)
{
	unsigned char temp;

	wob (RMEC,8);
	temp = rob ();
	return (temp);
}


void M_wob (unsigned char Baddress,unsigned char Mdata)
{
	wob (WEB,8);
	wob (Baddress,8);
	wob (Mdata,8);
}


void M_wmb (unsigned char Mdata)
{
	wob (WEBC,8);
	wob (Mdata,8);
}


void M_wbme (unsigned int Mpage)
{
	wob (WBMEP,8);
	wob (Mpage,16);

	while (BUSYP.BUSY)
	{	continue;	}
}


void M_read (unsigned char *Marray,unsigned long Madd,unsigned char Mnum)
{
	unsigned char i;

	if (Mnum==0x00)	return;

	M_reset ();

	Marray[0]=M_rob ((Madd/0x80),(Madd%0x80));

	i=1;
	Mnum -= 1;

	while (Mnum!=0)
	{
		Marray[i]=M_rmb ();
		i++;
		Mnum--;
	}
}


void M_write (unsigned char *Marray,unsigned int Mpage,unsigned char Mnum)
	// Write one page: Write Buffer, which Page , Writen Length.
{
	unsigned char i;

	if (Mnum==0x00)	return;

	M_reset ();

	M_wob (0x00,Marray[0]);

	i=1;
	while (i<128)
	{
		if (i<Mnum)
		{	M_wmb (Marray[i]);	}
		else
		{	M_wmb (0xFF);	}

		i++;
	}

	M_wbme (Mpage);
}



/*
#pragma romdata CONFIG
_CONFIG_DECL(_CONFIG1H_DEFAULT & _OSC_HSPLL_1H,
_CONFIG2L_DEFAULT & _PWRT_ON_2L & _BOR_ON_2L &_BORV_27_2L,
_CONFIG2H_DEFAULT & _WDT_OFF_2H,
_CONFIG3H_DEFAULT,
_CONFIG4L_DEFAULT & _LVP_OFF_4L & _DEBUG_ON_4L & _STVR_ON_4L,
_CONFIG5L_DEFAULT,
_CONFIG5H_DEFAULT,
_CONFIG6L_DEFAULT,
_CONFIG6H_DEFAULT,
_CONFIG7L_DEFAULT,
_CONFIG7H_DEFAULT);
#pragma romdata
*/

⌨️ 快捷键说明

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