Hi all,
I need to write a Serial Number of a device to the CPU memory. I don't want to change it in the future so it would be the best to use Program Once field placed at 0x400100 address but I'm not albe to write there anything.
If I set PGMIFRON bit in the MMCCTL1 register and then try writing under the Program Once field address via far pointer I'm getting ILLEGAL_BP in HiWave.
I've tried using debugger commands but all i'm getting is "Error: error while writing to the memory".
Could someone please give me a simple step by step instruction how can I do this?
Best regards
Thank you for your answer. I will check your code, and in case of problems I write to you.
To answer my own question - I've worked it out. However a new problem has arosed.
I used CCOBIX and FCCOB registers (all listed below) to launch Program Once command.
Everythings looks good, memory is written but after this operation I'm getting an ILLEGAL_BP and processor goes to the reset.
How can I solve this problem?
// COPCTL = 0x0u; // disable COP (Computer Operating Properly) watchdog [is it required?]
// FCLKDIV = 0x05u; // clock divider = 5 (4 MHz) [is it required?]
FSTAT = 0x30u; // clear any error flags
FCCOBIX = 0x0u; // CCOBIX = 0
FCCOBHI = 0x07u; // load Program Once command
FCCOBLO = 0x0u;
FCCOBIX = 0x1u; // CCOBIX = 1
FCCOBHI = 0x0u; // load Program Once phrase index
FCCOBLO = 0x0u; // load Program Once phrase index
FCCOBIX = 0x2u; // CCOBIX = 2
FCCOBHI = 0xDEu; // load Program Once word 0 value
FCCOBLO = 0xAD; // load Program Once word 0 value
FCCOBIX = 0x3u; // CCOBIX = 3
FCCOBHI = 0xBEu; // load Program Once word 1 value
FCCOBLO = 0xEFu; // load Program Once word 1 value
FCCOBIX = 0x4u; // CCOBIX = 4
FCCOBHI = 0xDEu; // load Program Once word 2 value
FCCOBLO = 0xADu; // load Program Once word 2 value
FCCOBIX = 0x5u; // CCOBIX = 5
FCCOBHI = 0xCAu; // load Program Once word 3 value
FCCOBLO = 0xFEu; // load Program Once word 3 value
FSTAT = 0x80u; // launch command
Best regards,
g g
gg,
The issue here is that when programming the "Write Once" field, the program memory becomes in accessible. That is, it is the same issue as if you had tried to program the PFlash block. In order to program the "Write Once" field, the code that launches the "WriteOnce" command and waits for it to complete must execute from RAM. In fact, even when reading the "Write Once" field, the code must execute from RAM.
Here is a code snippet I used:
/*************************************************************************************/
static void near LaunchFCCOBCmd(void)
{
DisableInterrupts;
FSTAT = 0x80;
while ((FSTAT & 0x80) == 0)
;
EnableInterrupts;
}
/*************************************************************************************/
static void near LaunchFCCOBCmdEnd(void)
{
}
/*************************************************************************************/
static ErrorNum GetProgramOnceData(char *ROData)
{
/* Variable Declarations */
uchar StackCode[32];
uint x, CodeLen;
uchar *CodeByteP;
void (* near LaunchCmd)(void) = (void *)StackCode; /* initialize the function pointer to point to the code we'll copy onto the stack */
/* Begin Function GetProgramOnceData() */
CodeLen = (uint)((uchar *)LaunchFCCOBCmdEnd - (uchar *)LaunchFCCOBCmd); /* Get the size of the code */
CodeByteP = (uchar *)LaunchFCCOBCmd; /* init pointer to the code we'll copy */
for (x = 0; x < CodeLen; x++) /* copy code onto the stack, one byte at a time */
StackCode[x] = *CodeByteP++;
.
.
.
Hope this helps.
Best Regards,
Gordon