www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik R8C Daten ins daten-Flash schreiben


Autor: crissi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,
weis jemand wie man z.b Messwerte ins datenflash (Block a oder b) vom 
R8c bekommt. in der Simulation geht es ohne prob.
wird der controller geflasht gehts es nicht:

#include "sfr_r827.h"

void main(void)
{
unsigned int start_addr_flash_a = 0x2400;
unsigned int *flash_ptr;

flash_ptr=(int*)start_addr_flash_a;

fmr01=1;      //CPU rewrite mode enable
fmr11=1;      //EW1 mode
*flash_ptr=0x40;                //command for programm
*(flash_ptr)=0x08;              // 0x08 daten zum schreiben
while(fmr00!=1);

fmr01=0;

while(1);
}

Gruß
crissi

Autor: *.* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine für mich funktionierenden Funktionen (R8/C13):
(main ist schnell zusammengewürfelt und ungetestet)
typedef unsigned char    Bit8u;
typedef unsigned int    Bit16u;

#define CLI asm( "FCLR I")
#define STI asm( "FSET I")

#define FLASH_SUCCESS                 0x00
#define FLASH_ERASE_ERROR             0x80
#define FLASH_ERASE_TIMEOUT           0x81
#define FLASH_SOFTWARE_ERROR          0xc0
#define FLASH_PROGRAM_ERROR           0x40
#define FLASH_PROGRAM_TIMEOUT         0x41
#define FLASH_ERASE_BLANLKCHECK_FAIL  0x02
#define FLASH_INFOBLOCK_TRASHED       0x06
#define FLASH_INFOBLOCK_SIZE_MISMATCH 0x07
#define FLASH_EMPTY                   0x08
#define FLASH_ALREADY_WRITTEN         0x09

#define FLASHI_READ       0xFF
#define FLASHI_WRITE      0x40
#define FLASHI_CLEARSTAT  0x50
#define FLASHI_ERASE1     0x20
#define FLASHI_ERASE2     0xD0

#define FLASH_BLOCK_A_START 0x2000 
#define FLASH_BLOCK_B_START 0x2800 

static void flash_openMEM() {
  prcr = 0x02; // pm0, pm1 enable
  pm1 = 0x01; // Data block enable
  prcr = 0;  // pm0, pm1 disable
  fmr4 = 0x00; // Erase suspend mode disable

  CLI;
  fmr0 = 0x01;
  asm(""); // de-optimize
  fmr0 = 0x03; // CPU rewrite enable
  fmr1 = 0x00;
  asm(""); // de-optimize
  fmr1 = 0x02; // EW1 mode
  STI;
}

static Bit8u FLASH_writeArray(Bit8u* data, Bit8u* addr, Bit16u length) {
  Bit8u retval;
  while(length) {

    if(*addr != 0xff) {
      //sched_globals.dbgval = (Bit16u) addr;
      return FLASH_ALREADY_WRITTEN;
    }

    CLI;
    *addr = FLASHI_WRITE;
    *addr = *data;
    STI;
    while( fmr00 != 1 );  // Ready check LOCK TROUBLE
                // is supposed to take 50 µsec
  
    // Program status check
    retval = fmr0 & FLASH_SOFTWARE_ERROR;
    // Status check
    if(!retval) {
      // success: 
      *addr = FLASHI_CLEARSTAT;
    }
    data++;
    addr++;
    length--;
  }
  return retval;
}

void main() {
  Bit8u data[]="TTEESSTT";
  Bit8u retval;
  flash_openMEM();

  retval = FLASH_writeArray(data, (Bit8u*)FLASH_BLOCK_A_START, 9);
  switch(retval) {
    case FLASH_SUCCESS:
      ...
      break;
    case FLASH_SOFTWARE_ERROR:
    case FLASH_PROGRAM_ERROR:
    case FLASH_PROGRAM_TIMEOUT:
    case FLASH_ALREADY_WRITTEN:
      ...
      break;
  }
}

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du schon mal in die Application notes von Renesas geschaut?

Autor: Marco Alber (mago)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich komme mit dem Flash des R8C/13 (Elektor-Ausgabe) überhaupt nicht 
klar. Laut Renesas (siehe 
http://documentation.renesas.com/eng/products/mpum...) 
kann man "einfach" die entsprechende API benutzen. Hier bekomme ich 
jedoch beim Löschen (unabhängig ob Block_A oder Block_B) immer eine 2 
zurück (Command Sequence Error (locked block, incorrect command, etc)).

Auch die Lösung oben habe ich versucht. Der Flash wird nicht 
beschrieben.
Lesen kann ich den Flash doch per Zugriff auf die Adresse 0x2000 
(BLOCK_A) z.B. so:
char *flash;
flash = (char*)0x2000;
// Wenn ein A im Flash ist dann... 
if (*flash=='A')
...

Stimmt das?

Vielleicht wichti: Ich arbeite mit den internen 8mHz...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.