Forum: Compiler & IDEs Kann mir einer mal diesen Code erklären??


von Hans Peter (Gast)


Lesenswert?

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.


von Thomas B. (yahp) Benutzerseite


Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

>  >> 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.


von Hans Peter (Gast)


Lesenswert?

AHAH

Jetz bin ich schlauer geworden.

Vielen Dank

von Patrick D. (oldbug) Benutzerseite


Lesenswert?


von Hans Peter (Gast)


Lesenswert?

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.





von Hans Peter (Gast)


Angehängte Dateien:

Lesenswert?

Soory das Datenblatt

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Michael U. (Gast)


Lesenswert?

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

von Profi (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Hans Peter (Gast)


Lesenswert?

Vielen Dank

Werde mir den Code mal zu Rate ziehen und versuchen ihn zu verstehen und 
umzusetzten..


Danke

von Hans Peter (Gast)


Lesenswert?

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.

von Hans Peter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.