Fragen zu SPI
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Schnittstellen (Assembler)  |  Fragen zu SPI « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Fragen zu SPI  (Gelesen 2005 mal)
 
Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« am: Februar 23, 2011, 20:23:52 »

Hallo
ich such informationen zu der SPI-Schnittstelle für den 16f887 als master und 16f88 als slave. ich hab mir die datenblätter schon durchgelesen aber leider helfen die mir nich so richtig weiter , deswegen wollt ich fragen ob mir dafür jemand vielleicht informationen geben kann, wie z.b sag ich dem slave das er zwischen den zu übertragenen bytes(ich möchte 4 byte senden) warten soll bis der master die ankommenden bytes verarbeitet hat?

vielen dank.
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #1 am: Februar 23, 2011, 23:22:00 »

Zitat
wie z.b sag ich dem slave das er zwischen den zu übertragenen bytes(ich möchte 4 byte senden) warten soll bis der master die ankommenden bytes verarbeitet hat?

Der SPI-Master erzeugt den Takt und ohne Takt sendet ein SPI-Slave keine Daten. D.h. daß ein SPI-Master in jedem Fall Daten senden muß (kann ein Dummy-Byte sein, dessen Inhalt vom Slave nicht ausgewertet wird), damit ein Slave überhaupt Daten senden kann.


Viele Grüße

Bernd
Gespeichert

Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« Antworten #2 am: Februar 24, 2011, 05:31:59 »

oki das heißt
-Takt einschalten
-Master sendet Dummy zum Slave
-Slave-interrupt,>Slave sendet 4Byte
-Master legt nach erstem Byte Takt auf Low um zu verarbeiten
-Master schaltet takt wieder ein für nächstes Byte

Wenn das so gehen sollte:
Wenn das erste byte im Master angekommen ist,wird das BF-Bit gesetzt.wenn ich dieses per Polling abwarte und dann sofort den Takt low setzte, reicht das dann um den Slave rechtzeitig zu stoppen. Also hat der Slave dann nicht eigenldich schon mit dem nächsten Byte begonnen?
oder würde vielleicht ne kleine warteschleife zwischen den einzelnen Byte im Slave reichen?
das ganze muss ohne sinnlose verzögerung ablaufen und sollte nur minimalen zeitaufwand haben.
danke
« Letzte Änderung: Februar 24, 2011, 06:31:16 von Herzog » Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #3 am: Februar 24, 2011, 18:06:39 »

Der Takt muß weder ein- noch ausgeschaltet werden, denn dafür sorgt das MSSP-Modul im Master-Betrieb selbst. Direkt nach dem Schreiben in SSPBUF werden die 8 Bits nacheinander vom Master über SDO ausgegeben und der dafür nötige Takt an SCK erzeugt. Gleichzeitig empfängt der Master dabei 8 Bits vom Slave. Dann wird im Master das BF-Flag gesetzt und die Taktleitung ist wieder „idle“.

Der Master hat immer die vollständige Kontrolle über den Zeitpunkt, zu dem in SSPBUF geschrieben wird. Somit kann ein Slave niemals „zu viele“ Daten senden, die der Master nicht rechtzeitig verarbeiten kann.
 
Wenn der Master vier Bytes von einem Slave erhalten soll, muß der Master insgesamt vier Mal in SSPBUF schreiben (und bei jedem einzelnen Schreibvorgang auf das BF-Flag warten und dann die empfangenen 8 Bit auswerten).


Viele Grüße

Bernd
Gespeichert

Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« Antworten #4 am: Februar 24, 2011, 21:05:55 »

Danke für die Antwort

mh.. ich versteh meinen fehler nicht. ich bekomme im Master immer das als ergebnis, was ich auch rausgeschickt hab?  mein Master arbeitet mit 12mhz der slave mit 8mhz, ist das oki?
beim Slave hab ich mich gegen die SS=enable-Variante entschieden weil ich nicht weiß wie man abfragt ob eben genau der Pic gemeint ist,wird das automatisch erkannt?.
Bis jetzt hab ich das einfach in der Schleife gemacht.

das sind die config-Sachen
Code:
;SPI initialisieren

bsf STATUS,RP0 ;Bank 1
bcf SSPSTAT,BF ;Bufferfull bit clear
bcf SSPSTAT,CKE
bcf SSPSTAT,SMP
bcf STATUS,RP0 ;Bank0


;SPI Master mode ,clock speed
bcf SSPCON,SSPM0 ;SPI Master mode,clock = OSC/4 (62,5 KHZ)
bcf SSPCON,SSPM1
bcf SSPCON,SSPM2
bcf SSPCON,SSPM3
hier steht für den slave
        bsf     SSPCON,SSPM0
        bcf     SSPCON,SSPM1
        bsf     SSPCON,SSPM2
        bcf     SSPCON,SSPM3
der rest ist wieder gleich
bsf SSPCON,CKP

bcf SSPCON,SSPOV ;kein überlauf bit
bcf SSPCON,WCOL ;
bsf SSPCON,SSPEN ;SPI mode eingeschaltet

hier der Master-code für diese stelle
Code:
SPI_Routine
bcf Slave88 ;Pic16F88 einschalten mit #define Slave88 PORTC,2 definiert

movlw B'00000000' ;Tacho_0
movwf SSPBUF ;
call BF_Bit
movwf Tacho_0

movlw B'00000000' ;Tacho_1
movwf SSPBUF
call BF_Bit
movwf Tacho_1

movlw B'00000000' ;Dreh_H
movwf SSPBUF ;
call BF_Bit
movwf Dreh_H

movlw B'00000000' ;Dreh_L
movwf SSPBUF ;
call BF_Bit
movwf Dreh_L ;

bsf Slave88 ;PIC16F88 ausschalten
return

;BF Bit Kontrollieren
BF_Bit
BF1
bsf STATUS,RP0 ;Bank 1

btfss SSPSTAT,BF
goto BF1
bcf STATUS,RP0 ;Bank0
movfw SSPBUF
return



und hier der slave code

Code:
; Intrupt servic routine
Int_serv
btfss PIR1,SSPIF ;kam es vom SPI
goto Signal


; auf Master übertragen
btfss Slave88 ;Pic16F88 gemeint?
goto SPI_run
bsf STATUS,RP0 ;Bank 1
bcf SSPSTAT,BF
bcf STATUS,RP0 ;Bank 0
bcf PIR1,3 ;Interrupt-Bit löschen
goto Int_end

SPI_run
btfsc Kontrolle,0
goto Kon_2
Kon_1 bsf Kontrolle,0
movfw D'15'            ;Fester Wert als test
movwf SSPBUF
goto Int_end

Kon_2 btfsc Kontrolle,1
goto Kon_3
bsf Kontrolle,1
movfw D'16'              ;Fester Wert als test
movwf SSPBUF
goto Int_end

Kon_3 btfsc Kontrolle,2
goto Kon_4
bsf Kontrolle,2
movfw D'17'             ;Fester Wert als test
movwf SSPBUF
goto Int_end

Kon_4
movfw D'18'             ;Fester Wert als test
movwf SSPBUF
clrf Kontrolle
goto Int_end


Signal
Unterprogramm......



Int_end

swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w


bsf INTCON, GIE ; enable Interupt

retfie

Ich versteh auch noch nich ganz wie der Slave gleichzeitig mit dem Master senden kann, weil eigendlich möcht ich doch erst daten vom master zum slave übertragen,vom slave auswerten lassen und dann die entsprechenden Daten wieder zum master senden.

vielen dank.
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #5 am: Februar 25, 2011, 00:33:35 »

Zitat
mein Master arbeitet mit 12mhz der slave mit 8mhz, ist das oki?

Die Taktfrequenzen von Master und Slave sind prinzipiell erst einmal egal. Allerdings gibt das Datenblatt des PICs genau an, welche maximale SPI-Taktfrequenz im Slave-Modus zulässig ist. Beim 16F88 findest Du unter „Param No. 70“ und „Param No. 71“ in Table 18-8, daß die minimalen Low- und High-Zeiten für den SPI-Takt mindestens TCY + 20ns betragen müssen.

Bei 8MHz PIC-Takt (und damit einem TCY  von 1 / 2MHz) liegt somit die maximal zulässige SPI-Frequenz des Slaves bei knapp unter 1MHz. Der von Dir gewählte SPI-Takt des Masters von 12MHz / 4 ist daher deutlich zu hoch.

Zitat
beim Slave hab ich mich gegen die SS=enable-Variante entschieden weil ich nicht weiß wie man abfragt ob eben genau der Pic gemeint ist,wird das automatisch erkannt?.

Der Slave wertet das SS-Signal automatisch in Hardware aus. Wenn der SS-Pin nicht low ist, wird der Takt ignoriert und der SDO-Pin des PICs bleibt hochohmig (wichtig, wenn mehrere SPI-Slaves an einen Master angeschlossen sind). Der Master muß einen beliebigen Pin für das SS-Signal in Software ansteuern.

Zitat
ch versteh auch noch nich ganz wie der Slave gleichzeitig mit dem Master senden kann, weil eigendlich möcht ich doch erst daten vom master zum slave übertragen,vom slave auswerten lassen und dann die entsprechenden Daten wieder zum master senden.

Damit der Slave bereits beim ersten Byte, welches der Master sendet, einen gültigen Wert liefern kann, muß er diesen in SSPBUF schreiben, bevor der Master anfängt zu senden. Dieses Byte wird erst dann übertragen, wenn der Master beginnt, sein erstes Byte zu senden. Dieses „Vorladen“ von SSPBUF ist je nach Anwendung nicht immer unbedingt möglich.

Oft ist es einfacher, wenn der Master einfach ein zusätzliches Byte sendet (quasi als Aufforderung „ich möchte Daten lesen“). Der Slave kann dann beim Empfang dieses Bytes in der ISR das SSPBUF-Register mit dem ersten zu sendenden Wert vorladen. Sobald der Master das nächste Byte schickt, wird dieser Wert an ihn zurückgesendet und in der ISR wird der zweite Wert in SSPBUF vorgeladen usw...

In Deinem Fall müßtest du also 5 Bytes an den Slave senden und das erste vom Slave empfangene Byte ignorieren (aber trotzdem auslesen, da es ansonsten zu einem Überlauf der SPI-Moduls kommt).


Viele Grüße

Bernd

PS.: Den Code habe ich mir nicht näher angeschaut

Gespeichert

Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.04 Sekunden mit 19 Zugriffen.
 
Top! Top!