Forum: Mikrocontroller und Digitale Elektronik SCA100T-D02 SPI Problem


von Pandora I. (pandoraiii)



Lesenswert?

Guten Tag die Damen und Herren,

habe jetzt lange genug probiert und ich suche mir jetzt Hilfe :)

Ich steuere den SCA100T-D02 mit SPI über einen LPC 936 an. Leider ist es 
mir nicht wirklich gelungen von diesem Sensor eine Antwort zu bekommen.
Meiner Meinung nach ist mein Code auch in Ordnung.
Code ist im Anhang.
Datenblatt zu diesem Sensor auch im Anhang.

Nachdem ich Kontakt aufgenommen habe zu VTI , haben die mir noch mal ein 
Datenblatt geschickt über SPI, aber leider für AVR .... auch im Anhang.

Habe meine Signale mit dem Oszi gemessen, SS, SCLK und MOSI sind top, 
aber bekomme nichts rein. Im SPDAT ist immer ein 0xFF.....

Zunächst versuche ich erst das Temperaturregister auszulesen, aber 
selbst dies klappt nicht....

Meine Vermutungen...

Delay Zeiten fehlen?
Muss ich den Sensor irgendwie noch mal enable?


Vielleicht hat irgendeiner mit dem Sensor schon Erfahrung gemacht, oder 
weiss mir irgendwie zu helfen!

Wäre sehr genial !
Hoffe auf kompetente Hilfe !

Gruß

von Pandora I. (pandoraiii)


Lesenswert?

push !

von Lucky L. (rantanplan)


Lesenswert?

Pandora Iii schrieb:
> Muss ich den Sensor irgendwie noch mal enable?

Ja

von Pandora I. (pandoraiii)


Lesenswert?

wow eine Antwort:)

Hallo Andreas,

ich mein enablen tue ich ihn ja damit den ich den CSB auf Maße sprich 
auf Low setze.
Richtig ?

von Lucky L. (rantanplan)


Lesenswert?

Arbeite unter anderem auch mit einem MEMS von VTI. Ist glaub ich ein 
etwas anderer Typ. Aber der den ich verwende hat eine Art enable PIN. 
Genaueres kann ich dir aber erst morgen sagen wenn ich wieder am 
Arbeitsplatz bin.

von Pandora I. (pandoraiii)



Lesenswert?

Hi,
okay das wäre gut !

Also ist gibt keinen enable pin...

Wie steuerste du denn SEnsor an  ? über einen AVR ? oder gar mit einem 
LPC ???

Ich mein den AVR Code habe ich ja, aber den zu verstehen ist nicht so 
einfach ...

Die Datei im Anhang ist der Code , einfach mit Acro REader öffnen

von Lucky L. (rantanplan)


Lesenswert?

Die Schaltung und die Software ist von einem meiner Vorgänger. Ich 
befasse mich momentan nur mit der Auswertung der Signale.

Pandora Iii schrieb:
> ich mein enablen tue ich ihn ja damit den ich den CSB auf Maße sprich
> auf Low setze.

Wenn du mit CSB den Chip-Select meinst müsste das richtig sein.
Ich melde mich morgen nochmal mit der Beschaltung und evtl mit ein 
bisschen Code für den MEMS. Wenn ich mich richtig erinnere gibts da eine 
Funktion InitMEMS(). Kann aber auch daran liegen das der Chip bei mir an 
einer Software SPI hängt.

Beste Grüße

von Lucky L. (rantanplan)


Lesenswert?

Pandora Iii schrieb:
> Wie steuerste du denn SEnsor an  ? über einen AVR ? oder gar mit einem
> LPC ???

CC2511

von Lucky L. (rantanplan)


Lesenswert?

Rein interesse halber, könntest du mir grob beschreiben für was du den 
MEMS verwenden möchtest?

von Pandora I. (pandoraiii)


Lesenswert?

MEMS = Sensor -> SCA100TD02 ???

von Lucky L. (rantanplan)


Lesenswert?

1
The SCA100T Series is a 3D-MEMS-based dual axis inclinometer family that provides instrumentation grade
2
performance for leveling applications.

Ja der SCA100TD02.

von Pandora I. (pandoraiii)


Lesenswert?

Zur Zeit mache ich meine Technikerarbeit, und brauch diesen Sensor für 
eine Neigungsmesssung an meine Motorrad.

3D ?

Der Sensor miest ja in 2 Axen.. x und y .


Wenn du auf der Arbeit was findest was mir hilft, wäre super.

von Lucky L. (rantanplan)


Lesenswert?

Steht ja da, ...bassiert auf einem 3D- microelectromechanical system 
...

Beim SCA100TD02 wurde die dritte Achse hald einfach weggelassen oder 
einfach nur nicht angeschlossen.

von Lucky L. (rantanplan)


Lesenswert?

Hallo,

der von mir verwendete Typ ist SCA3000D1. Datenblatt gibts bei VTI.
Anbei zwei Funktionen um mit dem MEMS zu komunizieren. Delays sind dort 
mit eingebaut. Hoffe das hilft dir.
1
 UINT8 SPIwrite(UINT8 adress, UINT8 data)
2
{
3
  UINT8 i;
4
  UINT16 output=0, input=0;
5
  output = (adress <<(10))+ data;            //10 = 2+8 correct output
6
  output |= 0x0200;                           //set write bit
7
  
8
  CSTILT = LOW;                                  //CS to zero
9
  SNOP();                                      //some nops for nicer timing
10
11
  for(i=0;i<16;i++)
12
    {
13
     if (output&0x8000)MOSI = HIGH;          //out data (MOSI) - set
14
     else MOSI = LOW;                        //delete
15
     output <<= 1;
16
     SNOP();                                   //clk generation
17
     SPICLK = HIGH;                          //rising edge of clk
18
     SNOP();
19
20
     if (MISO)input |= 0x0001;               //in data (MISO)
21
     else input &= ~0x0001;
22
     input <<= 1;
23
     SNOP();                                   //clk generation
24
     SPICLK = LOW;                           //falling edge of clk
25
     SNOP();
26
    }
27
28
  SNOP();
29
  CSTILT = HIGH;                                 //CS to one
30
  input >>= 1;                               //correct shifting
31
  return (UINT8)(input&0x00FF);              //return only value (parity
32
}                                            //and frame error doesnt matter)
1
 //adresses vti and reads answear
2
UINT8 SPIread(UINT8 adress)
3
{
4
  UINT8 i;
5
  UINT16 output=0, input=0;
6
  output = (adress <<(10))+ 0x00;            //10 = 2+8 correct output
7
8
  CSTILT = LOW;                                  //CS to zero
9
  SNOP();                                      //some nops for nicer timing
10
11
  for(i=0;i<16;i++)
12
    {
13
     if (output&0x8000)MOSI = HIGH;          //out data (MOSI) - set
14
     else MOSI = LOW;                        //delete
15
     output <<= 1;
16
     SNOP();                                   //clk generation
17
     SPICLK = HIGH;                          //rising edge of clk
18
     SNOP();
19
20
     if (MISO)input |= 0x0001;               //in data (MISO)
21
     else input &= ~0x0001;
22
     input <<= 1;
23
     SNOP();                                   //clk generation
24
     SPICLK = LOW;                           //falling edge of clk
25
     SNOP();
26
    }
27
28
  SNOP();
29
  CSTILT = HIGH;                                 //CS to one
30
  input >>= 1;                               //correct shifting
31
  return (UINT8)(input&0x00FF);              //return only value (parity
32
}                                            //and frame error doesnt matter)

von Pandora I. (pandoraiii)


Lesenswert?

Hi,

Vielen Dank für dein Nachschauen und den Beitrag.

Habe noch paar Fragen zu dem Code ...



Andreas G. schrieb:
> UINT8 SPIwrite(UINT8 adress, UINT8 data) // Ist das einfach nur Deklarierung und 
Inizialisierung Variablen oder eine Funktion? ist doch auch eine Funktion oder? 
Wenn ja , was macht sie ?
> {
>   UINT8 i;
>   UINT16 output=0, input=0;
>   output = (adress <<(10))+ data;            //10 = 2+8 correct output
>   output |= 0x0200;                           //set write bit
>
>   CSTILT = LOW;                                  //CS to zero
>   SNOP();  //Wie lange ist hier die Delay Zeit???//some nops for nicer timing
>
>   for(i=0;i<16;i++)
>     {
>      if (output&0x8000)MOSI = HIGH;          //out data (MOSI) - set
>      else MOSI = LOW;                        //delete
>      output <<= 1;
>      SNOP();                                   //clk generation
>      SPICLK = HIGH;                          //rising edge of clk
>      SNOP();
>
>      if (MISO)input |= 0x0001;               //in data (MISO)
>      else input &= ~0x0001;
>      input <<= 1;
>      SNOP();                                   //clk generation
>      SPICLK = LOW;                           //falling edge of clk
>      SNOP();
>     }
>
>   SNOP();
>   CSTILT = HIGH;                                 //CS to one
>   input >>= 1;                               //correct shifting
>   return (UINT8)(input&0x00FF); ????         //return only value (parity
> }                                            //and frame error doesnt matter)

Die Delay Zeiten sind denke mal immer so 1us? Wie machst du die ? Gibst 
da bei Atmel oder sowas eine Funktion, bei dem LPC gibt es dann nicht, 
denke ich muss das ausproiberen und da mit For schleifen arbeiten und 
das mit dem Oszi anschauen!!!? oder?

Du machst das ja jetzt Bit weise, du überträgst jedes Bit einzeln und 
setzt ganz genau das Timing. Ich habe das bisher nicht so gemacht, weil 
auch aus dem einen Beispiel von meinem LPC das anders ist. Aber 
vielleicht sollte ich das auch mal so machen.

Was mir noch aufgefallen ist, das du 2 Zylken hast, wenn du schaust bei 
dem PDF von meine Sensor, auf Seite 11 ,bei Figure 10. Es ist ein 
Zylkus. CS geht einmal runter, schickt den Command und dann wird dummy 
wert gesendet und dabei ausgelesen.


Read temperature data register (RWTR) reads temperature data register 
during normal
operation without affecting the operation. The temperature data register 
is updated every 150 μs.
The load operation is disabled whenever the CSB signal is low, hence CSB 
must stay high at least
150 μs prior to the RWTR command in order to guarantee correct data. The 
data transfer is
presented in Figure 10 below. The data is transferred MSB first. In 
normal operation, it does not
matter what data is written into temperature data register during the 
RWTR command and hence
writing all zeros is recommended.




hence CSB must stay high at least
150 μs prior to the RWTR command in order to guarantee correct data. <<< 
Ist denke auch ein wichtiger Punkt.


Werde mal versuchen ein neuen Code zuschreiben und dann noch mal zu 
probieren...

Gruß

Daniel

von Lucky L. (rantanplan)


Lesenswert?

Hallo.

Pandora Iii schrieb:

>>
1
 UINT8 SPIwrite(UINT8 adress, UINT8 data)
> Ist das einfach nur Deklarierung und
> Inizialisierung Variablen oder eine Funktion? ist doch auch eine Funktion oder?
> Wenn ja , was macht sie ?

Funktion in der übersichtshalber die Datentypen der Variablen stehen.
Datentypen kannst natürlich auch weglassen da es sich nicht um den 
Prototypen der Fuktion handelt.

>>   SNOP();  //Wie lange ist hier die Delay Zeit???

Keine ahnung müsste ich mit dem Oszi ausmessen. Sind hald einfach ein 
paar Taktzyklen.

>>   return (UINT8)(input&0x00FF); ????

Der Rückgabewert wird maskiert und wird auf UINT8 gecastet.
Kurz: Überflüssige Bits wegschneiden.

> Die Delay Zeiten sind denke mal immer so 1us? Wie machst du die ? Gibst
> da bei Atmel oder sowas eine Funktion, bei dem LPC gibt es dann nicht,
> denke ich muss das ausproiberen und da mit For schleifen arbeiten und
> das mit dem Oszi anschauen!!!? oder?

Atmel gibts mit Sicherheit eine odere sogar mehrere Funktionen. Vom LPC 
hab ich keine Ahnung aber die gibts meiner Vermutung nach 100&ig.
Schau mal im Assembler für die µC Familie nach.

> Du machst das ja jetzt Bit weise, du überträgst jedes Bit einzeln und
> setzt ganz genau das Timing. Ich habe das bisher nicht so gemacht, weil
> auch aus dem einen Beispiel von meinem LPC das anders ist. Aber
> vielleicht sollte ich das auch mal so machen.
>
> Was mir noch aufgefallen ist, das du 2 Zylken hast, wenn du schaust bei
> dem PDF von meine Sensor, auf Seite 11 ,bei Figure 10. Es ist ein
> Zylkus. CS geht einmal runter, schickt den Command und dann wird dummy
> wert gesendet und dabei ausgelesen.

Versteh nicht was du damit meinst.

> 150 μs prior to the RWTR command in order to guarantee correct data. <<<
> Ist denke auch ein wichtiger Punkt.

Ja

von Lucky L. (rantanplan)


Lesenswert?

Um jetzt hier einen Vernünftige nAbschluss zu bekommen, fasse ich kurz 
mal zusammen.
Im Code von mir ist SPI per Software realisiert. Das hat den Grund, dass 
dein MEMS u. meiner mit mehr als 8 Bit auf eine Anfrage antworten. Die 
SPI von meinem und wahrscheinlich auch deinem µC kann aber nur mit 8 Bit 
arbeiten. Also ist der SPI-Bus von µC nicht bzw. nur über umwege 
geeignet.
Den Code den ich dir gepostet hab kannst du fast komplett übernehmen. Du 
musst nur die PINs für CLK, MISO, MOSI anpassen usw. Die defines für 
LOW, HIGH usw. anpassen. Un den NOP Befehl für deinen µC rausfinden.

Dein MEMS ist etwas einfacher Aufgebaut. Er hat z.B. keine Register. 
D.h, Code kann vereinfacht werden. Zum beachten ist noch MSB-Bit muss 
bei den VTI ICs als erstes gesendet werden.
1
 void SPIwrite(UINT8 data)
2
{
3
  UINT8 i; // 8 Bit weil nur maximal 8 Bit gesendet werden
4
  UINT8 output=0;
5
  
6
  output = data;
7
  
8
  CSTILT = LOW;  //CS to zero
9
  SNOP();  //<==== den Befehl musst du noch ändern
10
                                   
11
  for(i=0;i<8;i++)
12
    {
13
     if (output&0x80)MOSI = HIGH;          
14
     else MOSI = LOW;                       
15
     output <<= 1;
16
     SNOP(); //<====                                 
17
     SPICLK = HIGH;                         
18
     SNOP(); //<===
19
    }
20
21
  SNOP(); //<===
22
  CSTILT = HIGH;                               
23
   
24
}        
25
26
27
UINT8 SPIread(void)
28
{
29
  UINT8 i;
30
  UINT16 input=0;
31
             
32
  CSTILT = LOW;                                 
33
  SNOP();                                      
34
35
  for(i=0;i<16;i++)
36
    {
37
     if (MISO)input |= 0x0001;             
38
     else input &= ~0x0001;
39
     input <<= 1;
40
     SNOP();                                   
41
     SPICLK = LOW;                          
42
     SNOP();
43
    }
44
45
  SNOP();
46
  CSTILT = HIGH;                                 
47
  input >>= 1;                               
48
  return (UINT8)(input&0x00FF); //Hier evtl. änderungen
49
}

Jetzt hast du zwei einfache Funktionen um mal ein bisschen zu testen.

Laut Datenblatt:
RWTR 00001000 Read and write temperature data register

Ein SPIwrite(0x08);
mit folgendem SPIread();
müsste dir nun Werte liefern.

von Pandora I. (pandoraiii)


Lesenswert?

Moiin,

also den Temperatur Wert auszulesen klappt jetzt, allerdings habe ich 
eine Temperatur von 15 Grad....

Der Gibt mir den Wert 0xB5 was 181 ist , nach der Formal aus dem 
Dattenblatt

(181-197)/ -1.083 = ergibt 14,77 Grad...

Habe hier in der Bude ca 20-23 grad denk ich mal. aber keine 15 grad....


KÖnnte man davon ausgehen das der Sensor defekt ist ?

Kann man den neu calibrieren?
gruß

von Ralph (Gast)


Lesenswert?

Such mal im Datenblatt vom Sensor nach den Toleranzen.

Ich hab schon mit einem anderen Mems von VTI gearbeitet und bei dem sind 
bei der Temperatur Toleranzen von +-20°C völlig normal.
Muss dann in software auf dem µC kalibriert werden.

von Pandora I. (pandoraiii)


Lesenswert?

UHH,

ich meine ich hätte was von plus minus 1 Grad gelesen. Aber ich guck 
noch mal durch ! danke !

Aber kann es sein, das die Neigungswerte der Temp werte angepasst wird ?

von Ralph (Gast)


Lesenswert?

Ich weiß jetzt nicht wie das bei diesem Sensor ist.
Kann sein das der Sensor intern diese Korrektur macht, kann aber auch 
sein das du die Korrektur in software machen musst.

==> Datenblatt / Application Nodes

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.