buffer_counter=0; write_SPI(BUFFER_1_WRITE); write_SPI(0x00); write_SPI((char)(buffer_counter>>8)); ???? write_SPI((char)buffer_counter); write_SPI(flash_data); Vorallem was bedeutet das write_SPI((char)(buffer_counter>>8)); >> ist ja ein Bitschieber nach rechts oder??? kann ich es so verstehen 00000000->00000001 hat jemand einen gute Tutorial über das Bitschieben???? habe mich noch nicht sehr lang mit C und AVR beschäftigt.
Hallo, ja, das ist ein Schiebefehl und zwar um acht Bit nach rechts. Ich nehme mal an, dass buffer_counter ein Wort breit und wird deswegen in zwei Byte zerlegt und getrennt ausgegeben.
> >> ist ja ein Bitschieber nach rechts oder??? Ganz genau > kann ich es so verstehen > > 00000000->00000001 Wie du da drauf kommst ist mir schleierhaft. Wenn ich 00000000 8-mal nach rechts schiebe, ist das immer noch 00000000 Ich geh mal davon aus, dass buffer_counter ein unsigned int ist, auf einem gcc also 16 Bits belegt. also zb. 01011010 11111111 und das 8 mal nach rechts geschoben ergibt 00000000 01011010 Im Endeffekt erhält man damit also Zugang zum High-Byte eines int. > hat jemand einen gute Tutorial über das Bitschieben???? Was brauchst du. Ist doch simpel. Mal dir die Bits auf und schiebe sie so oft wie angegeben. Das einzige problematische ist das Fakt, dass bei signed nicht definiert ist, ob da jetzt das Vorzeichenbit dupliziert wird oder ob von links eine 0 nachkommmt. Daher sollte man diese Dinge, Bitmanipulationen im allgemeinen, immer mit unsigned Typen machen. Auch im obigen ist es ratsam, anstatt dem cast auf char einen cast auf unsigned char zu machen.
Also hier blicke ich noch nicht durch könnte mir vieleicht einer dabei helfen. Im anhang das Datenblatt eines Atmel Flash Speichers. Vorallen die Tabelle 7 und 8 wie kann man das verstehen??? Verstehe ich das richtig der SPI BUS sendet oder liest immer nur 8 bit oder??? Ich bin wahrscheinlich zu doof für den SPI bus den habe ich nocht nicht begriffen wie der Funktioniert und wie man daten sendet bz empfängt.
Hans Peter wrote: > Verstehe ich das richtig der SPI BUS sendet oder liest immer nur 8 > bit oder? Ja, genau. Er hat noch eine Besonderheit: er sendet und empfängt immer zugleich. Du kannst also nicht nur etwas empfangen: da der Master den Takt liefern muss, mit dem der Slave die Daten rauspumpt, muss er zwangsweise auch ein Byte dafür senden (oft wird ein Dummy-Byte gesendet für diesen Zweck). Stell dir den Slave einfach als ein serielles 8-bit-Schieberegister vor, dann bekommst du am ehesten ein Gefühl dafür. Genau so funktioniert es, nur dass es (in der Regel) andere Daten raussendet als die, die es 8 bits zuvor empfangen hat.
Hallo, denk noch etwas weiter: denke Dir das 8-Bit-Register im Master und das im Slave als ein 16-Bit Schieberegister, die über MOSI hintereinander geschaltet sind und deren Eingang (im Master) und Ausgang (im Slave) über MISO verbunden sind. Jetzt lade im Master 8Bit rein und im Slave 8 Bit rein. Nun schiebe den Kram um 8 Bit weiter... Am Besten aufmalen. :) Gruß aus Berlin Michael
Willst Du das Rad nochmal erfinden? Simon stellt schon die fertigen Routinen zur Verfügung: http://avr.auctionant.de/avrETH1/software_download.html Dort findest Du auch die dataflash.c und dataflash.h, welche ich für Dich ungegzippt, ungetart, mit CR-LF versehen und gezippt angehängt habe.
Vielen Dank Werde mir den Code mal zu Rate ziehen und versuchen ihn zu verstehen und umzusetzten.. Danke
Also ich blicke da nicht durch buffer pages len??? wo soll ich anfangen?? die MMC Lib von Radig ist sehr schön nachvollziebar aber hier blick ich nicht durch.
Habe mir das Datenblatt nochmal zu gemüte geführt 1. muß ich in den Buffer schreiben der ist 256 byte groß den muß ich laut datenblatt so initialisieren Commando:0x84 für buffer1 dann 15Reserve bits wie übertrage ich 15 bits??? der SPI kann nur 8bit 2x8 sind 16 und nicht 15. oder muß ich es schiften byte buffer adress bit ist das die startadresse des buffers?? die ist ja meist null oder?? sende CS auf low der buffercounter ist im MSB=0000000|0=9.bit vom bufferbit im LSB=00000011 =8 bit vom bufferbit zusammen ergibt das 0x03 oder??? das würde heißen gehe zu bufferadresse 0x03. spi_write(0x84) spi_write(0x00); 8 reservebits spi_write(bufferadresse>>8); schiebe msb über lsb oder??? spi_write(bufferadresse); ich würde aber immer mit 0 beginnen und den block vollschreiben 256 byte. dann kann ich mit der übertragung meiner daten beginnen von 1 bis 256 int counter=1; while(counter<256) { write_spi(*buffer++); counter++; } cs auf height kann mann das so machen ?????? Bin ich damit auf dem holzweg???? Danke
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.