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


von crissi (Gast)


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

von *.* (Gast)


Lesenswert?

Meine für mich funktionierenden Funktionen (R8/C13):
(main ist schnell zusammengewürfelt und ungetestet)
1
typedef unsigned char    Bit8u;
2
typedef unsigned int    Bit16u;
3
4
#define CLI asm( "FCLR I")
5
#define STI asm( "FSET I")
6
7
#define FLASH_SUCCESS                 0x00
8
#define FLASH_ERASE_ERROR             0x80
9
#define FLASH_ERASE_TIMEOUT           0x81
10
#define FLASH_SOFTWARE_ERROR          0xc0
11
#define FLASH_PROGRAM_ERROR           0x40
12
#define FLASH_PROGRAM_TIMEOUT         0x41
13
#define FLASH_ERASE_BLANLKCHECK_FAIL  0x02
14
#define FLASH_INFOBLOCK_TRASHED       0x06
15
#define FLASH_INFOBLOCK_SIZE_MISMATCH 0x07
16
#define FLASH_EMPTY                   0x08
17
#define FLASH_ALREADY_WRITTEN         0x09
18
19
#define FLASHI_READ       0xFF
20
#define FLASHI_WRITE      0x40
21
#define FLASHI_CLEARSTAT  0x50
22
#define FLASHI_ERASE1     0x20
23
#define FLASHI_ERASE2     0xD0
24
25
#define FLASH_BLOCK_A_START 0x2000 
26
#define FLASH_BLOCK_B_START 0x2800 
27
28
static void flash_openMEM() {
29
  prcr = 0x02; // pm0, pm1 enable
30
  pm1 = 0x01; // Data block enable
31
  prcr = 0;  // pm0, pm1 disable
32
  fmr4 = 0x00; // Erase suspend mode disable
33
34
  CLI;
35
  fmr0 = 0x01;
36
  asm(""); // de-optimize
37
  fmr0 = 0x03; // CPU rewrite enable
38
  fmr1 = 0x00;
39
  asm(""); // de-optimize
40
  fmr1 = 0x02; // EW1 mode
41
  STI;
42
}
43
44
static Bit8u FLASH_writeArray(Bit8u* data, Bit8u* addr, Bit16u length) {
45
  Bit8u retval;
46
  while(length) {
47
48
    if(*addr != 0xff) {
49
      //sched_globals.dbgval = (Bit16u) addr;
50
      return FLASH_ALREADY_WRITTEN;
51
    }
52
53
    CLI;
54
    *addr = FLASHI_WRITE;
55
    *addr = *data;
56
    STI;
57
    while( fmr00 != 1 );  // Ready check LOCK TROUBLE
58
                // is supposed to take 50 µsec
59
  
60
    // Program status check
61
    retval = fmr0 & FLASH_SOFTWARE_ERROR;
62
    // Status check
63
    if(!retval) {
64
      // success: 
65
      *addr = FLASHI_CLEARSTAT;
66
    }
67
    data++;
68
    addr++;
69
    length--;
70
  }
71
  return retval;
72
}
73
74
void main() {
75
  Bit8u data[]="TTEESSTT";
76
  Bit8u retval;
77
  flash_openMEM();
78
79
  retval = FLASH_writeArray(data, (Bit8u*)FLASH_BLOCK_A_START, 9);
80
  switch(retval) {
81
    case FLASH_SUCCESS:
82
      ...
83
      break;
84
    case FLASH_SOFTWARE_ERROR:
85
    case FLASH_PROGRAM_ERROR:
86
    case FLASH_PROGRAM_TIMEOUT:
87
    case FLASH_ALREADY_WRITTEN:
88
      ...
89
      break;
90
  }
91
}

von Martin (Gast)


Lesenswert?

Hast du schon mal in die Application notes von Renesas geschaut?

von Marco A. (mago)


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/mpumcu/apn/reu05b0058_m16cap.pdf) 
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:
1
char *flash;
2
flash = (char*)0x2000;
3
// Wenn ein A im Flash ist dann... 
4
if (*flash=='A')
5
...

Stimmt das?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.