Forum: Mikrocontroller und Digitale Elektronik SPI-Schnittstellen Programmierung


von Andre B. (andre-atmega168)


Lesenswert?

Hallo,

ATmega 168 MYSmartControl Standard
Temp-Sensor: LM74

möchte über SPI mit einem ditgialen Temp-Sensor kommunizieren.
Senden kann ich schon, allerdings wird der Befehl fortwährend aus dem 
SPDR geschrieben. Jetzt komme ich nicht weiter. Wie kann ich über SPI 
den Temp-Sensor auslesen. Schickt der mir automatisch die Temperatur die 
ich dann einfach im SPDR speicher? und ich vorher den Port von MOSI auf 
MISO schlaten muss?



;spi_ini:

; Set MOSI and SCK in, miso out ,all others input
  ldi  r17,0b00101110  ; master
  ;ldi    r17,0b00101100
  out  DDRB,r17
; Enable SPI, Master, set clock rate
  ldi  r17,0b01010011  ;(1<<SPE)|(1<<MSTR)|(1<<SPR0)
  out  SPCR,r17

sendSPI:
  ldi  r20,0b00101110  ; master [clk(5) mosi(3)  ss(2)]=outp
  out  DDRB,r20
  in  r16,SPSR  ; dummy read
  ldi  r20,0b10101010  ; Befehl[FF] für Temp-Sensor(Temp senden)
  cbi  portb,2  ; bit 2 von portb auf 0 = cs low
  out  spdr,r20
  ;rjmp   SEND_SPI
  ;sbi   portb, 2
  ret

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Ich bin leider des asm nicht mächtig, aber es dürfte leicht sein, diese 
C-Routinen nach asm zu portieren.
1
void spiinit(void) {
2
3
    DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);      // set PB4(SS), PB5 (MOSI) and PB7 (SCK) output, all others input
4
5
    SPCR = (1<<SPE)|(1<<MSTR);           // enable SPI, Master, set clock rate fck/4  
6
  
7
    PORTB |= (1 << PB7)|(1 << PB4);
8
}
9
10
unsigned char spi(unsigned char data)
11
{
12
    SPDR = data;
13
    loop_until_bit_is_set(SPSR, SPIF);
14
 
15
    return SPDR;
16
}
17
18
void select(void) {
19
  PORTB &= ~(1<<PB4);
20
}
21
22
void unselect(void) {
23
  PORTB |= (1<<PB4);
24
}
Nach dem KISS-Prinzip =)

von fubu1000 (Gast)


Lesenswert?

Hallo und guten morgen kann eh nicht schlafen ;-(

Deine Spi_ini sieht aufm ersten Blick ok aus.

send _SPI würde ich so machen.

send_SPI:

    out  SPDR,  temp1    //in temp1 sind Daten
lp7:  sbis  SPSR,  SPIF
      rjmp  lp7
    ret




GRUSS

von fubu1000 (Gast)


Lesenswert?

Aso, sry
fehlt natürlich das setzen des ChipSelects, welches wahrscheinlich auf 
low gesetzt werden muss, vor meiner send_SPI !

GRUSS

von Michael U. (amiga)


Lesenswert?

Hallo,

send_SPI:

lp7:  sbis  SPSR,  SPIF
      rjmp  lp7

    out  SPDR,  temp1    //in temp1 sind Daten
    ret

ist merklich sinnvoller.
Warum soll der AVR beim Senden warten, bis der Hardware-SPI fertig ist?
Der kann inzwischen was sinnvolleres machen, deshalb ja Hardware-SPI.

Gruß aus Berlin
Michael

von Ralph (Gast)


Lesenswert?

Warum immer dieses Assembler ????
zum Debuggen ist es Ok wenn man es kann, aber zum Programmieren geht das 
in Richtung SadoMaso.
C ist wesentlich flexibler, und es kann (fast) jeder lesen und 
interpretieren. Bei Assembler geht das nicht.


Aber jetzt zur Frage:

MOSI , MISO und CLOCK werden fest verdrahtet und NIEMALS umgeschaltet.
Der µC ist der Master ( das ist das M in MISO und MOSI )
Dein Sensor der Slave ( das ist das S in MISO und MOSI )

1. Zuerst wird der Chipselect Pin des Slave(Sensor) auf Aktiv gesetzt ( 
Blick ins Datenblatt ob High oder Low Aktiv) ; gibt es nur eine Slave 
kann der Pin eventuell auch hart verdrahtet auf aktiv stehen, es sei 
denn das hier ein Flankenwechsel erkannt werden muss (Datenblatt )
2. Datenbyte in das SPI Register des Masters legen ; Normalerweise 
startet das SPI interface jetzt die Übertragung ( im Datenblatt 
nachsehen ob dieser µC dazu eine zusätzliche Aktion benötigt oder nicht)
3. Das SPI interface taktet nun das Datenbyte zum Slave und mit dem 
gleichen
Takt gelangt das Datenbyte des Sensors zum Master.
4. Empfangenes Byte aus dem SPI Register des µC auslesen.( das erste 
empfangene Byte ist meistens zum wegwerfen, Dummybyte des Slave)
5a. werden weitere Bytes benötigt Sprung zu Punkt 2.
5b. nach dem letzten Byte Chipselect Pin des Slave auf nicht aktiv 
setzen.

Bei vielen Sensoren ist es so, das im ersten übertragenen Byte das 
Kommando steht was der Sensor an Daten liefern soll. Danach muss dann 
eine entsprechenden Anzahl an "dummy" bytes gesendet werden.
Beispiel:
Der Sensor soll die Temperatur liefern, ein 16 bit wert
1. Byte von µC zu Sensor ist das Kommandobyte für "Temperaturausgabe" 
(Datenblatt)
2. Byte von µC zu Sensor ist ein Dummybyte, der Sensor liefert jetzt die 
ersten 8 bit der Temperatur
3. Byte von µC zu Sensor ist ein Dummybyte, der Sensor liefert jetzt die 
restlichen 8 bit der Temperatur


Zusammengefasst :

Datenblätter lesen !!!!!!!!!

Dann erübrigen sich viele der hier im Forum gestellten Fragen.
( bitte nicht persönlich nehmen, so ist es nicht gemeint )

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.