Forum: Compiler & IDEs At45DB flash beschreiben


von Simon (Gast)


Lesenswert?

Hallo,

ich habe hier eine simple und funzende funktion die einige bytes in
den buffer des flash speichers schreibt.

Wie kann ich hier, möglichst mit sauberem code die Daten aus einer 
anderen funktion schreiben ohne hier einen zusätzlichen buffer zu 
brauchen.

Ich könnte das ganze zerlegen, zuerst den BUFFER_WRITE befehl und die 
adressen senden und im anschluss mit einer extra funktion die daten 
schreiben, und wieder mit einer extra funktion das schreiben beenden 
indem ich  CLEAR_PIN_CS setze. Gibts da nicht eine endlere lösung.

Ich könnte auch die funktion mehrfach aufrufen und die addresse in einer 
variablen mitgeben, nur dann durchläuft er bei jedem aufruf aufs neue 
das senden des opcodes etc..

void DF_BufferWrite()
{
  while ( !DF_ready() ) { }
  SET_PIN_CS;
  spi_io(BUFFER_WRITE);
  spi_io(0x00);  // address 0
  spi_io(0x00);  // address 0
  spi_io(0x00); // beginn bei addr 0

  uint8_t i = 0;
    for( i < 250; i++;){
    spi_write(i);   <-- hier werden die daten geschrieben
    }
  CLEAR_PIN_CS;
}

von Stefan E. (sternst)


Lesenswert?

Simon schrieb:
> Wie kann ich hier, möglichst mit sauberem code die Daten aus einer
> anderen funktion schreiben ohne hier einen zusätzlichen buffer zu
> brauchen.

Aber irgendeinen Puffer muss es doch wohl bereits geben, oder wo kommen 
die Daten sonst her? Du gibst deiner Funktion einfach einen Zeiger auf 
diesen Puffer mit.

von Simon (Gast)


Lesenswert?

Die Daten werden per USB (CDC) empfangen, Byteweise, und genau da ist 
mein Problem. klar könnte ich nun Ein Array nutzen 256 bytes vom USB 
lesen, da rein packen und mit hilfe eines Pointers durchlaufen. simple 
sache. nur damit reserviere ich mir im RAM 256 Bytes nur fuer dieses 
Spielchen.
Ich suche etwas das ich gleich direkt vom USB in den AT45DB flash 
speicher schreiben kann. ohne die funktion da zu zerschlachten

von Stefan E. (sternst)


Lesenswert?

Dann schreibe eine Funktion, die dieses eine Byte vom USB liest (sofern 
die nicht schon längst existiert) und rufe diese Funktion innerhalb der 
Schleife in DF_BufferWrite auf.

Und wenn du DF_BufferWrite möglichst universell halten willst, kannst du 
der Funktion auch einen Zeigen auf eine solche Byte-Read-Funktion als 
Parameter mitgeben.

von Simon (Gast)


Lesenswert?

Ich habs nun doch zerlegt da ich die funktion die die bytes liest von da 
nicht aufrufen kann.

Ich finde das ist garnicht so einfach.. für den externen RTC den ich via 
I2C anspreche hats perfekt funktioniert, das ich meine .c und .h 
einbinde und anschliessend nur auf die funktionen darin zugreife.. so 
kann ich bequem die Dateien bei jedem neuen Projekt wieder verwenden.

Vielleicht sollte ich mal was größeres als ein AT90USB verwenden, da 
hätte ich mehr SRAM und somit wäre ein 256 Byte Buffer kein thema mehr

von Stefan E. (sternst)


Lesenswert?

Simon schrieb:
> Ich habs nun doch zerlegt da ich die funktion die die bytes liest von da
> nicht aufrufen kann.

Warum nicht?

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Die Schreibroutine für das Dataflash in drei Routinen zerlegen. Z.B. ein 
DF_Start_Write() wird aufgerufen bevor USB aktiviert wird, 
DF_Write_Byte() in der Routine, in der die USB-Daten aus dem 
Endpointpuffer gelesen werden und DF_close() wenn die erwarteten Daten 
da sind. In DF_Write_Byte muss mglw. ein kleiner Zustandsautomat zur 
Umschaltung zwischen den DF RAM-Puffern und zum Auslösen des 
Kopiervorgangs von DF-Rampuffer in DF Flashseite implementiert werden.
(Habe das so in der Art mal programmiert, allerdings nicht mit USB 
sondern UART als "Datenquelle".

von (prx) A. K. (prx)


Lesenswert?

Simon schrieb:

> sache. nur damit reserviere ich mir im RAM 256 Bytes nur fuer dieses
> Spielchen.

Die meisten Atmal Dataflashes haben 2 RAM-Puffer intern, dazu musst du 
also nicht das RAM des Controllers bemühen. Einfach solange in den einen 
Puffer schreiben bis der voll ist, dann Kommando geben um diesen ins 
Flash zu schreiben. Während der geschrieben wird kannst du mit dem 
anderen Puffer weitermachen. Die beiden wechseln sich also ab.

So realisert bei Dataflash als Protokollspeicher, mit I2C als 
Datenquelle.

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.