SPI mit 16Bit

Gast #3101797
Lesenswert?

Hallo!

Wollte mich mal erkundigen, wie das so läuft..

Ich habe eine 16Bit Variabel, die ich gerne über die serielle 
Schnittstelle rausgeben möchte. Es handelt sich um einen ATMEGA16, die 
SPI Initalisierung etc. ist kein Problem (steht ja deutlich im DB).

Also wenn ich das jetzt mal als Code annehme:
1
   
2
   uint16_t cData = 0b0010000011110011
3
   SPDR = cData;
4
   /* Wait for transmission complete */
5
   while(!(SPSR & (1<<SPIF)));

Wird dann die GANZE Variabel so in einem Rutsch rausgeschoben?
Also auch die Nullen am Anfang oder werden die Quasi "ausgeblendet"?

Ich hoffe ich habe mich verständlich genug ausgedrückt, ansonsten 
einfach nachfragen!
Gast #3101808
Lesenswert?

1
SPDR = cData;
SPDR ist ein 8bit Register. Also gehen dort auch nur (die untersten) 
acht Bit rein.

Wenn, dann muss du das so machen:
1
#define PORT_CS  PORTA
2
#define P_CS     PA6
3

4
  uint16_t cData = 0b0010000011110011
5
  ..
6

7
  PORT_CS &= ~(1<<P_CS);
8
  SPDR = (uint8_t) (cData>>8);
9
  /* Wait for transmission complete */
10
  while(!(SPSR & (1<<SPIF)));
11
  SPDR = (uint8_t) (cData);
12
  /* Wait for transmission complete */
13
  while(!(SPSR & (1<<SPIF)));
14
  PORT_CS |=  (1<<P_CS);

Die Defines sind nur ein Beispiel...
Gast #3101826
Lesenswert?

>Selbst fette 32 Bit Prozessoren ...

Im Grunde ist es eine Vereinbarung, wie viele Bytes Du nach dem Hallo 
schickst. Oder anders ausgedrückt: Sender und Empfänger müssen wissen 
was Sache ist.

Schau Dir mal die Kommunikation mit einem Speicherbaustein an:
[Hallo]+[Adresse-Low]+[Adresse-High]+[Daten] letzteres ev. mehrfach.
Gast #3101835
Lesenswert?

Hi

>Wenn ich das richtig verstanden habe, dann schiebt der SPI bei einer 8
>Bit Variabel (z.B. 0b10010011) zuerst das MSB also 0 raus?

Nö. Kommt darauf an, was du mit DORD in SPCR eingestellt hast.

MfG Spess
Gast #3101844
Lesenswert?

spess53 schrieb:
> Nö. Kommt darauf an, was du mit DORD in SPCR eingestellt hast.

Danke für die Bezeichnung, das spart immer Zeit beim Suchen :)

"In all the examples shown here the SPI is configured to run in mode 0 
with MSB transmitted first.
This is done by setting the bits CPOL, CPHA and DORD in the register 
SPCR to zero."
Gast #3101856
Lesenswert?

Und wenn ich nochmals kurz was fragen dürfte.. (Hat auch mit 
Bitoperatoren zu tun)..

Wenn ich ein Array habe:

uint8_t array[8] = {0, 1, 1, 0, 1, 0, 1, 0,};
uint8_t zusammengefasst;


zusammengefasst = (array[0] << 7) |(array[1] << 6) |(array[2] << 5) 
etc..

Wird dann "zusammengefasst" den Inhalt 0b01101010 haben?

Gruss
Gast #3101887
Lesenswert?

uint8_t array[8] = {0, 1, 1, 0, 1, 0, 1, 0,};
uint8_t zusammengefasst;

Bilderbucharithmetik:
(array[0] << 7) = 0b00000000
(array[1] << 6) = 0b01000000
(array[2] << 5) = 0b00100000
(array[3] << 4) = 0b00000000
(array[4] << 3) = 0b00001000
(array[5] << 2) = 0b00000000
(array[6] << 1) = 0b00000010
(array[7] << 0) = 0b00000000
oder              0b01101010 oder so
Gast #3101891
Lesenswert?

amateur schrieb:
> Bilderbucharithmetik:
> (array[0] << 7) = 0b00000000
> (array[1] << 6) = 0b01000000
> (array[2] << 5) = 0b00100000
> (array[3] << 4) = 0b00000000
> (array[4] << 3) = 0b00001000
> (array[5] << 2) = 0b00000000
> (array[6] << 1) = 0b00000010
> (array[7] << 0) = 0b00000000
> oder              0b01101010

Dankeschön, hatte das auch so überlegt, war mir aber nicht ganz sicher 
ob das dann auch stimmt.

Toggle schrieb:
> Schreib's einfach in dein Programm rein und guck dir im Simulator an,
> was passiert.

Ich habe leider keine Ahnung, wie man Variabeln überwacht :S
#3102144
Lesenswert?

Falk Brunner schrieb:
> Selbst fette 32 Bit Prozessoren haben praktisch alle nur 8 Bit SPI
> Register. Ein Vielfaches davon muss man per Software zusammenbauen,
> bestenfalls macht das die DMA auf größeren Prozessoren.

Das Ist so nicht richtig.
Die C2000 Familie von TI hat 16 BIT Breite Register.
Ich habe hier bei einem Projekt unter anderem auch eine zwei 
Prozessorlösung bei der ein C2000 und ein MSP über SPI miteinander 
Kommunizieren (C2000 ist Master) dort nutze ich die 16Bit voll aus und 
auch der MSP430 hat mit den 16 Bit keine Probleme.
Gast #3102232
Lesenswert?

>> Selbst fette 32 Bit Prozessoren haben praktisch alle nur 8 Bit SPI
>> Register. Ein Vielfaches davon muss man per Software zusammenbauen,
>> bestenfalls macht das die DMA auf größeren Prozessoren.
>Das Ist so nicht richtig.
Jo. 32Biter haben norm zumindest 8 oder 16 Bits (an einem) zur Auswahl 
(nat weniger INTs oder DMAs nötig). Manche bis 32 Bits, zT mit zus FIFOs 
(obwohl da noch DMAs drauf sind, was wohl zeigt dass die DMAs nicht gut 
genug sind).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren