AnsweredAssumed Answered

Kinetis EA Flashing?

Question asked by Andrew Kohlsmith on Dec 24, 2014
Latest reply on Jan 17, 2015 by Andrew Kohlsmith

I've got a very simple Kinetis EA (S9KEAZN64AMLC) design. It's using the internal oscillator. I can build code for it using the Kinetis Design Studio, and my J-Link Lite can see it and talk to it. I can use the tools to read and write to SRAM.

 

I can't, however, flash the device.  I've tried both within the IDE as well as with the command line J-Link Commander tool. The devices are definitely not locked (fresh stock from DigiKey). OpenOCD doesn't have the correct flash algorithm for this specific series of Kinetis.

 

How does one flash these devices? I am sure I'm missing something stupid, and my gut tells me that it's perhaps the fact that I'm using the slow internal oscillator. I've not found anything useful on these forums or on various web searches, and I'm getting pretty frustrated. Can anyone shed some light on this? I'm running on a 3.3V regulated supply, I'm not doing anything goofy with any of the I/O, and the SWD interface is not being shared with anything else.

 

Sample output from JLinkExe:

 

$ JLinkExe

SEGGER J-Link Commander V4.94c ('?' for help)

Compiled Oct 31 2014 20:08:55

DLL version V4.94c, compiled Oct 31 2014 20:08:48

Firmware: J-Link Lite-Cortex-M V8 compiled Jul 17 2014 11:40:12

Hardware: V8.00

S/N: 518107921

Feature(s): GDB

VTarget = 3.332V

Info: Could not measure total IR len. TDO is constant high.

Info: Could not measure total IR len. TDO is constant high.

No devices found on JTAG chain. Trying to find device on SWD.

Info: Found SWD-DP with ID 0x0BC11477

Info: Found Cortex-M0 r0p0, Little endian.

Info: FPUnit: 2 code (BP) slots and 0 literal slots

Cortex-M0 identified.

Target interface speed: 100 kHz

 

J-Link>device skeazn64xxx2

Info: Device "SKEAZN64XXX2" selected (64 KB flash, 4 KB RAM).

Reconnecting to target...

Info: Found SWD-DP with ID 0x0BC11477

Info: Found SWD-DP with ID 0x0BC11477

Info: Found Cortex-M0 r0p0, Little endian.

Info: FPUnit: 2 code (BP) slots and 0 literal slots

 

J-Link>r

Reset delay: 0 ms

Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit.

 

J-Link>erase

Erasing device (SKEAZN64xxx2)...


(...several second pause while it communicates with the MCU...)



 

****** Error: PC of target system has unexpected value after erasing sector. (PC = 0xFFFFFFFE)!

---------------------------------------------------------------------- Registers -------------------------------------------------------------------------------------

    PC   = FFFFFFFE

Current: R0   = 00F3E3BE, R1   = 00000001, R2   = 4004801C, R3   = 00000001

    R4   = 00000000, R5   = 00000000, R6   = 000000F4, R7   = 1FFFFD61

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

Info: J-Link: Flash download: Total time needed: 2.174s (Prepare: 0.894s, Compare: 0.000s, Erase: 0.736s, Program: 0.000s, Verify: 0.000s, Restore: 0.542s)

ERROR: Erase returned with error code -5.


Dec 29 edit:

 

Some more information:

 

I read that the NMI# pin is enabled out of reset (and verified this by reading SIM_SOPT) but also that it has an internal pull-up when enabled. On this particular part PTB4 is on pin 10 which is a no-connect in my design. Disabling the NMI pin makes no difference.

 

Looking at clocking now... Out of reset, ICS is the clock source to the FLL and BDIV in ICS_C2 is set to 001 (the reset default). If I understand correctly, this means that the 32kHz internal oscillator is multiplied by 1024 by the FLL and then divided by 2, making ICSOUTCLK 32kHz * 1024 / 2 or 16.8MHz. I can verify through the J-Link CLI that the FLL is locked by reading ICS_S:

 

J-Link>mem8 40064004 1

40064004 = 50

 

(LOCK and IREFST are set, this is correct.)

 

I then move on to verify that the SIM has the clock enabled for the flash controller by reading SIM_SCGC. I can also quickly check to make sure that BUSDIV in SIM_BUSDIV is set to zero which means that the BUSCLK is the same frequency as ICSOUTCLK (i.e. it's not being divided down):

 

J-Link>mem32 4004800c 1

4004800C = 00003000

J-Link>mem32 40048018 1

40048018 = 00000000

 

So far, everything looks fine. BUSCLK is 16.8MHz and the flash controller clock isn't gated.

 

Now let's move on to the flash controller. Out of reset FCLKDIV is zero, and we need a 1MHz clock. Table 18-2 in KEA64RM shows that FDIV should be set to 0x10.

 

Out of reset:

J-Link>mem8 40020000 1

40020000 = 00

 

Setting up the divider and verifying things are good:

 

J-Link>w1 40020000 10

Writing 10 -> 40020000

J-Link>mem8 40020000 1

40020000 = 90

 

FDIVLD is set and the correct value in FDIV is shown.

 

Before going too far ahead, let's make sure that the flash isn't protected:

 

J-Link>mem8 40020001 1

40020001 = FE

 

KEYEN = 11 (disabled) and SEC=10 (unsecured). Ok.  Let's try to verify the device is blank:

 

J-Link>mem8 40020006 1

40020006 = 80

J-Link>w1 40020002 0

Writing 00 -> 40020002

J-Link>w1 4002000a 1

Writing 01 -> 4002000A

J-Link>mem8 40020006

J-Link>w1 40020006 80

Writing 80 -> 40020006

J-Link>mem8 40020006 1

40020006 = 83

 

Here we see that the MGSTAT bits in FSTAT indicate that blank check has failed and also that non-correctable errors were found. Odd.  Let's try erasing it ourselves:

 

J-Link>w1 40020002 0

Writing 00 -> 40020002

J-Link>w1 4002000a 8

Writing 08 -> 4002000A

J-Link>w1 40020006 80

Writing 80 -> 40020006

J-Link>mem8 40020006 1

40020006 = 80

 

The erase all command succeeded. Now let's try a blank check:

 

J-Link>w1 40020002 0

Writing 00 -> 40020002

J-Link>w1 4002000a 1

Writing 01 -> 4002000A

J-Link>w1 40020006 80

Writing 80 -> 40020006

J-Link>mem8 40020006 1

40020006 = 80

 

Now the blank check is fine?

 

At this point I'm about ready to give up, eat the loss on these prototypes and go with a processor from ST where I've never had these kinds of issues before. The Kinetis documentation is thorough enough but it is very dense and I'm finding it very difficult to get started. I can wiggle I/O through memory reads and access other peripherals but I can't for the life of me figure out what's wrong with the flash controller.  I've been working with micros for over 20 years and this kind of difficulty is something I have never encountered before.

 

Edited to include walkthrough of the device state and flash erase attempt

 

Added schematic page showing MCU, power supplies and SWD interface

Attachments

Outcomes