So jetzt konnte ich wieder ein bissl weiter rumprobieren. Hab jetzt noch
ein Flash-Speicher aufgelötet. Baugleich natürlich. Wie ich festgestellt
habe darf ich nur gerade Adressen an den Flash schicken. Also sieht mein
Code jetzt so aus:
1 | #define FLASH_BASE 0xFF000000
|
2 | #define write_flash( a , byte ) *(unsigned short *)(FLASH_BASE + a) = (unsigned short)byte
|
3 | #define read_flash(a) *(unsigned short *)(FLASH_BASE + a)
|
4 |
|
5 | int rd_status(){
|
6 | unsigned short status;
|
7 | /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
|
8 | write_flash(0x10, 0x70);
|
9 | status = read_flash(0x10);
|
10 |
|
11 | return status;
|
12 | }
|
13 |
|
14 | int block_erase(unsigned char blockaddress){
|
15 |
|
16 | write_flash(blockaddress, 0x20);
|
17 | write_flash(blockaddress, 0xD0);
|
18 | while( !(rd_status() & 0x0080) ) ; /* Warte auf "ready" */
|
19 |
|
20 | return 0;
|
21 | }
|
22 |
|
23 | int word_program(unsigned int address, unsigned short data_word){
|
24 |
|
25 | /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
|
26 | write_flash(0x10, 0x40);
|
27 | write_flash(address, data_word);
|
28 | while( !(rd_status() & 0x0080) ) ; /* Warte auf "ready" */
|
29 |
|
30 | return 0;
|
31 | }
|
Soweit so gut. Nun bleibt er nicht hängen, aber dafür springt er sofort
wieder raus. Sprich das ReadyBit im Statusregister ist sofort auf "1".
Ich habe zum testen einfach mal 0xAFFE in den Flashspeicher geschrieben,
aber beim lesen zeigt sich, dass nichts drin ist.
Das Chipselect wird definitiv aktiviert, da bin ich mit nem
Logic-Analyzer bei gegangen. Hat das hier wirklich noch keiner gemacht?
Bin für jede Hilfe dankbar