Hi, Richard. This is an excertp of my test code:
#define IAP_LOCATION 0x7ffffff1
typedef void (*IAP)(unsigned int [],unsigned int[]);
static unsigned int iapcmd[5];
static unsigned int iapres[3];
#define IAP_CMD_PREPARE_FOR_WRITE 50
#define IAP_CMD_COPY_RAM_TO_FLASH 51
#define IAP_CMD_ERASE_SECTORS 52
#define IAP_CMD_CHECK_BLANK 53
#define IAP_CMD_READ_PART_ID 54
#define IAP_COMMAND 0
#define IAP_RESULT 0
#define IAP_PFW_START_SECTOR 1
#define IAP_PFW_END_SECTOR 2
#define IAP_CRTF_DST_ADDR 1
#define IAP_CRTF_SRC_ADDR 2
#define IAP_CRTF_BYTES 3
#define IAP_CRTF_CCLK_KHZ 4
#define IAP_ES_START_SECTOR 1
#define IAP_ES_END_SECTOR 2
#define IAP_ES_CCLK_KHZ 3
#define IAP_CB_START_SECTOR 1
#define IAP_CB_END_SECTOR 2
#define IAP_CB_NON_BLANK_FIRST 1
#define IAP_CB_NON_BLANK_WORD 2
....
} else if( !strnicmp( command, "iapw ", 5 ) )
{
static char buf[256];
char* txt = &command[5];
int res;
memset( buf, 0, sizeof(buf) );
strcpy( buf, txt );
do { // Not a loop
res = IAP_CheckBlank( 22, 22 );
if( res != IAP_CMD_SUCCESS )
{
printf( "Sector is not blank. Blanking sector...\r\n" );
res = IAP_PrepareForWrite( 22, 22 );
if( res != IAP_CMD_SUCCESS )
{
printf( "IAP_PrepareForWrite() returns error %
d\r\n", res );
break;
}
res = IAP_EraseSectors( 22, 22 );
if( res != IAP_CMD_SUCCESS )
{
printf( "IAP_EraseSectors() returns error %d\r\n", res );
break;
}
printf( "Sector blanked.\r\n" );
}
printf( "Writing onto flash...\r\n" );
res = IAP_PrepareForWrite( 22, 22 );
if( res != IAP_CMD_SUCCESS )
{
printf( "IAP_PrepareForWrite() returns error %d\r\n", res );
break;
}
res = IAP_CopyRAMToFlash( buf, (void*) 0x00078000, sizeof(buf) );
if( res == IAP_CMD_SUCCESS )
{
printf( "Flash memory written successfully.\r\n", res );
if( memcmp( buf, (void*) 0x00078000, sizeof(buf) ) )
{
printf
( "Flash and RAM buffer contents do NOT match.\r\n" );
} else {
printf( "Flash and RAM buffer are now identical.\r\n" );
}
} else {
printf( "IAP_CopyRAMToFlash() returns error %d\r\n", res );
break;
}
} while(0);
}
....
///////////////////////////////////////
int IAP_PrepareForWrite( int start_sector, int end_sector )
{
taskENTER_CRITICAL();
iapcmd[IAP_COMMAND] = IAP_CMD_PREPARE_FOR_WRITE;
iapcmd[IAP_PFW_START_SECTOR] = start_sector;
iapcmd[IAP_PFW_END_SECTOR] = end_sector;
IAP iap_entry = (IAP) IAP_LOCATION;
iap_entry( iapcmd, iapres );
int res = (int) iapres[IAP_RESULT];
taskEXIT_CRITICAL();
return res;
}
int IAP_CopyRAMToFlash( void* src_addr, void* dst_addr, int bytes )
{
taskENTER_CRITICAL();
iapcmd[IAP_COMMAND] = IAP_CMD_COPY_RAM_TO_FLASH;
iapcmd[IAP_CRTF_SRC_ADDR] = (unsigned long) src_addr;
iapcmd[IAP_CRTF_DST_ADDR] = (unsigned long) dst_addr;
iapcmd[IAP_CRTF_BYTES] = bytes;
iapcmd[IAP_CRTF_CCLK_KHZ] = GetCCLKKHz();
IAP iap_entry = (IAP) IAP_LOCATION;
iap_entry( iapcmd, iapres );
int res = (int) iapres[IAP_RESULT];
taskEXIT_CRITICAL();
return res;
}
int IAP_EraseSectors( int start_sector, int end_sector )
{
taskENTER_CRITICAL();
iapcmd[IAP_COMMAND] = IAP_CMD_ERASE_SECTORS;
iapcmd[IAP_ES_START_SECTOR] = start_sector;
iapcmd[IAP_ES_END_SECTOR] = end_sector;
iapcmd[IAP_CRTF_CCLK_KHZ] = GetCCLKKHz();
IAP iap_entry = (IAP) IAP_LOCATION;
iap_entry( iapcmd, iapres );
int res = (int) iapres[IAP_RESULT];
taskEXIT_CRITICAL();
return res;
}
int IAP_CheckBlank( int start_sector, int end_sector )
{
taskENTER_CRITICAL();
iapcmd[IAP_COMMAND] = IAP_CMD_CHECK_BLANK;
iapcmd[IAP_CB_START_SECTOR] = start_sector;
iapcmd[IAP_CB_END_SECTOR] = end_sector;
IAP iap_entry = (IAP) IAP_LOCATION;
iap_entry( iapcmd, iapres );
int res = (int) iapres[IAP_RESULT];
taskEXIT_CRITICAL();
return res;
}
Guille
--- In lpc2000@yahoogroups.com, Robert Adsett <subscriptions@a...>
wrote:
>
> My apologies if this shows up twice. Every once in a while Yahoo
decides
> it couldn't send a piece of mail my way several days in the past
and shuts
> down delivery despite having sent mail successfully to the same
address
> since many times.
>
> At 07:42 PM 1/25/06 -0500, Tom Walsh wrote:
> >Guillermo Prandi wrote:
> > >Hi. Are Flash write errors normal, i.e. a known issue? When
> > >programming my LPC2138 using the isp21lpc utility, every now and
then
> > >I get a write error; a second attempt always succeed. This
happens
> > >roughly once every 100 programming attempts. I thought it could
have
> > >been a problem with my serial cable or some other hardware
problem,
> > >but now I added an IAP function to my test program and I am
getting
> > >errors too (i.e., saved data differs from the source data,
although
> > >the IAP copy ram to flash command returns CMD_SUCCESS). I checked
> > >everything and I think I covered the normal requisites:
> > >
> > >
> > >
> >
> >There seems to be something goofy going on with those utils. I
tried
> >using the lpc21isp (version 1.24) package on Linux, but it would
> >sometimes error out at random locations. Not sure why.
> >
> >I finally had to write an ISP loader for an LPC2138 to program an
> >LPC2106. This loader source I then took an hung some RS232
routines
> >onto it so I could also up load into the LPC2138 from Linux. So
far, my
> >loader works flawlessly.
>
> I had some similar occurrences with the Philips utility as well.
They seem
> to have disappeared about the time I started using the automatic
> downloading and a good cabling setup on the last few centimeters.
I've not
> had a similar problem with the lpc21isp program and I've not tried
> IAP. Mind you the write errors I was seeing were not verify errors
but the
> protocol appearing to simply stop and it was rare enough that I
couldn't be
> certain as to its source.
>
> A quick question to verify my understanding of what you are seeing
> Guillermo, is your verification source the same buffer you just
used to
> program via IAP or do you refresh it from elsewhere before you do
the compare?
>
> Just a little more grist for the mill.
>
> Robert
>
> " 'Freedom' has no meaning of itself. There are always
restrictions, be
> they legal, genetic, or physical. If you don't believe me, try to
chew a
> radio signal. " -- Kelvin Throop, III
> http://www.aeolusdevelopment.com/
>Message
Re: Flash write errors
2006-01-26 by Guillermo Prandi
Attachments
- No local attachments were found for this message.