SCA100T-D02 SPI Problem

OP #1972468
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ß
OP #1973235
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
#1973244
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
#1973889
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)
OP #1976163
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
#1977309
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
#1977861
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.
OP #1997595
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ß
Gast #1997651
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.
Gast #1997700
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

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