hold the BL pin then try to connect using philips utility over the serial port. If you can't chip is useless. Gus --- In , "mobilsiten" <petertholander@h...> wrote: > > Hi! > > I'm pretty new on this and I think i screwed it up really good directly > > I made this code and tried it: > > void writeToFlash() > { > command[0] = 54; > iap(command,result,0x7FFFFFF0); > > command[0] = 55; > iap(command,result,0x7FFFFFF0); > > //Prepare sector > command[0] = 50; // Command > command[1] = 8; // Start sector > command[2] = 8; // Stop sector > iap(command,result,0x7FFFFFF0); > > //Erase sector > command[0] = 52; // Command > command[1] = 8; // Start sector > command[2] = 8; // Stop sector > iap(command,result,0x7FFFFFF0); > > } > > Offcourse it didnt work because I forgot to set the CCLK in the erase > part. > But this was not all, after this I cant access the CPU again. I get > this error message: "Memory Missmatch Adress: 0x00000000 Value = 0x00 > Expected = 0x18". > Have I screwed up the CPU totally or is there anything I can do to > make it work again? > > Please can someone help me? > > Thanks |
Re: Flash problem
Started by ●February 8, 2005
Reply by ●February 8, 20052005-02-08
> void writeToFlash() > { > command[0] = 54; > iap(command,result,0x7FFFFFF0); > > command[0] = 55; > iap(command,result,0x7FFFFFF0); I'd really like to see how u defined your iap function pointer. Regardless, ensure that the IAP function pointer switches to thumb mode and takes 'only' 2 arguments (Command & Result). Note that function pointer must go to address 0x7ffffff1 (not 0x7ffffff0). Look closely at the "IAP Command" section in "Flash Memory System & Programming" in your User Manual. Leighton |
Reply by ●February 8, 20052005-02-08
Hi! I'm pretty new on this and I think i screwed it up really good directly I made this code and tried it: void writeToFlash() { command[0] = 54; iap(command,result,0x7FFFFFF0); command[0] = 55; iap(command,result,0x7FFFFFF0); //Prepare sector command[0] = 50; // Command command[1] = 8; // Start sector command[2] = 8; // Stop sector iap(command,result,0x7FFFFFF0); //Erase sector command[0] = 52; // Command command[1] = 8; // Start sector command[2] = 8; // Stop sector iap(command,result,0x7FFFFFF0); } Offcourse it didnt work because I forgot to set the CCLK in the erase part. But this was not all, after this I cant access the CPU again. I get this error message: "Memory Missmatch Adress: 0x00000000 Value = 0x00 Expected = 0x18". Have I screwed up the CPU totally or is there anything I can do to make it work again? Please can someone help me? Thanks |
Reply by ●February 9, 20052005-02-09
This is the iap function: void iap (unsigned *cmd,unsigned *rslt,unsigned entry) { asm("mov r15,r2"); } Its taken from Keils "exercises" Peter --- In , "Leighton Rowe" <leightonsrowe@y...> wrote: > > > void writeToFlash() > > { > > command[0] = 54; > > iap(command,result,0x7FFFFFF0); > > > > command[0] = 55; > > iap(command,result,0x7FFFFFF0); > I'd really like to see how u defined your iap function pointer. > > Regardless, ensure that the IAP function pointer switches to thumb > mode and takes 'only' 2 arguments (Command & Result). Note that > function pointer must go to address 0x7ffffff1 (not 0x7ffffff0). > > Look closely at the "IAP Command" section in "Flash Memory System & > Programming" in your User Manual. > > Leighton |
Reply by ●February 9, 20052005-02-09
Ok, thanks this solved the problem. Still I would like to know how this could totally messup the CPU.... Can someone tell me?? Peter --- In , "Gus" <gus_is_working@y...> wrote: > > hold the BL pin then try to connect using philips utility over the > serial port. If you can't chip is useless. > > Gus > > --- In , "mobilsiten" <petertholander@h...> > wrote: > > > > Hi! > > > > I'm pretty new on this and I think i screwed it up really good > directly > > > > I made this code and tried it: > > > > void writeToFlash() > > { > > command[0] = 54; > > iap(command,result,0x7FFFFFF0); > > > > command[0] = 55; > > iap(command,result,0x7FFFFFF0); > > > > //Prepare sector > > command[0] = 50; // Command > > command[1] = 8; // Start sector > > command[2] = 8; // Stop sector > > iap(command,result,0x7FFFFFF0); > > > > //Erase sector > > command[0] = 52; // Command > > command[1] = 8; // Start sector > > command[2] = 8; // Stop sector > > iap(command,result,0x7FFFFFF0); > > > > } > > > > Offcourse it didnt work because I forgot to set the CCLK in the > erase > > part. > > But this was not all, after this I cant access the CPU again. I get > > this error message: "Memory Missmatch Adress: 0x00000000 Value = > 0x00 > > Expected = 0x18". > > Have I screwed up the CPU totally or is there anything I can do to > > make it work again? > > > > Please can someone help me? > > > > Thanks |
Reply by ●February 9, 20052005-02-09
> This is the iap function: > > void iap (unsigned *cmd,unsigned *rslt,unsigned entry) > { > asm("mov r15,r2"); > } You're overwriting the PC (program counter) which is one of the scariest things u can do. Usually this results in prefetch aborts. You can to branch to the IAP bootloader address location by using a function pointer. The code below is some example code taken from the User Manual for the lpc you are using. #define IAP_LOCATION 0x7ffffff1 //address of IAP BL unsigned long command[5]; unsigned long result[2]; typedef void (*IAP)(unsigned int [],unsigned int[]); //function ptr IAP iap_entry; iap_entry=(IAP) IAP_LOCATION; // function pointer declared and set to address location iap_entry (command, result); //done |
Reply by ●February 9, 20052005-02-09
Now I have changed the code to this: IAP iap_entry; iap_entry = (IAP) IAP_LOCATION; //Prepare sector command[0] = 50; // Command command[1] = 7; // Start sector command[2] = 7; // Stop sector iap_entry(command,result); /* //Erase sector command[0] = 52; // Command command[1] = 7; // Start sector command[2] = 7; // Stop sector command[3] = 60000; // System clock frekquency in (CCLK) KHz iap_entry(command,result); //Prepare sector command[0] = 50; // Command command[1] = 7; // Start sector command[2] = 7; // Stop sector iap_entry(command,result); */ //Write command[0] = 51; // Command command[1] = 0x0000E000; // Start adress command[2] = source; // Data command[3] = 512; // Size of data 512 | 1024 | 4096 | 8192 command[4] = 60000; // System clock frekquency in (CCLK) KHz iap_entry(command,result); But it still dosent work. If i try to erase it seems like I mess ut the interrupt vector and if I try "copy to ram" I get SRC_ADDR_NOT_MAPPED. --- In , "Leighton Rowe" <leightonsrowe@y...> wrote: > > > This is the iap function: > > > > void iap (unsigned *cmd,unsigned *rslt,unsigned entry) > > { > > asm("mov r15,r2"); > > } > > You're overwriting the PC (program counter) which is one of the > scariest things u can do. Usually this results in prefetch aborts. > You can to branch to the IAP bootloader address location by using a > function pointer. > The code below is some example code taken from the User Manual for > the lpc you are using. > > #define IAP_LOCATION 0x7ffffff1 //address of IAP BL > > unsigned long command[5]; > unsigned long result[2]; > > typedef void (*IAP)(unsigned int [],unsigned int[]); //function ptr > > IAP iap_entry; > iap_entry=(IAP) IAP_LOCATION; // function pointer declared and set > to address location > > iap_entry (command, result); //done |
Reply by ●February 9, 20052005-02-09
I forgot to mention that IAP commands may take a while to complete. From the below code example (IAR), I think you'll have to continually call the IAP and check the the status flag for completion. //for (;;) //{ // iap_entry(cmd, status); // ret = status[0]; // if (ret != STATUS_BUSY) // { // return ret; //or anything else that exits // } //} --- In , "mobilsiten" <petertholander@h...> wrote: > > Now I have changed the code to this: > > IAP iap_entry; > > iap_entry = (IAP) IAP_LOCATION; > > //Prepare sector > command[0] = 50; // Command > command[1] = 7; // Start sector > command[2] = 7; // Stop sector > iap_entry(command,result); > /* > //Erase sector > command[0] = 52; // Command > command[1] = 7; // Start sector > command[2] = 7; // Stop sector > command[3] = 60000; // System clock frekquency in (CCLK) KHz > iap_entry(command,result); > > //Prepare sector > command[0] = 50; // Command > command[1] = 7; // Start sector > command[2] = 7; // Stop sector > iap_entry(command,result); > */ > > //Write > command[0] = 51; // Command > command[1] = 0x0000E000; // Start adress > command[2] = source; // Data > command[3] = 512; // Size of data 512 | 1024 | 4096 | 8192 > command[4] = 60000; // System clock frekquency in (CCLK) KHz > iap_entry(command,result); > But it still dosent work. If i try to erase it seems like I mess ut > the interrupt vector and if I try "copy to ram" I get SRC_ADDR_NOT_MAPPED. > > > --- In , "Leighton Rowe" <leightonsrowe@y...> > wrote: > > > > > This is the iap function: > > > > > > void iap (unsigned *cmd,unsigned *rslt,unsigned entry) > > > { > > > asm("mov r15,r2"); > > > } > > > > You're overwriting the PC (program counter) which is one of the > > scariest things u can do. Usually this results in prefetch aborts. > > You can to branch to the IAP bootloader address location by using a > > function pointer. > > > > > > The code below is some example code taken from the User Manual for > > the lpc you are using. > > > > #define IAP_LOCATION 0x7ffffff1 //address of IAP BL > > > > unsigned long command[5]; > > unsigned long result[2]; > > > > typedef void (*IAP)(unsigned int [],unsigned int[]); //function ptr > > > > IAP iap_entry; > > iap_entry=(IAP) IAP_LOCATION; // function pointer declared and set > > to address location > > > > iap_entry (command, result); //done |
|
Reply by ●February 9, 20052005-02-09
Sorry, still dosent work I directly get the error code SRC_ADDR_NOT_MAPPED I dont dissable the interrupts (because I have not manage to solve this eighter...) But I dont think there can be any interrupts because this is the only code in the application,,,as long as the cpu dosent create any own interrupts... --- In , "Leighton Rowe" <leightonsrowe@y...> wrote: > > I forgot to mention that IAP commands may take a while to complete. > From the below code example (IAR), I think you'll have to > continually call the IAP and check the the status flag for > completion. > //for (;;) > //{ > // iap_entry(cmd, status); > // ret = status[0]; > // if (ret != STATUS_BUSY) > // { > // return ret; //or anything else that exits > // } > //} > --- In , "mobilsiten" <petertholander@h...> > wrote: > > > > Now I have changed the code to this: > > > > IAP iap_entry; > > > > iap_entry = (IAP) IAP_LOCATION; > > > > //Prepare sector > > command[0] = 50; // Command > > command[1] = 7; // Start sector > > command[2] = 7; // Stop sector > > iap_entry(command,result); > > /* > > //Erase sector > > command[0] = 52; // Command > > command[1] = 7; // Start sector > > command[2] = 7; // Stop sector > > command[3] = 60000; // System clock frekquency in (CCLK) > KHz > > iap_entry(command,result); > > > > //Prepare sector > > command[0] = 50; // Command > > command[1] = 7; // Start sector > > command[2] = 7; // Stop sector > > iap_entry(command,result); > > */ > > > > //Write > > command[0] = 51; // Command > > command[1] = 0x0000E000; // Start adress > > command[2] = source; // Data > > command[3] = 512; // Size of data 512 > | 1024 | 4096 | 8192 > > command[4] = 60000; // System clock frekquency > in (CCLK) KHz > > iap_entry(command,result); > > > > > > But it still dosent work. If i try to erase it seems like I mess ut > > the interrupt vector and if I try "copy to ram" I get > SRC_ADDR_NOT_MAPPED. > > > > > > --- In , "Leighton Rowe" > <leightonsrowe@y...> > > wrote: > > > > > > > This is the iap function: > > > > > > > > void iap (unsigned *cmd,unsigned *rslt,unsigned entry) > > > > { > > > > asm("mov r15,r2"); > > > > } > > > > > > You're overwriting the PC (program counter) which is one of the > > > scariest things u can do. Usually this results in prefetch > aborts. > > > You can to branch to the IAP bootloader address location by > using a > > > function pointer. > > > > > > > > > The code below is some example code taken from the User Manual > for > > > the lpc you are using. > > > > > > #define IAP_LOCATION 0x7ffffff1 //address of IAP BL > > > > > > unsigned long command[5]; > > > unsigned long result[2]; > > > > > > typedef void (*IAP)(unsigned int [],unsigned int[]); //function > ptr > > > > > > IAP iap_entry; > > > iap_entry=(IAP) IAP_LOCATION; // function pointer declared and > set > > > to address location > > > > > > iap_entry (command, result); //done |
Reply by ●February 9, 20052005-02-09
> //Write > command[0] = 51; // Command > command[1] = 0x0000E000; // Start adress > command[2] = source; // Data > command[3] = 512; // Size of data 512 | 1024 | 4096 | 8192 > command[4] = 60000; // System clock frekquency in (CCLK) KHz It looks like everything but the write command is ok. Just for clarity, what you're using for the variable "source"? |