MSP430F5510: Korrupte Daten beim Lesen aus Flash

#3863229
Lesenswert?

Hallo,

ich schreibe momentan an einem Programm für den MSP430F5510, der Text 
und Grafiken auf einem Pixeldisplay ausgibt. Der Print, den ich für die 
Entwicklung nutze, hat monatelang problemlos funktioniert. Mit einem 
zweiten Print habe ich aber nun auf einmal seltsame Probleme.

Angefangen hat es mit "Pixelfehlern" in der Grafik, und "ASCII-Fehlern" 
im Text, also "dEbug" oder "debuf" statt "debug" auf dem Screen.

Ich habe dann meinen Code vereinfacht, bis ich bei dem gelandet bin:
1
#include <msp430.h>
2
#include <string.h>
3
#include "driverlib/MSP430F5xx_6xx/ucs.h"
4

5
static const uint16_t flash_data[] = {
6
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
7
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
9
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
10
};
11
static volatile uint16_t ram_data[] = {
12
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
13
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
14
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
15
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
16
};
17

18
void main(void)
19
{
20
    volatile uint32_t cnt = 0;
21
    static const uint32_t mclk = 25000000;
22

23
    WDTCTL = WDTPW | WDTHOLD;
24

25
    UCS_clockSignalInit(UCS_FLLREF, UCS_REFOCLK_SELECT, UCS_CLOCK_DIVIDER_1);
26
    UCS_initFLLSettle(mclk/1000, mclk/32768);
27

28
    while (1) {
29
        if (memcmp(&flash_data, (void*)&ram_data, sizeof(flash_data)) != 0) {
30
            _op_code(0x4343); # Software breakpoint
31
        }
32
        cnt++;
33
    }
34
}

Manchmal stoppt der Code auf dem Breakpoint, also wird manchmal das 
Flash falsch ausgelesen. Meistens passiert dies kurz nach dem Reset (cnt 
<= 50), manchmal geht es aber auch viel länger (cnt = einige Millionen). 
Nach dem nächsten Reset passiert es dann z.B. sofort wieder.

Folgendes habe ich bisher herausgefunden:

- Bei einer System clock von 24MHz statt 25MHz scheint das Problem nicht 
aufzutreten
- Bei zwei von vier getesteten Prints scheint das Problem nicht 
aufzutreten
- Mit einfachen Werten statt arrays tritt das Problem seltener auf; wenn 
ich != statt memcmp benutze, scheint es nicht mehr aufzutreten
- Compiler-Optimierungslevel macht keinen Unterschied
- ~1s delay vor und nach dem Clock-Einstellen macht keinen Unterschied
- Es scheint immer ein 1-bit als 0 gelesen zu werden, wenn die Daten 
0x00 statt 0xFF sind, kann ich das Problem nicht reproduzieren.

Ich habe TI's Dokumentation vom flash corruption Problem (slaa471) 
gelesen, aber da heisst es, dass der MSP430F5510 nicht betroffen ist, 
und die Art, wie die Daten falsch gelesen werden, ist auch anders.

Im Erratasheet (slaz301j) habe ich auch nichts interessantes gelesen, 
ausser "Corrupted flash read when SVM low-side flag is triggered" was 
nicht auf mein Problem zutreffen sollte. Der Chip ist von der Revision 
C, bei betroffenen und nicht betroffenen Prints.

Danke im Voraus für die Hilfe, ich bin am Ende meines Lateins 
inzwischen.

Ich habe folgende Files angehängt:

- Relevanter Teil des Schemas und Layouts
- Speisungsrampe auf dem guten und schlechten Print. (whoops, die 
schlechte Variante doppelt)
- zip mit einem CCSv4-Projekt mit dem Beispielcode.

Florian
Angehängte Dateien:
#3863396
Lesenswert?

Jim Meba schrieb:
> Fehlt da nicht das Umsetzten von PMMCOREV auf eine höhere VCore
> Spannung,
> damit die 25 MHz überhaupt benutzt werden dürffen?
> Zu niedriger VCore Level könnte das Verhalten (ein Chip tut, ein anderer
> nicht) erklären.

Ich dachte eigentlich, dass sich UCS_initFLLSettle da schon darum 
kümmert, aber wenn ich den code davon angucke, dann sehe ich das 
nirgends... Ich guck mir das morgen mal an.

Das würde auch erklären, wieso bei 24 MHz alles okay ist.
#3863850
Lesenswert?

Florian Bruhin schrieb:
> Jim Meba schrieb:
>> Fehlt da nicht das Umsetzten von PMMCOREV auf eine höhere VCore
>> Spannung,
>> damit die 25 MHz überhaupt benutzt werden dürffen?
>> Zu niedriger VCore Level könnte das Verhalten (ein Chip tut, ein anderer
>> nicht) erklären.
>
> Ich dachte eigentlich, dass sich UCS_initFLLSettle da schon darum
> kümmert, aber wenn ich den code davon angucke, dann sehe ich das
> nirgends... Ich guck mir das morgen mal an.
>
> Das würde auch erklären, wieso bei 24 MHz alles okay ist.

Das war in der Tat das Problem, mit einem zusätzlichen
1
PMM_setVCore(PMM_CORE_LEVEL_3);
ist alles okay. Ich hatte eigentlich erwartet, dass das 
UCS_initFLLSettle für mich schon erledigt.

Bevor ich auf die driverlib gewechselt habe, hatte ich den Code dafür 
auch drin. Eigentlich witzig, dass das so heftig über der spec (25 MHz 
statt 8) noch so gut gelaufen ist.

Ich habe denselben Post in Englisch auch noch im TI-Forum gepostet, da 
hat mir dann kurz nach dir auch noch ein TI-Mitarbeiter dasselbe 
erzählt.

Vielen Dank!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren