📄 extflash.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 + -