Forum: Mikrocontroller und Digitale Elektronik LTC2498 und Atmega128rfa1: c-code Beispiel


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Jeanette S. (jeanny)


Lesenswert?

Hallo zusammen!

Ich versuche via SPI die Sensorwerte des LTC2498 abzufragen.

Der Beispielcode im Datenblatt des Atmega128rfa1 zeigt zwar die 
notwendigen Einstellungen im Controlregister zum Betrieb als Master und 
eine Transmit-Funktion, aber bei mir bleiben noch ein paar Fragen offen:

- das Beispiel enthält die Transmit-Funktion für ein char. Der ltc2498 
benötigt als Daten-Input allerdings 13Bit - Kann ich diese übermitteln 
bzw. wie?

- wie kann ich das 32-Bit lange word vom Sensor (MISO des Masters) 
einlesen? Über das SPDR-Register? Da stehe ich allerdings wieder vor dem 
Problem mit den 8-Bit-Begrenzung...

- Wie müsste der generelle Ablauf in der Schleife des main-Programms des 
Masters sein?:
1. SlaveSelect des Slaves (ltc2498) auf low
2. MOSI des Masters schreiben (SDI des Slaves)
3. MISO des Masters lesen (SDO des Slaves)
4. SlaveSelect des Slaves auf high
Ist dies so richtig? bzw. wo bräuchte ich noch eventuelle Wartezeiten 
etc.?


Hat zufällig jemand ein c-Beispiel, wie man wia einem ATmega und SPI die 
Sensordaten des ltc2498 auslesen kann?

Danke Euch schon mal!

von Jeanette S. (jeanny)


Lesenswert?

Hat keiner Erfahrung mit dem LTC2498? Oder ähnlichem?

von Jeanette S. (jeanny)


Lesenswert?

Ich bin inzwischen einen Schritt weiter und denke, dass ich prinzipiell
verstanden habe, wie's laufen muss.

Die Werte, die ich erhalte ergeben jedoch keinen Sinn (zB wenn ich den
Temperatursensor auf dem Chip auslesen will, steigen die Werte stetig
an) und ich finde das Problem nicht.

Mein Code ist eigentlich recht simple (uart-init etc. habe ich jetzt
hier mal weggelassen, da das problemlos funktioniert):
1
void SPI_MasterInit(void)
2
{
3
  //Outputs: MOSI, SCK, SS
4
  DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
5
6
  //Enable SPI, Master-Mode, set clock rate fck/16
7
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
8
}
9
10
11
int SPI_MasterTransmit(char MOSI)
12
{
13
  //start Transmission
14
  SPDR = MOSI;
15
16
  //white for transmission complete
17
  while(!(SPSR & (1<<SPIF)));
18
19
  //returned data from slave to master
20
  return SPDR;
21
}
22
23
24
int main()
25
{
26
27
  char str[20];
28
29
  // Thermoelement an CH0 und CH1
30
  char masterOut1 = 0b10100000;
31
  //char masterOut2 = 0b10000000;
32
33
  // interne Temperaturmessung:
34
  char masterOut2 = 0b11000000;
35
36
  char result;
37
  uint32_t masterIn = 0;
38
  uint32_t Temp = 0;
39
40
  uart_init();
41
42
  SPI_MasterInit();
43
44
45
  for(;;)
46
  {
47
48
    _delay_ms(500);
49
50
    //CS des Thermochips auf low
51
    PORTB &= !(1<<DD_SS);
52
53
54
    //Byte1
55
    result = SPI_MasterTransmit(masterOut1);
56
    masterIn = (result & 0b00011111);  //die ersten drei Bit löschen
57
58
    //Byte2
59
    result = SPI_MasterTransmit(masterOut2);
60
    masterIn = (masterIn<<8) + result;
61
62
    //Byte3
63
    result = SPI_MasterTransmit(0);
64
    masterIn = (masterIn<<8) + result;
65
66
    //Byte4
67
    result = SPI_MasterTransmit(0);
68
    masterIn = (masterIn<<8) + result;
69
70
71
    //CS des Thermochips auf high
72
    PORTB |= (1<<DD_SS);
73
74
75
    masterIn = (masterIn>>5); //die letzten 5 Bit löschen
76
77
    sendestring(" masterIn: ");
78
    sprintf(str, "%ld", masterIn);
79
    sendestring(str);
80
81
    //bei interner Temperaturmessung: Temperatur in °C berechnen laut 
82
Datenblatt Seite21
83
    Temp = (masterIn*4/1570)-273;
84
85
    sendestring(" Temp: ");
86
    sprintf(str, "%ld", Temp);
87
    sendestring(str);
88
89
    _delay_ms(2000);
90
  }
91
92
93
  return 0;
94
}


Sieht einer von Euch vielleicht, woran es liegen könnte?

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


Lesenswert?

Jeanette Seewald schrieb:

> - das Beispiel enthält die Transmit-Funktion für ein char. Der ltc2498
> benötigt als Daten-Input allerdings 13Bit - Kann ich diese übermitteln
> bzw. wie?

Mit der Hardware-SPI kann man nur Vielfache von 8 bit übertragen.
Wenn der LTC2498 also auch mit 16 Bit klarkommt, dann geht es,
sonst müsste man auf Software-Bitbanging ausweichen.  (Edit: hab'
mir das Datenblatt angeguckt, der kommt mit 4 x 8 Bit klar.)

> - wie kann ich das 32-Bit lange word vom Sensor (MISO des Masters)
> einlesen? Über das SPDR-Register? Da stehe ich allerdings wieder vor dem
> Problem mit den 8-Bit-Begrenzung...

SPI transportiert nur Daten gleichzeitig in beiden Richtungen.
Üblicherweise schiebt man, wenn man nur lesen will, dann auf der
Ausgabe (also über SPDR) entsprechend viele Dummybytes raus.  Du
musst also jeweils:

. ein Nullbyte nach SPDR schreiben,
. warten, bis die SPI alles rausgetaktet hat (SPIF-Bit)
. ein Datenbyte von SPDR lesen,
. wieder von vorn beginnen, solange noch nicht alles da ist

Erst ganz am Ende wieder deselektieren.

So im Großen und Ganzen hast du das, glaub ich, schon aufgeschrieben.
Der einzige offensichtliche Fehler ist, dass die bitweise Negation
nicht durch „!“, sondern durch “~” erfolgt (beim Setzen des /SS-Pins).

Allerdings braucht das Teil natürlich Zeit zum Konvertieren.  Beim
ersten Versuch wirst du also noch nichts zurück lesen können, sondern
erst bei den folgenden.

Vielleicht solltest du ja das /EOC-Bit auch nicht einfach nur
wegwerfen, sondern mal testen, ob da wirklich bereits das Ende einer
Konvertierung angezeigt worden ist.  Ansonsten kannst du auch einfach
auf /EOC testen, indem du nur das /CS aktivierst und dann nachsiehst,
ob MISO auf low geht (ohne irgendwelche weiteren SPI-Aktionen):
1
bool isConversionReady(void)
2
{
3
   PORTB &= ~(1<<DD_SS);
4
   bool eoc = (PINB & (1<<DD_MISO)) == 0;
5
   PORTB |= (1<<DD_SS);
6
   return eoc;
7
}

von Bronco (Gast)


Lesenswert?

Ein Tip:
Beim SPI kann man die Clock Polarity (CPOL), die Clock Phase (CPHA) und 
die Data order (DORD) konfigurieren.
Wenn diese falsch sind, kann es zu seltsamen Phänomen kommen.

Ich hatte mal einen SPI-Sensor, der jeden zweiten Meßwert falsch 
geschickt hat. Grund war, daß CPOL/CPHA falsch konfiguriert war, und 
daher das 1.SPI-Telegram für den Sensor unvollständig war und erst mit 
dem 2. SPI-Telegram die Kommunikation für ihn abgeschlossen war.

Hier hilft es sehr, SDO/SDI/SCK mit dem Oszi anzuschauen.

von A. W. (uracolix)


Lesenswert?

So ganz genau hab ich das DB zwar auch noch nicht verstanden, aber kann 
es
sein, dass der Chip waehrend du das aktuelle Kommando schreibst, das 
Ergebnis der vorherigen Messung ausgibt? So wuerde ich Bild 2 auf S. 14 
deuten.

Am besten du rechnest erst mal nicht mit den Werten herum sondern dumpst
den Output vom SPI unveraendert (printf debugging) ... du solltest dann
die statischen Muster (feste 0/1 bits im Datenstrom) an den erwarteten 
Stellen vorfinden.

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


Lesenswert?

A. W. schrieb:
> dass der Chip waehrend du das aktuelle Kommando schreibst, das
> Ergebnis der vorherigen Messung ausgibt

Ja, so sehe ich das auch.

von Jeanette S. (jeanny)


Lesenswert?

Jörg Wunsch schrieb:
> dass der Chip waehrend du das aktuelle Kommando schreibst, das
>> Ergebnis der vorherigen Messung ausgibt

Ich versuche im Moment ja nur den Wert des internen Temperatursensors 
auszulesen, welche relativ konstant sein müsste (liegt ja bei mir auf 
dem Tisch). Da ich das jetzt sowieso jede Sekunde mal mache, müsste mir 
das Problem des vorherigen Messwertes eigentlich im Moment egal sein, 
oder nicht? Dann stimmt halt der erste Messwert nicht.


Bronco schrieb:
> Beim SPI kann man die Clock Polarity (CPOL), die Clock Phase (CPHA) und
> die Data order (DORD) konfigurieren.

Im Datenblatt des LTC2498 heißt es: The input data is then shifted via 
SDI pin on each rising edge of SCK. The output data is shifted out the 
SDO pin on each falling edge of SCK.
Müsste das bedeuten, dass ich CPOL und CPHA so einstellen muss:
CPOL=1, CPHA=0: Sample (Falling), Setup (Rising)

Oder muss ich genau gegengleich arbeiten?


A. W. schrieb:
> Am besten du rechnest erst mal nicht mit den Werten herum sondern dumpst
> den Output vom SPI unveraendert (printf debugging)

Das habe ich auch mal versucht (mir jedes result einzeln anschauen). Das 
ganze verhält sich aber recht eigenartig. Entweder hat es extreme 
Schwankungen, negative Werte, oder es bleibt komplett konstant, auch 
wenn ich versuche, die Temperatur etwas zu ändern.

von A. W. (uracolix)


Lesenswert?

>Das habe ich auch mal versucht (mir jedes result einzeln anschauen). Das
>ganze verhält sich aber recht eigenartig. Entweder hat es extreme
>Schwankungen, negative Werte, oder es bleibt komplett konstant, auch
>wenn ich versuche, die Temperatur etwas zu ändern.

Kannst du mal die Werte in hexadezimal anschauen? Da sieht man recht 
schoen welches Bit wackelt. Im naechsten Schritt beim Debugging dieses 
Problems kommt dann wohl der "Graf Oszillo" ins Spiel ;-).

von Oliver (Gast)


Lesenswert?

Jeanette Seewald schrieb:
> The output data is shifted out the
> SDO pin on each falling edge of SCK.

Da wird der Datenpin am MISO-Pin auf den neuen  Wert gesetzt, damit ist 
das das Setup. Also Setup auf der falling edge.

Ob die falling edge jetzt die leading oder die trailing edge ist (ob SCK 
also high oder ,ow active ist), kann man dem nicht entnehmen. Das sollte 
aber auch irgendwie aus dem Datenbaltt ersichtlich sein.

Sehr vermutlich ist aber die rising edge auch die leading edge, damit 
wären CPOL und CPHA beide auf 0 zu setzen.

Oliver

von Bronco (Gast)


Lesenswert?

Jeanette Seewald schrieb:
> Müsste das bedeuten, dass ich CPOL und CPHA so einstellen muss:
> CPOL=1, CPHA=0: Sample (Falling), Setup (Rising)
>
> Oder muss ich genau gegengleich arbeiten?

Also ich hätte mal getippt: CPOL=0 und CPHA=0
Aber ob das stimmt, mußt Du ausprobieren.

Probier mal folgendes:
- Gib Dir das ganze SPI-Telegram als Hex- oder besser noch Binär-Werte 
aus.
- Schaue Dir mehrere SPI-Telegramme hintereinander an und prüfe, ob es 
zu "wandernden" Muster kommt.
- Probier mal die 4 möglichen CPOL/CPHA-Kombinationen durch, was sich 
ändert, ob sich etwas stabilisert, usw.

Wie schon gesagt: am einfachsten siehst Du das am Oszi

PS: Zwischen SS-Aktivierung und Telegram-Beginn bzw. Telegram-Ende und 
SS-Deaktivierung gibt es auch Wartezeiten, die im Datenblatt des LTC 
angegeben sein sollten. Brücksichtigt?

von Jeanette S. (jeanny)


Lesenswert?

Ich danke euch allen sehr für die Hilfe.

Leider musste ich das ganze Projekt (inkl. Hardware) heute abgeben (ich 
fliege übermorgen für 6 Monate nach Singapur).

Die Werte, die ich zuletzt auslesen konnte, haben war quantitativ nicht 
gepasst, aber zumindest qualitativ bei Erwärmung der Chips einen 
eindeutigen Anstieg gezeigt.

Ich habe in meinem zusammenfassenden Bericht den Link zu diesem Thread 
mit reingenommen - vielleicht wird sich mein Nachfolger mit weiteren 
Fragen melden :)

von Hector C. (Firma: Technische Universität München) (cuenca)


Lesenswert?

Hallo zusammen!

Ich versuche via SPI die Sensorwerte des LTC2498 abzufragen wie meine 
Vorgängerin Jeanette Seewald.
Ich wäre sehr dankbar für eure Tipps zu meiner derzeitigen
Problemstellung.

Ich denke dass, die kode am anfang das Bild 2 auf S.14(DATAsheet 
LTC2498) folgt.

Ich habe versucht mit SPI (CPOL, CPHA) 4 Modus, MSB-LSB mit den DORD 
ändern, die Clock-Bitrate mit SPRO Und SPR1.

Da dieser im DATAsheet LTC2498 sagt, dass der Konvertierungsprozess 
endet bei Übertragung von 32-Bit oder ist unterbrochen, CS hoch und 
setzen, die auf dem Datenblatt des ATmega128RFA1(seite 335) sagt:

"The system is single buffered in the transmit direction and double 
buffered in the
receive direction.
This means that bytes to be transmitted cannot be written to the SPI
Data Register before the entire shift cycle is completed. When receiving 
data, however,
a received character must be read from the SPI Data Register before the 
next character
has been completely shifted in. Otherwise, the first byte is lost."

Ich habe versucht alles, zum beispiel:
Wie bekomme Ich nicht das erste byte ganz, das erste Byte der 
Informationen zu verlieren, für die Umwandlung von der LTC Dies ist: Ich 
habe 1. Byte des Getriebes in einem ersten Abstieg und Aufstieg über CS 
genommen.(Dummy BYTE)
1
  SPI_MasterInit();
2
3
  PORTB &= ~(1<<DD_SS);
4
  SPI_MasterTransmit(0);
5
  PORTB |= (1<<DD_SS);
6
7
  for(;;)
8
  {
9
  
10
    _delay_ms(500);
11
12
    //CS des Thermochips auf low
13
    PORTB &= ~(1<<DD_SS);
14
15
    
16
    //Byte1
17
    result = SPI_MasterTransmit(masterOut1);    
18
    masterIn = result;
19
20
    //Byte2
21
    result = SPI_MasterTransmit(masterOut2);
22
    masterIn = (masterIn<<8) + result;
23
24
25
    //Byte3
26
    result = SPI_MasterTransmit(0);
27
    masterIn = (masterIn<<8) + result;
28
29
30
    //Byte4
31
    result = SPI_MasterTransmit(0);
32
    masterIn = (masterIn<<8) + result;
33
34
    
35
    //CS des Thermochips auf high
36
    PORTB |= (1<<DD_SS);
Jetzt 4-Byte empfange Ich ganz, aber das Ergebnis ist immer noch zu 
wenig.
Ich bekomme daten mehr stabil aber DATAout Wert sollte etwa 80. 000, 
aber ich bekomme über 1000.

Vielleicht sollte ich mehr Zeit zur Konversion geben?

Ich habe kein Oszilloskop, und ich habe keine Ideen mehr.

Danke Euch schon mal!

: Bearbeitet durch User
von Hector C. (Firma: Technische Universität München) (cuenca)


Lesenswert?

Hat keiner Erfahrung mit dem LTC2498? Oder ähnlichem?

von A. W. (uracolix)


Lesenswert?

>Ich habe kein Oszilloskop,
Sag jetzt nicht, dass an der TU-Muenchen kein Oszi aufzutreiben ist und 
sich das Forum deswegen den Gehirnfasching geben muss, den Code durch 
angucken zu debuggen.

Was soll der 1 Byte 0-Befehl am Anfang machen? Der LTC braucht immer 32 
bit?

Was steht in Masterout1/2? Ist das IM bit gesetzt?

: Bearbeitet durch User
von Hector C. (Firma: Technische Universität München) (cuenca)


Lesenswert?

Vielleicht, aber im Moment kann ich nicht. Glauben Sie, dass nur mit der 
Oscilocopio ich wüsste wo das Problem liegt?

A. W. schrieb:
> Was soll der 1 Byte 0-Befehl am Anfang machen?
Jetzt denke Ich war totaler Unfug meinerseits,
Ich dachte, dass da die SPI Verbindung verlieren das erste Byte macht, 
könnte ein leeres Byte senden und dann in der zweiten Abfahrt des CS 
würde das LTC eine neue datainput/dataoutput starten.

>Der LTC braucht immer 32 bit?

Das glaube ich, datasheetLTC2498(seite 16):
The LTC2498 serial output stream is 32 bits long.

> Was steht in Masterout1/2?
Entschuldigung! Jetzt zeige Ich Sie,

// Thermoelement an CH0 und CH1
char masterOut1 = 0b10100000;

//Interne Temperaturmessung:
char masterOut2 = 0b11000000;

Wie am anfang.

>Ist das IM bit gesetzt?
IM Bit ist aktiviert. Ich versuche im Moment ja nur den Wert des 
internen Temperatursensors
auszulesen.

Ich zeige jede SPI-Telegramme hintereinander an und prüfe, ob es
zu "wandernden" Muster kommt. Das erste Byte kommt 11111, nicht 8 bit, 
das verstehe Ich nicht.
Villeicht bekomme ich nicht gut die Daten aus LTC2498 mit Master(MOSI) 
konfiguration?
Ich zeige das Kode und die Ergebnises aus Hterm:
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <stdint.h>
4
#include <stdlib.h>
5
#include <util/delay.h>
6
7
8
#define DD_MISO 3
9
#define DD_MOSI 2
10
#define DD_SCK 1
11
#define DD_SS 0
12
13
14
15
16
void uart_init()
17
{
18
  uint16_t temp = ((8000000)/(9600.0*16)-1); //Berechnung Übertragungsgeschwindigkeit
19
20
21
  UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //Senden und Empfangen freischalten
22
23
  UBRR0L = temp; //Übertragungsgeschwindigkeit übermitteln
24
  UBRR0H = temp>>8;
25
26
  UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);  //Übertragungsformat: 8-Bit
27
28
}
29
30
31
int sendestring(char *s)
32
{
33
  int i=0;
34
35
  for(i=0; s[i] != '\0'; i++)
36
  {
37
    while bit_is_clear(UCSR0A, UDRE0); //warten, bis UDRE0 = 1 (Senderegister frei)
38
    
39
    UDR0 = s[i]; //ein Zeichen senden
40
41
  }
42
43
  return 0;
44
}
45
46
47
48
49
void SPI_MasterInit(void)
50
{
51
  //Outputs: MOSI, SCK, SS
52
  DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
53
54
  //Enable SPI, Master-Mode, set clock rate fck/16
55
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
56
}
57
58
59
int SPI_MasterTransmit(char MOSI)
60
{
61
  //start Transmission
62
  SPDR = MOSI;
63
  
64
  //white for transmission complete
65
  while(!(SPSR & (1<<SPIF)));
66
67
  //returned data from slave to master
68
  return SPDR;
69
}
70
71
72
73
74
int main()
75
{
76
77
  char str[20];
78
79
  // Thermoelement an CH0 und CH1
80
  char masterOut1 = 0b10100000;
81
  //char masterOut2 = 0b10000000;
82
83
  // interne Temperaturmessung:
84
  char masterOut2 = 0b11000000;
85
86
  char result;
87
  uint32_t masterIn = 0;
88
  uint32_t Temp = 0;
89
90
  uart_init();  
91
92
  SPI_MasterInit();
93
94
  
95
  for(;;)
96
  {
97
  
98
    _delay_ms(500);
99
100
    //CS des Thermochips auf low
101
    PORTB &= ~(1<<DD_SS);
102
103
    
104
    //Byte1
105
    result = SPI_MasterTransmit(masterOut1);
106
    //result = SPI_MasterTransmit2;
107
    //SPI_MasterTransmit2;    
108
    masterIn = (result & 0b00011111);  //die ersten drei Bit löschen
109
110
111
    //für Debugging
112
    sendestring(" result1: ");
113
    itoa(result, str, 2); //binär darstellen
114
    sendestring(str);
115
116
    //Byte2
117
    result =SPI_MasterTransmit(masterOut2);
118
    //result = SPI_MasterTransmit2;
119
    masterIn = (masterIn<<8) + result;
120
    
121
122
      //für Debugging
123
    sendestring(" result2: ");
124
    itoa(result, str, 2); //binär darstellen
125
    sendestring(str);
126
127
    //Byte3
128
    result =SPI_MasterTransmit(0);
129
    //result = SPI_MasterTransmit2;
130
    masterIn = (masterIn<<8) + result;
131
    
132
      //für Debugging
133
    sendestring(" result3: ");
134
    itoa(result, str, 2); //binär darstellen
135
    sendestring(str);
136
137
    //Byte4
138
    result =SPI_MasterTransmit(0);
139
    //result = SPI_MasterTransmit2;
140
    masterIn = (masterIn<<8) + result;
141
142
      //für Debugging
143
    sendestring(" result4: ");
144
    itoa(result, str, 2); //binär darstellen
145
    sendestring(str);
146
147
    
148
    PORTB |= (1<<DD_SS);  //CS des Thermochips auf high
149
  
150
    _delay_ms(2000);
151
152
    masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; //die letzten 5 Bit löschen
153
154
      //für Debugging
155
    sendestring(" resultmasterIn: ");
156
    itoa(masterIn, str, 2); //binär darstellen
157
    sendestring(str);
158
159
    sendestring(" masterIn: ");
160
    sprintf(str, "%ld", masterIn);
161
    sendestring(str);
162
163
    //bei interner Temperaturmessung: Temperatur in °C berechnen laut Datenblatt Seite21
164
    Temp = (masterIn*4/1570)-273;
165
166
    sendestring(" Temp: ");
167
    sprintf(str, "%ld", Temp);
168
    sendestring(str);
169
170
    _delay_ms(2000);
171
  }
172
173
174
  return 0;
175
}

result1: 11111
result2: 11111110
result3: 11001100
result4: 1010000
resultmasterIn: 1111011001100010
masterIn: 16774754
Temp: 42465

von Hector C. (Firma: Technische Universität München) (cuenca)


Lesenswert?

Ich habe alle Dutzende Male geprüft und Ich habe Dutzende von Combos 
versucht. Ich verstehe nicht, warum die Daten bekomme ich nicht logisch 
sind.

Hat jemand eine ähnliche Erfahrung gehabt?

Danke Euch schon mal!

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


Lesenswert?

int ... char ...

Was ist ein "char"?  Ein Zeichen in der Ein- oder Ausgabe.

Wenn man eine kleine Ganzzahl haben möchte (small integer), dann bitte
int8_t benutzen, wenn es vorzeichenbehaftet sein soll, und uint8_t,
wenn es kein Vorzeichen haben soll.

Dein "int" bei SPI_MasterTransmit() in Verbindung mit der Addition
für masterIn versaut dir hier das Ergebnis.

Deklariere SPI_MasterTransmit() mit einem Rückkehrtyp von "uint8_t",
gleichfalls alle Variablen, die bislang als "char" deklariert sind.

Normalerweise würde man auch schreiben:
1
masterIn = (masterIn<<8) | result;

statt einer Addition.

von Hector C. (Firma: Technische Universität München) (cuenca)


Lesenswert?

Jörg Wunsch schrieb:

> Dein "int" bei SPI_MasterTransmit() in Verbindung mit der Addition
> für masterIn versaut dir hier das Ergebnis.
> Deklariere SPI_MasterTransmit() mit einem Rückkehrtyp von "uint8_t",
> gleichfalls alle Variablen, die bislang als "char" deklariert sind.

Ich habe gerade es geändert.

> masterIn = (masterIn<<8) | result;

Ich habe es geändert.

1
uint8_t SPI_MasterTransmit(uint8_t MOSI)
2
{
3
  //start Transmission
4
  SPDR = MOSI;
5
  
6
  //white for transmission complete
7
  while(!(SPSR & (1<<SPIF)));
8
9
  //returned data from slave to master
10
  return SPDR;
11
}
12
13
14
15
16
int main()
17
{
18
19
  char str[20];
20
21
  // Thermoelement an CH0 und CH1
22
  uint8_t masterOut1 = 0b10100000;
23
  //char masterOut2 = 0b10000000;
24
25
  // interne Temperaturmessung:
26
  uint8_t masterOut2 = 0b11000000;
27
28
  int8_t result1;
29
  int8_t result2;
30
  int8_t result3;
31
  int8_t result4;
32
  uint32_t masterIn = 0;
33
  uint32_t Temp = 0;
34
35
  uart_init();  
36
37
  SPI_MasterInit();
38
39
  
40
  for(;;)
41
  {
42
  
43
    _delay_ms(500);
44
45
    //CS des Thermochips auf low
46
    PORTB &= ~(1<<DD_SS);
47
48
    
49
    //Byte1
50
    result1 = SPI_MasterTransmit(masterOut1);
51
52
    //für Debugging
53
    sendestring(" result1: ");
54
    itoa(result1, str, 2); //binär darstellen
55
    sendestring(str);
56
57
    //Byte2
58
    result2 =SPI_MasterTransmit(masterOut2);
59
    
60
    masterIn = (result1<<8) | result2;
61
    
62
63
      //für Debugging
64
    sendestring(" result2: ");
65
    itoa(result2, str, 2); //binär darstellen
66
    sendestring(str);
67
68
    //Byte3
69
    result3 =SPI_MasterTransmit(0);
70
    
71
    masterIn = (masterIn<<8) | result3;
72
    
73
      //für Debugging
74
    sendestring(" result3: ");
75
    itoa(result3, str, 2); //binär darstellen
76
    sendestring(str);
77
78
    //Byte4
79
    result4 =SPI_MasterTransmit(0);
80
  
81
    masterIn = (masterIn<<8) | result4;
82
83
      //für Debugging
84
    sendestring(" result4: ");
85
    itoa(result4, str, 2); //binär darstellen
86
    sendestring(str);
87
88
    
89
    PORTB |= (1<<DD_SS);  //CS des Thermochips auf high


Ich habe versucht wieder 4 SPI modes  mit die neue Konfigurationen aber 
es funktionert nicht.

result1: 11 result2: 1111111111111111 result3: 1111111111111111 result4: 
1111111111111111 resultmasterIn: 1111111111111111 masterIn: -1 
Temp:2735374

SPI ist Duplexkommunikation und Ich sende und bekomme zur gleichen Zeit 
bei "result" variable.
Villeicht mein inputData (MasterOut1, MasterOut 2) wird von LTC2498 
nicht gut gelesen?  Ich lese aus LTC2498Datasheet:
"A new configuration can be loaded into the device by
setting EN2 = 1"
So Ich glaube alles gut konfiguriert ist.

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hector Cuenca schrieb:
> masterIn: -1

Beschaff' dir bitte das Oszilloskop.

Das sieht ja verdammt danach aus, als würde der LTC2498 einfach gar
nicht reagieren.

Überprüfe auch nochmal die Verdrahtung, ob da alles in Ordnung ist.

von Hector C. (Firma: Technische Universität München) (cuenca)


Angehängte Dateien:

Lesenswert?

Hallo Zussamen,

Ich habe auch dem gleichen Problem. Ich werde endlich mit dem 
Oszilloskop-Signal überprüfen. Ich will wissen vor der Prüfung des 
Oszilloskops, wenn das Signal wie das Bild sein soll

Konnte Sie mir sagen, ob das Signal bekomme ich dem in Anlage ähneln 
soll?
Weiß ich, dass es hängt die SPI-Verbindung konfigurieren, muss jedoch 
wie in der Abbildung?

Danke Euch schon mal!

von Hector C. (Firma: Technische Universität München) (cuenca)


Lesenswert?

Hallo Zussamen,

Weiß jemand, wie es sein sollte?

Danke Euch schon mal!

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.