Eeprom 24cxxx und 25cxxx
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 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.