Thank you Mark, here you can find the source code of my driver:
#define FLASH_ERASE_SECTOR_CMD_LEN 4
#define FLASH_CMD_OFFSET 0
#define FLASH_CMD_ADDRESS_23_16_OFFSET 1
#define FLASH_CMD_ADDRESS_15_08_OFFSET 2
#define FLASH_CMD_ADDRESS_07_00_OFFSET 3
#define FTFE_ERASE_SECTOR (UBYTE)0x09
void vFlashInit( void )
{
while( ( FTFE_FSTAT & FTFE_FSTAT_CCIF_MASK ) == 0 )
{
/* Wait until CCIF is set */
}
FTFE_FSTAT |= FTFE_FSTAT_RDCOLERR_MASK | FTFE_FSTAT_ACCERR_MASK | FTFE_FSTAT_FPVIOL_MASK;
}
void vTestEraseFlashSector( void )
{
UBYTE ubCommandArray[ FLASH_ERASE_SECTOR_CMD_LEN ];
ULONG ulDestinationAddress;
UBYTE ubIndex;
ulDestinationAddress = (ULONG)0x00001000;
/* Build command */
ubCommandArray[ FLASH_CMD_OFFSET ] = FTFE_ERASE_SECTOR;
ubCommandArray[ FLASH_CMD_ADDRESS_23_16_OFFSET ] = (UBYTE)( ulDestinationAddress >> 16 );
ubCommandArray[ FLASH_CMD_ADDRESS_15_08_OFFSET ] = (UBYTE)( ulDestinationAddress >> 8 );
ubCommandArray[ FLASH_CMD_ADDRESS_07_00_OFFSET ] = (UBYTE)( ulDestinationAddress );
/* Copy to FCCOBx */
for( ubIndex = 0; ubIndex < FLASH_ERASE_SECTOR_CMD_LEN; ubIndex++ )
{
while( ( FTFE_FSTAT & FTFE_FSTAT_CCIF_MASK ) != FTFE_FSTAT_CCIF_MASK )
{
/* Attende fino a che trova il bit settato */
}
wvSetFCCOBxValue( ubIndex, ubCommandArray[ ubIndex ] );
}
/* Launch command */
wenFlashLaunchCommand();
}
static void wvSetFCCOBxValue( UBYTE ubRegIndex, UBYTE ubRegValue )
{
switch( ubRegIndex )
{
case 0:
FTFE_FCCOB0 = ubRegValue;
break;
case 1:
FTFE_FCCOB1 = ubRegValue;
break;
case 2:
FTFE_FCCOB2 = ubRegValue;
break;
case 3:
FTFE_FCCOB3 = ubRegValue;
break;
case 4:
FTFE_FCCOB4 = ubRegValue;
break;
case 5:
FTFE_FCCOB5 = ubRegValue;
break;
case 6:
FTFE_FCCOB6 = ubRegValue;
break;
case 7:
FTFE_FCCOB7 = ubRegValue;
break;
case 8:
FTFE_FCCOB8 = ubRegValue;
break;
case 9:
FTFE_FCCOB9 = ubRegValue;
break;
case 10:
FTFE_FCCOBA = ubRegValue;
break;
case 11:
FTFE_FCCOBB = ubRegValue;
break;
default:
break;
}
}
static __ramfunc EN_DIAGNCODE wenFlashLaunchCommand( void )
{
FTFE_FSTAT |= FTFE_FSTAT_CCIF_MASK;
/* Check CCIF flag */
while( ( FTFE_FSTAT & FTFE_FSTAT_CCIF_MASK ) != FTFE_FSTAT_CCIF_MASK )
{
/* Wait until CCIF is set */
}
return EN_DIAGNCODE_OK;
}
In main application i call first vFlashInit and then vTestEraseFlashSector. Status register is OK (value 0x80) but flash memory seems to be unchanged.
Many thanks, bye.