Forum: Mikrocontroller und Digitale Elektronik 3 wire Sensor an SPI


von Maddin (Gast)


Lesenswert?

Hallo,

ich hab einen Sensor der mit Clock, DataIn/Out und Chipselect 
ausgestattet ist. Den Sensor möchte ich nun über einen µC mittels SPI 
ansprechen. Dazu habe ich zwischen MISO und MOSI des µC einen 1k Ohm 
Widerstand gemacht. Ist das ok oder gibts da ne andere Methode?
Das Problem ist halt das DataIn/Out des Sensors nur 1 Pin ist und ich 
ihn beschreiben muss um etwas auszulesen.

Gruß Maddin

von sven (Gast)


Lesenswert?

Nabend,

das übliche Problem:
Gib uns bitte etwas mehr Informationen.
(Zum Beispiel von welchen Sensor du sprichst)

Ob das klappt oder wie man das besser macht hängt ganz davon ab wie die 
Schnittstelle im Detail funktioniert.

Gruß,
Sven

von Maddin (Gast)


Lesenswert?

Es handelt sich um den MAX6662 von Maxim. Das ist ein 12 Bit 
Temperatursensor. Getestet wird das SPI mit dem AT32UC3C-ek Board.
SPI funktioniert denke ich auch. Wenn ich etwas sende geht der 
ChipSelect auf low und ich kann die Clock über ein Oszi messen und auch 
am MOSI sehe ich was.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Maddin schrieb:
> Den Sensor möchte ich nun über einen µC mittels SPI ansprechen.
Ich würde das per Software machen, dann kann ich die Richtung des 
Portpins einfach selber umschalten...

von Maddin (Gast)


Lesenswert?

Es geht ja darum SPI zu testen, da dies für ein anderes Projekt benötigt 
wird. Da ich noch nie nen 32 Bit µC programmiert habe wollte ich einfach 
den Sensor mal auslesen, da ich dachte es wär realtiv einfach.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Mach es so und gib, wenn Du lesen willst, 0xFF als Dummy aus.

1
    Controller                                    Sensor
2
3
4
             /CS  ---------------------------  /CS
5
6
7
             SCK  ---------------------------  SCK
8
9
                             ___
10
            MOSI  ----------|___|------o-----  SIO
11
                             10k       |
12
                                       |
13
                                       |
14
            MISO  ---------------------'

von Maddin (Gast)


Angehängte Dateien:

Lesenswert?

Hab es so verdrahtet aber nix kommt an. Ich hab mal MOSI und MISO des µC 
miteinander verbunden und dann verschiedene Werte gesendet und wieder 
eingelesen. Die Werte die empfangen wurden passen zu den gesendeten. Von 
daher denke ich, dass das SPI an sich läuft.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ich nehme mal stark an, dass Deine /CS-Behandlung nicht passt.

von Maddin (Gast)


Lesenswert?

Ich habe auch schon versucht CS auf low zu legen, dann 3 mal die write 
Funktion aufrufen und 2 mal read aufrufen und dann den CS wieder auf 
high legen. Funktioniert aber ebenfalls nicht. Das CS auf low bzw high 
geht habe ich auch gemessen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Maddin schrieb:
> Ich habe auch schon versucht CS auf low zu legen, dann 3 mal die write
> Funktion aufrufen und 2 mal read aufrufen und dann den CS wieder auf
> high legen.

Mach doch einfach das, was das Datenblatt sagt.

Serial Interface Protocol
The  serial  interface  consists  of  three  signal  lines:  chip
select  (CS),  bidirectional  data  line  (SIO),  and  serial
clock (SCLK). Only the master (external) drives CS and
SCLK.  Both  the  master  and  the  MAX6662  drive  SIO.
When CS is high, the MAX6662 does not respond to any
activity on clock and data lines. When CS goes low, a
transaction begins. A valid transaction has 24 clock
cycles provided from SCLK after CS goes low—no more
and no fewer. Any  communication  with  more  or  fewer
than exactly 24 clocks is ignored.

von Maddin (Gast)


Lesenswert?

Ich schicke doch 8 Bit und erwarte 16 zurück. Ich verzweifel langsam....

von uc3c neuling (Gast)


Lesenswert?

hey @ all,

ich habe ein ähnliches problem. im rahmen einer studienarbeit muss ich 
mich ebenfalls mit dem uc3c und spi beschäftigen. es sollen halt 2 
weitere prozessoren mit dem uc3c über spi kommunizieren.
hab schon etwas zeit gebraucht um mit dem neuen framework zu arbeiten 
bzw allgemein mich an das avrstudio 5 zu gewöhnen. die beispiele rund 
ums spi finde ich auch nicht so hilfreich.
die arbeit wird wohl scheitern da auch mein prof noch nicht so ganz den 
durchblick hat....

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wenn ihr einen Logic Analyzer habt, schließt doch den einfach mal an und 
guckt, was ihr da sendet.

von uc3c neuling (Gast)


Lesenswert?

Das Senden funktioniert definitiv. Nur kann ich nichts empfangen. Ich 
hab das Board mal ans STK500 angeschlossen und den Atmega8 darauf als 
Slave programmiert. Wenn ich vom UC3C was bekomme schickt der Atmega 
direkt was zurück. Nur beim UC3C kommt nichts an.

von Nobody (Gast)


Lesenswert?

Du solltest nach dem schreiben des jeweiligen SPI-Bytes die Antwort 
sofort auslesen und nicht erst, wenn alle 3 Bytes gesendet wurden.

von Maddin (Gast)


Lesenswert?

Hallo,

das habe ich auch schon probiert. Funktioniert aber nicht. SCK wird 
anscheinend nach dem Senden abgestellt. Ich weiss aber nicht wie SCK 
dauerhaft läuft.

von LuXXuS 9. (aichn)


Lesenswert?

Maddin schrieb:
> Ich schicke doch 8 Bit und erwarte 16 zurück.

Das ist auch OK, aber:

Knut Ballhause schrieb:
> Only the master (external) drives CS and
> SCLK.

Das heisst, dass du insgesamt 24Bit hinschicken musst, da der Slave 
selber keinen Clock generiert.

Also: ein Kommando-Byte hinsenden, dann noch zwei weitere um einen Clock 
für den Slave bereit zu stellen. Was du in den zwei weiteren Byte 
sendest, ist egal - kann 0x00 oder 0xFF oder sonst was sein. SPI ist ja 
immer in einer Schleife - du kannst nichts senden, ohne was zu 
empfangen. Was du mit den Daten machst, ist ja egal. Heißt für dich: 
Ignoriere das erste Byte, was in deinem uC ankommt, da dieses nur zum 
Hinschicken der Daten war und die nächsten zwei Byte musst du asuwerten.

Ist bei SPI immer so.

von spess53 (Gast)


Lesenswert?

Hi

>das habe ich auch schon probiert. Funktioniert aber nicht. SCK wird
>anscheinend nach dem Senden abgestellt. Ich weiss aber nicht wie SCK
>dauerhaft läuft.

Üblicherweise funktioniert das so:

Zum Lesen sendest du das Befehlsbyte und 2 Dummybyts. Nach jedem 
Dummybyte liest du das SPI-Empfangsregister aus.

MfG Spess

von Maddin (Gast)


Lesenswert?

Ich habe jetzt MOSI und MISO am UC3C gebrückt und sende einen Wert und 
lese direkt danch das Register aus. Dazu habe ich die beiden Funktionen 
aus der spi.c genommen.
1
if(gpio_get_pin_value(SWITCH) == false) {
2
   spi_write(SPI_TMP, 0xC1);
3
   spi_read(SPI_TMP, data_in);
4
}  
5
    
6
  
7
if(data_in == 0xC1) 
8
   gpio_set_pin_low(LED);

So sollte doch die LED leuchten oder? Es tut sich aber nichts. Hab ich 
denn grundlegend bei der Initialisierung des SPI einen Fehler gemacht?

von LuXXuS 9. (aichn)


Lesenswert?

Also ich kenne deine Funktionen nicht, aber wie soll das hier gehen:

Maddin schrieb:
> spi_read(SPI_TMP, data_in);

Willst du da ein Byte hinschicken, in das das Ergebnis eingetragen wird?

Oder verstehe ich da jetzt was falsch?

von Maddin (Gast)


Lesenswert?

So sieht die Funktion aus, sie stammt aus dem Framework vom AVRStudio 5.
1
spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data)
2
{
3
  unsigned int timeout = SPI_TIMEOUT;
4
5
  while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) !=
6
         (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) {
7
    if (!timeout--) {
8
      return SPI_ERROR_TIMEOUT;
9
    }
10
  }
11
12
  *data = spi->rdr >> AVR32_SPI_RDR_RD_OFFSET;
13
14
  return SPI_OK;
15
}

von LuXXuS 9. (aichn)


Lesenswert?

Dann solltest du aber auch eine Adresse dahin schicken und keine 
Variable.

&data_in

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.