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
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
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.
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...
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.
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 ---------------------' |
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.
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.
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.
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....
Wenn ihr einen Logic Analyzer habt, schließt doch den einfach mal an und guckt, was ihr da sendet.
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.
Du solltest nach dem schreiben des jeweiligen SPI-Bytes die Antwort sofort auslesen und nicht erst, wenn alle 3 Bytes gesendet wurden.
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.
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.
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
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?
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?
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.