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
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 | }
|
Hast du schon mal in die Application notes von Renesas geschaut?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.