Hi,
I am working the MC9S12KG256 and writing flash driver to program CPU. Code
executed from RAM.
FLASH memory is fully unsecured, FPROT for bank 0 is $84, for bank 1 is $FF.
Call to EraseFL (B=$00,A=$00) succesfully erases all FLASH sectors except
protected.
Call to WriteFL succesfully program only bank 0. For bank 1 it doesn't
return any error on programming stage, but there is no data programmed, so
comparsion always failed.
Is it my fault or i miss something from datasheet?
Driver code below:
InitFLASH: brset FCLKDIV,#%10000000,IF_Skip
movb #%101001,FCLKDIV
IF_Skip: movb #%110000,FSTAT
rts
ExecFLASHCmd: ; C set on error
movb #%10000000,FSTAT
EFC_Wait: jsr AckCOP
brclr FSTAT,#%10000000,EFC_Wait
ChkFLASH: pshb
ldab FSTAT
andb #$30
addb #$FF
pulb
rts
WaitFLASHCmd: ; C set on error
jsr AckCOP
brclr FSTAT,#%1000000,WaitFLASHCmd
bra ChkFLASH
EraseFL: ; > B - StartPage; A - Count
bsr SelectFLASH
bsr InitFLASH
pshb
EraseFL_Loop: ldab 0,sp
lsrb
lsrb
lsrb
lsrb
orab #$30
stab PPAGE
bsr SelectFLASH
ldab 0,sp
psha
tfr b,a
anda #$0F
lsla
lsla
oraa #$80
clrb
tfr d,y
pula
std 0,y
movb #$40,FCMD
bsr ExecFLASHCmd
bcs EFL_Error
inc 0,sp
dbne a,EraseFL_Loop
EFL_Error: bsr WaitFLASHCmd
pulb
rts
SelectFLASH: brset PPAGE,#$08,SFL_M0
movb #$01,FCNFG
rts
SFL_M0: clr FCNFG
rts
; program $40 bytes from PgmPtr to PgmAddr[8000..BFFF] (PPAGE already set)
WriteFL: ; < B - 0=OK
bsr SelectFLASH
bsr InitFLASH
ldx PgmPtr
ldy PgmAddr
clra
WriteFL_PLoop: movw 2,x+,2,y+
movb #$20,FCMD
bsr ExecFLASHCmd
bcs WriteFL_Wait
inca
cmpa #$20
blo WriteFL_PLoop
WriteFL_Wait: bsr WaitFLASHCmd
bcs WriteFL_Err
ldx PgmPtr
ldy PgmAddr
clra
WriteFL_CLoop: ldab a,x
cmpb a,y
bne WriteFL_CErr
inca
cmpa #$40
blo WriteFL_CLoop
clrb
rts
WriteFL_Err: ldab FSTAT
orab #$01
rts
WriteFL_CErr: ldab #$CE
rts
I am trying to write a routine that will
program flash bytes at the security location in fixed memory at location
$ff00. The flash is unsecured (FSEC = 0xfe) All the code is executed
from RAM. The first thing I want to do is erase the sector with command
$40. The FCLKDIV is set to program at just under 200khz, PVIOL and
ACCERR is checked for all banks, the bank is reset to bank 0 (FCNFG = 0)
the sector address is sent by writing something to $fe00, then the
command to erase the sector is sent (0x40 to FCMD). But as soon as that
is done, the ACCERR is set in the FSTAT register. I can't understand
why, this is a valid command and all the other conditions seem to be OK.
Does anyone have any insight on this?, thanks in advance. Oh, and PPAGE
is $3f, but the doc says it doesn't matter when programming fixed
memory.
- Kevin Longworth
MC9S12KG256 FLASH bank 1 erased, but not programming
Started by ●March 26, 2010
Reply by ●March 26, 20102010-03-26
Where is the subroutine 'AckCOP' located? Does this call use
absolute rather than relative addressing? Is the subroutine located
in a common page?
Bill
At 12:52 PM 3/26/2010, you wrote:
>Hi,
>
>I am working the MC9S12KG256 and writing flash driver to program
>CPU. Code executed from RAM.
[snip]
>ExecFLASHCmd: ; C set on error
> movb #%10000000,FSTAT
>EFC_Wait: jsr AckCOP
> brclr FSTAT,#%10000000,EFC_Wait
>ChkFLASH: pshb
> ldab FSTAT
> andb #$30
> addb #$FF
> pulb
> rts
>
>WaitFLASHCmd: ; C set on error
> jsr AckCOP
> brclr FSTAT,#%1000000,WaitFLASHCmd
> bra ChkFLASH
[snip]
absolute rather than relative addressing? Is the subroutine located
in a common page?
Bill
At 12:52 PM 3/26/2010, you wrote:
>Hi,
>
>I am working the MC9S12KG256 and writing flash driver to program
>CPU. Code executed from RAM.
[snip]
>ExecFLASHCmd: ; C set on error
> movb #%10000000,FSTAT
>EFC_Wait: jsr AckCOP
> brclr FSTAT,#%10000000,EFC_Wait
>ChkFLASH: pshb
> ldab FSTAT
> andb #$30
> addb #$FF
> pulb
> rts
>
>WaitFLASHCmd: ; C set on error
> jsr AckCOP
> brclr FSTAT,#%1000000,WaitFLASHCmd
> bra ChkFLASH
[snip]
Reply by ●March 26, 20102010-03-26
Hello, William.
26/03/2010, 22:23:26 you wrote:
WRE> Where is the subroutine 'AckCOP' located? Does this call use
WRE> absolute rather than relative addressing? Is the subroutine located
WRE> in a common page?
AckCOP is also in RAM (at $30CE). FLASH routines located from $3625.
AckCOP: movb #$55,ARMCOP
movb #$AA,ARMCOP
rts
>>I am working the MC9S12KG256 and writing flash driver to program
>>CPU. Code executed from RAM.
WRE> [snip]
>>ExecFLASHCmd: ; C set on error
>> movb #%10000000,FSTAT
>>EFC_Wait: jsr AckCOP
>> brclr FSTAT,#%10000000,EFC_Wait
>>ChkFLASH: pshb
>> ldab FSTAT
>> andb #$30
>> addb #$FF
>> pulb
>> rts
>>
>>WaitFLASHCmd: ; C set on error
>> jsr AckCOP
>> brclr FSTAT,#%1000000,WaitFLASHCmd
>> bra ChkFLASH
WRE> [snip]
-- Sergey
26/03/2010, 22:23:26 you wrote:
WRE> Where is the subroutine 'AckCOP' located? Does this call use
WRE> absolute rather than relative addressing? Is the subroutine located
WRE> in a common page?
AckCOP is also in RAM (at $30CE). FLASH routines located from $3625.
AckCOP: movb #$55,ARMCOP
movb #$AA,ARMCOP
rts
>>I am working the MC9S12KG256 and writing flash driver to program
>>CPU. Code executed from RAM.
WRE> [snip]
>>ExecFLASHCmd: ; C set on error
>> movb #%10000000,FSTAT
>>EFC_Wait: jsr AckCOP
>> brclr FSTAT,#%10000000,EFC_Wait
>>ChkFLASH: pshb
>> ldab FSTAT
>> andb #$30
>> addb #$FF
>> pulb
>> rts
>>
>>WaitFLASHCmd: ; C set on error
>> jsr AckCOP
>> brclr FSTAT,#%1000000,WaitFLASHCmd
>> bra ChkFLASH
WRE> [snip]
-- Sergey