www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SCA100T-D02 SPI Problem


Autor: Pandora Iii (pandoraiii)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push !

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pandora Iii schrieb:
> Muss ich den Sensor irgendwie noch mal enable?

Ja

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pandora Iii (pandoraiii)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lucky Luck (rantanplan)
Datum:

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

CC2511

Autor: Lucky Luck (rantanplan)
Datum:

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

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MEMS = Sensor -> SCA100TD02 ???

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
The SCA100T Series is a 3D-MEMS-based dual axis inclinometer family that provides instrumentation grade
performance for leveling applications.

Ja der SCA100TD02.

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht ja da, ...bassiert auf einem 3D- microelectromechanical system 
...

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

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht 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.
 UINT8 SPIwrite(UINT8 adress, UINT8 data)
{
  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();                                      //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) 
 //adresses vti and reads answear
UINT8 SPIread(UINT8 adress)
{
  UINT8 i;
  UINT16 output=0, input=0;
  output = (adress <<(10))+ 0x00;            //10 = 2+8 correct output

  CSTILT = LOW;                                  //CS to zero
  SNOP();                                      //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) 

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Pandora Iii 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 ?

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

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht 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.
 void SPIwrite(UINT8 data)
{
  UINT8 i; // 8 Bit weil nur maximal 8 Bit gesendet werden
  UINT8 output=0;
  
  output = data;
  
  CSTILT = LOW;  //CS to zero
  SNOP();  //<==== den Befehl musst du noch ändern
                                   
  for(i=0;i<8;i++)
    {
     if (output&0x80)MOSI = HIGH;          
     else MOSI = LOW;                       
     output <<= 1;
     SNOP(); //<====                                 
     SPICLK = HIGH;                         
     SNOP(); //<===
    }

  SNOP(); //<===
  CSTILT = HIGH;                               
   
}        


UINT8 SPIread(void)
{
  UINT8 i;
  UINT16 input=0;
             
  CSTILT = LOW;                                 
  SNOP();                                      

  for(i=0;i<16;i++)
    {
     if (MISO)input |= 0x0001;             
     else input &= ~0x0001;
     input <<= 1;
     SNOP();                                   
     SPICLK = LOW;                          
     SNOP();
    }

  SNOP();
  CSTILT = HIGH;                                 
  input >>= 1;                               
  return (UINT8)(input&0x00FF); //Hier evtl. änderungen
}                         

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.

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pandora Iii (pandoraiii)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.