3 wire Sensor an SPI

Gast #2338156
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
Gast #2338341
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
Gast #2338712
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.
Gast #2338726
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.
Gast #2338816
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.
Angehängte Dateien:
Gast #2338932
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.
(Firma: TravelRec.) Persönliche Seite #2339028
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.
Gast #2339506
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....
Gast #2342177
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.
#2342258
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.
Gast #2342260
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
Gast #2342286
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?
Gast #2342299
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
}

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