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;
}
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.
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
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.
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
Simon schrieb: > Ich habs nun doch zerlegt da ich die funktion die die bytes liest von da > nicht aufrufen kann. Warum nicht?
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.