Eeprom 24cxxx und 25cxxx
Eeprom Daten
Anschlüsse
SPI-Kommandos
Adressen
Lesen
Schreiben
Löschen
AVR Code
Ich suche nach einer Möglichkeit für das Abspeichern von neuen "Songs" für die Objekte: Droschke, Kurbelrad, Sackklangkarre, MusikHomeTrainer u.a.

Eine Idee wäre, die Midi-Songs von einer SD-Card auslesen zu lassen und diese auf den Eeprom zu übertragen.
Eine andere Idee: Per Midiox Mididatei als Sysex überspielen.

Die Größe eines Midi-Songs für meine Objekte bewegt sich zwischen: 4KB und 26KB
Für 3 "Songs" bei den MusikHomeTrainern bräuchten wir dann ca. 75KByte

Angaben beim Eeprom in KBit. 26KB sind ca. 208KBit. 1MBit sind dann 125KByte.

Lieber bei Reichelt kaufen. Muss lange suchen bei Aliexpress!

Eeprom - Daten

Eeprom
Größe
Schnitt-
stelle
Page-Größe
in Byte
Zugriffszeit
in ns
Kosten 2026
25LC1024
1MBit = 128KB
SPI
256
100
Rei: 1,55€ Ali ???
24LC1025
1MBit = 128KB
I2C
256
900
Rei: 1,65€
25LC512-I/P
512KBit = 64KB
SPI
128
100
Rei:2,95 Ali:0.37
24C512BN
512KBit = 64KB
I2C
128
550
Rei: 0,95€
24AA512
512KBit = 64KB
I2C
128
900
Rei: 1,28€
25LC256-I/P
256KBit = 32KB
SPI
64
100
Rei: 0,95€
25AA256-I/P
256KBit = 32KB
SPI
64
250
Rei: 1,15€
24FC256
256KBit = 32KB
I2C
64
400
Rei: 1,59€
24C256BN
256KBit = 32KB
I2C
64
550
Rei: 0,86€
Es wird wohl der 25LC1024 werden mit SPI - 2,5..5,5V

Midiox sendet Midifiles als Sysexdaten. Test mit Board AVR nötig.
Blockgröße der "Sysexsendung" kann man einstellen, so dass es die gleiche ist, wie die Page-Größe beim TabFlexrom.

Zum Vergleichen die SRAM und der PROG Speicher

Name uC
SRAM in KByte
PROG in KByte
EPROM in Byte
Preis Reichelt
Preis Aliexpress
ATM 8
1
8
512
1,99
0,94
ATM 16 / ATM168
1
16
512
3,20 / 3,10
1,49 / 2,25
ATM 32 / 328
2
32
1024
3,70 / 3,29
2,53 / 1,49
ATM 644
4
64
2048
5,83
nicht da
ATM 1284
16
128
4096
8,80
10,68
Für unsere Zwecke würden ATMega644 oder ATMega1284 reichen, notfalls noch ATMega32 oder 328.
4..26KB pro Song. Im Programmspeicher wäre dafür Platz. So ist es ja bis jetzt.

Anschlüsse


Hold = H = Chip aktiv. Kann uC nutzen, um andere Aufgaben zu machen. Oder bei Doppelnutzung der Datenleitungen für einen anderen Chip
WP = Hi, ansonsten ist Write blockiert.
CS ---- Low = Aktiv.

SPI - Kommandos

8-bit instruction register - zu erst.
SI wird übernommen, wenn CLK von Lo auf Hi geht.

Name
Wert Hex
Wert Dez
Beschreibung
READ
0000 0011
3
Liest die Daten aus bei angewählter Adresse.
WRITE
0000 0010
2
Schreibt Daten an ausgewählter Adresse ein.
WREN
0000 0110
6
Schaltet das Schreiben ein.
WRDI
0000 0100
4
Schaltet das Schreiben aus.
RDSR
0000 0101
5
Read Status Register
WRSR
0000 0001
1
Write Status Register
PE
0100 0010
66
Page erase - löscht eine Seite.
CE
1100 0111
199
Chip erase
RDID
1010 1011
171
Chip wacht auf und gibt ID zurück
DPD
1011 1001
185
Chip schläft ein - Power down Mode


Adressen

Eine Adresse ist 24Bit groß.
Niedrigste: Hx000000
Höchste: Hx01FFFF = 131.071

131.071 Byte = 1.048.568 Bit = 1.048 KB = 1 MB

Habe im Datenblatt keine Angaben über die Adressen für die Seiten an sich gefunden.

Eine Seite ist 256 Byte groß. Erste Adresse ist 0. Also geht die erste Seite bis ByteNr 255 = FF.
Die zweite Seite beginnt dann bei 100 und endet bei 1FF.
Die dritte Seite beginnt bei 200 usw.

Seite 1 - 00000 bis 000FF - 0 bis 255
Seite 2 - 00100 bis 001FF - 256 bis 511
Seite 3 - 00200 bis 002FF - 512 bis 767
Seite 4 - 00300 bis 003FF - 768 bis 1023
...
Seite 511 - 1FF00 bis 1FFFF - 130.816 bis 131.071

Also Startadresse für die jeweilige Seite ist Seitennummer mal 256. Wobei Seitennummer bei Null beginnt. Also 0*256=0 - 1*256=256 - 2*256=512 - 3*256=768 usw. - 511*256=130.816

Es gibt also 512 Seiten -- 0 bis 511.

Lesen


So lange CS unten bleibt, wird die Adresse um jeweils eins erhöht und das nächste Byte kann gelesen werden. Wenn die Adresse den höchsten Wert hat, geht es von vorn wieder los. Ein Loop also. Beendet wird das Lesen, wenn CS wieder auf Hi geht.

Schreiben

Vor jedem Schreibbefahl muss WREN gesetzt werden !

Es muss unbedingt dieser Befehl abgeschlossen werden mit CS=Hi !!!
Vorherige Daten werden beim Schreiben automatisch gelöscht. Das Löschen verheriger Werte muss nicht extra erfolgen !!!

Nun das CS wieder runter setzen und mit dem Schreiben beginnen.
Übertragen wird: Der WRITE-Befehl sowie die 24-Bit-Adresse (wobei die sieben höchstwertigen Bits/MSBs als „Don’t-Care“-Bits gelten, da die höchste Adresse:01FFFF ist, also das letzte Byte nicht verwendet wird!) und anschließend die zu schreibenden Daten.
Es können bis zu 256 Bytes an das Bauteil gesendet werden, bevor ein Schreibzyklus erforderlich ist. Die einzige Einschränkung besteht darin, dass sich alle Bytes innerhalb derselben Seite befinden müssen. Bei Schreibvorgängen mit weniger als 256 Bytes werden die Daten im verbleibenden Teil der Seite zusammen mit den zu schreibenden Datenbytes aufgefrischt.

Wird eine Seite mit zu vielen Bytes beschrieben, tauchen diese auf der gleichen Seite am Anfang wieder auf, nicht auf der nächsten Seite.

Am Ende eines Schreibzyklus wird WREN zurück gesetzt.

Ein Byte schreiben:


Eine Seite schreiben:


Am Ende kann man das "Schreiben" wieder ausschalten mit WRDI.





Löschen

Es kann eine Seite, ein Sektor oder der ganze Chip gelöscht werden.
Achtung: Zuvor muss das WREN (Write enable) gesendet werden.

Beispiel: Chip löschen:

Zuerst WREN senden! 0000 0110

Dann: Chip Erase. 1100 0111




AVR Code

Ein Byte

Ein Byte einschreiben und wieder auslesen über eine LCD-Anzeige.

Folgt noch.
uint8_t
// Kommentar
#define

Seitenweise speichern

MidiOx sendet Midi-Datei als Sysex. uC "fängt diese auf" und speichert sie in den Eeprom wie folgt:

1.) 256 Byte vorerst im SRAM als Array speichern.
2.) In den "Sendepausen" von MidiOx bis zum nächsten SysEx-Block den SRAM im uC auslesen, bearbeiten (z.B. sysex Anweisungen löschen) und im Eeprom speichern. Nach dem Weglöschen einzelner Midi-Anweisungen wird eine Seite vom Eeprom nicht mehr mit 256 Bytes gefüllt, sondern mit weniger Bytes. Das wird sich also verschieben. Wir wollen die Eeprom-Seite immer voll machen.