www.mikrocontroller.net

Forum: Compiler & IDEs wie uint32_t über SPI rausschicken


Autor: René K. (drmedrasen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

hab nach dem Problem das ich habe schonmal im Forum geschaut, aber nix 
passendes gefunden.
Wie kann ich eíne uint32_t variable über die Hardware SPI übertragen? 
Das SPDR ist ja bloß ein Byte groß. Die uint32_t Variable soll in 4 in 
Reihe geschaltene Schieberegister (74HC595) geschoben werden.Wie kann 
ich die zerteilen ohne das ein Byte verloren geht? Den Quellcode habe 
ich aus dem Datenblatt!
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_RCK)|(1<<DD_inv_g);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
PORTB|=(1<<DD_inv_g);   //Output Disable
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
PORTB|=(1<<DD_RCK);
PORTB&=~(1<<DD_inv_g);

;
}

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint32_t foo = 0x1234567890;
SPI_MasterTransmit ((unsigned char) foo);
SPI_MasterTransmit ((unsigned char) (foo>>8));
SPI_MasterTransmit ((unsigned char) (foo>>16));
SPI_MasterTransmit ((unsigned char) (foo>>24));
-> Bitmanipulation
Oder, schön allgemein:
void Transmit (void* data, size_t size) {
  for (size_t n = 0; n < size; n++) SPI_MasterTransmit (data [n]);
}
...
uint32_t foo = 0x1234567890;
Transmit ((void*) &foo, sizeof (foo));

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:

> Oder, schön allgemein:
> void Transmit (void* data, size_t size) {
>   for (size_t n = 0; n < size; n++) SPI_MasterTransmit (data [n]);
> }

Da brauchts noch einen cast
void Transmit (void* data, size_t size) {
   for (size_t n = 0; n < size; n++)
     SPI_MasterTransmit( ((unsigned char*)data)[n] );
}
> uint32_t foo = 0x1234567890;
> Transmit ((void*) &foo, sizeof (foo));

Da hingegen brauchts keinen cast
 Transmit (&foo, sizeof (foo));

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Da brauchts noch einen cast
Tatsächlich :O
achja, und 0x1234567890 ist wohl auch nicht so gut, 1234567890 ist 
besser.

Autor: Rene K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ...das Hilft mir schon ganzs schön weiter!

Was bedeutet eigendlich foo? Ich weiß das es eine Variable ist, ist es 
eine abkürzung für irgendwas? Ich habe das schon häufiger irgendwo 
gelesen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.