[原]FLASH模拟EP
0赞
发表于 11/5/2011 6:08:45 PM
阅读(3225)
芯片手册上,使用flash模拟ep
void FLASH_init(void)//--------初始化
{
if (!FCDIV_DIVLD)
{
if (HCS08_BUS_FREQUENCY >= 12000)
{
FCDIV = (((HCS08_BUS_FREQUENCY / (8*175))) | 0x40) - 1;
}
else
{
FCDIV = (HCS08_BUS_FREQUENCY / 175) - 1;
}
}
}
void FLASH_byte_prog(unsigned int addr, unsigned char data)
{
unsigned char _pgm[sizeof(ROM_PGM) + 2];
_pgm[0] = (unsigned char)((addr & 0xff00) >> 8);
_pgm[1] = (unsigned char)(addr & 0x00ff);
(void)memcpy(_pgm + 2, ROM_PGM, sizeof(ROM_PGM));
_pgm[7] = FLASH_CMD_BYTEPROG; // change FCMD value
if (FSTAT&0x10) // Check to see if FACCERR is set
{
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
__asm
{
LDA data // pass 'data' thru A
TSX // transfer SP to HX
JSR 2,X // first 2 bytes of _pgm[] are 'addr'
}
}
{
unsigned char _pgm[sizeof(ROM_PGM) + 2];
_pgm[0] = (unsigned char)((addr & 0xff00) >> 8);
_pgm[1] = (unsigned char)(addr & 0x00ff);
(void)memcpy(_pgm + 2, ROM_PGM, sizeof(ROM_PGM));
_pgm[7] = FLASH_CMD_BYTEPROG; // change FCMD value
if (FSTAT&0x10) // Check to see if FACCERR is set
{
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
__asm
{
LDA data // pass 'data' thru A
TSX // transfer SP to HX
JSR 2,X // first 2 bytes of _pgm[] are 'addr'
}
}
void FLASHdatas_prog(unsigned int addr, unsigned char * data, unsigned int _length)
{
unsigned char _pgm[sizeof(ROM_FAST_PGM) + 6];
if (_length == 0) return;
_pgm[0] = (unsigned char)(((addr) & 0xff00) >> 8);
_pgm[1] = (unsigned char) ((addr) & 0x00ff);
_pgm[2] = (unsigned char)((((unsigned int)data) & 0xff00) >> 8);
_pgm[3] = (unsigned char) (((unsigned int)data) & 0x00ff);
_pgm[4] = (unsigned char)(((_length) & 0xff00) >> 8);
_pgm[5] = (unsigned char) ((_length) & 0x00ff);
(void)memcpy(_pgm + 6, ROM_FAST_PGM, sizeof(ROM_FAST_PGM));
if (FSTAT&0x10) // Check to see if FACCERR is set
{
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
__asm
{
TSX // transfer SP to HX
JSR 6,X // first 2 bytes of _pgm[] are 'addr'
}
}
{
unsigned char _pgm[sizeof(ROM_FAST_PGM) + 6];
if (_length == 0) return;
_pgm[0] = (unsigned char)(((addr) & 0xff00) >> 8);
_pgm[1] = (unsigned char) ((addr) & 0x00ff);
_pgm[2] = (unsigned char)((((unsigned int)data) & 0xff00) >> 8);
_pgm[3] = (unsigned char) (((unsigned int)data) & 0x00ff);
_pgm[4] = (unsigned char)(((_length) & 0xff00) >> 8);
_pgm[5] = (unsigned char) ((_length) & 0x00ff);
(void)memcpy(_pgm + 6, ROM_FAST_PGM, sizeof(ROM_FAST_PGM));
if (FSTAT&0x10) // Check to see if FACCERR is set
{
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
__asm
{
TSX // transfer SP to HX
JSR 6,X // first 2 bytes of _pgm[] are 'addr'
}
}
void FLASH_page_erase(unsigned int addr)
{
unsigned char _pgm[sizeof(ROM_PGM) + 2];
_pgm[0] = (unsigned char)((addr & 0xff00) >> 8);
_pgm[1] = (unsigned char)(addr & 0x00ff);
(void)memcpy(_pgm + 2, ROM_PGM, sizeof(ROM_PGM));
_pgm[7] = FLASH_CMD_PAGEERASE;// change FCMD value
if (FSTAT&0x10) // Check to see if FACCERR is set
{
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
__asm
{
TSX // transfer SP to HX
JSR 2,X // first 2 bytes of _pgm[] are 'addr'
}
}
{
unsigned char _pgm[sizeof(ROM_PGM) + 2];
_pgm[0] = (unsigned char)((addr & 0xff00) >> 8);
_pgm[1] = (unsigned char)(addr & 0x00ff);
(void)memcpy(_pgm + 2, ROM_PGM, sizeof(ROM_PGM));
_pgm[7] = FLASH_CMD_PAGEERASE;// change FCMD value
if (FSTAT&0x10) // Check to see if FACCERR is set
{
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
__asm
{
TSX // transfer SP to HX
JSR 2,X // first 2 bytes of _pgm[] are 'addr'
}
}
