Forum: Mikrocontroller und Digitale Elektronik Nur 1 Bit mit SPI


von Michael M. (skyscater)


Lesenswert?

Hallo,
bin gerade am entwerfen einer Schaltung mit dem ADS1232 
(DMS-Brückenverstärker). Zum auslesen muss ich 24 Bits also ganz einfach 
3 Bytes lesen, was mit dem Hardware SPI ja keine Kunst ist. Nur muss ich 
noch einen 25 Impuls auf SCKL bringen, damit die Datenleitung vom IC zum 
uC auf High gezogen wird und ich zum abholen neuer Daten nur abzufragen 
brauch ob die Leitung low ist. Ein 26 Impuls leitet aber einen 
Kalibrievorgang ein, womit ich nicht einfach noch ein Byte einlesen 
kann.

Somit zu meiner Frage:
Kann man den Hardware SPI irgendwie überzeugen nur einen Impuls zu 
senden, oder komm ich um eine Softwarelösung nicht rum?

mfg. skyscater

von Detlef K. (adenin)


Lesenswert?

Was hast Du dir den für eine Hardware SPI gebaut, gekauft oder gewonne? 
:)

von Thomas E. (thomase)


Lesenswert?

Michael Mokricky schrieb:
> Somit zu meiner Frage:
> Kann man den Hardware SPI irgendwie überzeugen nur einen Impuls zu
> senden, oder komm ich um eine Softwarelösung nicht rum?

Nein.
Was hindert dich daran den Spi abzuschalten, einmal am Clockpin zu 
wackeln und dann wieder auf Spi zu schalten? Und nein, das ist nicht 
kompliziert.

mfg.

von Wolfgang (Gast)


Lesenswert?

Michael Mokricky schrieb:
> Kann man den Hardware SPI irgendwie überzeugen nur einen Impuls zu
> senden, oder komm ich um eine Softwarelösung nicht rum?

Einen einzelnen Impuls per Software zu erzeugen, kann doch nicht so 
schwer sein. Spezielle Anforderungen erfordern manchmal spezielle 
Lösungen.

von Michael M. (skyscater)


Lesenswert?

Danke für die schnellen Antworten!

Ups, ganz vergessen. Das ganze geht über einen ATMEGA8.

Das hab ich auch schon überlegt, dachte mir nur dass es villeicht eine 
schönere Lösung gibt, als die SPI jedesmal aus und wieder einzuschalten. 
Nebenbei wisst ihr wieviel Zeit das Einschalten der SPI bis zur 
Betriebsbereitheit in Anspruch nimmt? (Darüber hab ich im Datenblatt nix 
gefunden)
Bzw. bin ich mir nicht ganz sicher ob ich nicht einfach den SCKL-PIN 
während eingeschaltetem SPI ansteuern kann. (ausprobieren kann ichs 
gerade leider nicht).

mfg. skyscater

von Thomas E. (thomase)


Lesenswert?

Michael Mokricky schrieb:
> Danke für die schnellen Antworten!
>
> Ups, ganz vergessen. Das ganze geht über einen ATMEGA8.
>
> Das hab ich auch schon überlegt, dachte mir nur dass es villeicht eine
> schönere Lösung gibt, als die SPI jedesmal aus und wieder einzuschalten.
> Nebenbei wisst ihr wieviel Zeit das Einschalten der SPI bis zur
> Betriebsbereitheit in Anspruch nimmt? (Darüber hab ich im Datenblatt nix
> gefunden)
Was soll da lange dauern? Enable und los gehts.

> Bzw. bin ich mir nicht ganz sicher ob ich nicht einfach den SCKL-PIN
> während eingeschaltetem SPI ansteuern kann. (ausprobieren kann ichs
> gerade leider nicht).
Solltest du nicht machen.

mfg.

von Detlef K. (adenin)


Lesenswert?

Im Datenblatt steht:
SCK: Master Clock output, Slave Clock input pin for SPI channel. When 
the SPI is enabled as a
Slave, this pin is configured as an input regardless of the setting of 
DDB5. When the SPI is
enabled as a Master, the data direction of this pin is controlled by 
DDB5. When the pin is forced
by the SPI to be an input, the pull-up can still be controlled by the 
PORTB5 bit.

So könnte es also ohne Abschaltung der SPI gehen:

Ich nehme mal an, das SCK im Ruhezustand low ist:
- PortB Bit 5 setzen // Pull Up setzen
- DDRB Bit 5 rücksetzen  // damit wird der PullUp an SCK sichtbar
- warte deine benötigte Impulslänge ab
- DDRB Bit 5 setzen  // Signal der SPI ist nun am SCK sichtbar

oder das SCK im Ruhezustand high:
- PortB Bit 5 rücksetzen // PullUp abschalten
- DDRB Bit 5 rücksetzen  // damit wird der PullUp an SCK sichtbar
- warte deine benötigte Impulslänge ab
- DDRB Bit 5 setzen  // Signal der SPI ist nun am SCK sichtbar

So funktioniert das natürlich nur, wenn keine zusätzlichen externen 
PullUp oder PullDown Widerstände an SCK angeschlossen sind.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

1
SPCR &= ~(1 << SPE);
2
PORTB ^= (1 << 2);
3
PORTB ^= (1 << 2);
4
SPCR |= (1 << SPE);

Da das Ein- und Ausschalten des Spi sowohl dem Controller als auch dem 
Programmierer alles abverlangt, ist allerdings nachfolgende Lösung 
vorzuziehen:

Detlef Kunz schrieb:
> Im Datenblatt steht:
> SCK: Master Clock output, Slave Clock input pin for SPI channel. When
> the SPI is enabled as a
> Slave, this pin is configured as an input regardless of the setting of
> DDB5. When the SPI is
> enabled as a Master, the data direction of this pin is controlled by
> DDB5. When the pin is forced
> by the SPI to be an input, the pull-up can still be controlled by the
> PORTB5 bit.
>
> So könnte es also ohne Abschaltung der SPI gehen:
>
> Ich nehme mal an, das SCK im Ruhezustand low ist:
> - PortB Bit 5 setzen // Pull Up setzen
> - DDRB Bit 5 rücksetzen  // damit wird der PullUp an SCK sichtbar
> - warte deine benötigte Impulslänge ab
> - DDRB Bit 5 setzen  // Signal der SPI ist nun am SCK sichtbar
>
> oder das SCK im Ruhezustand high:
> - PortB Bit 5 rücksetzen // PullUp abschalten
> - DDRB Bit 5 rücksetzen  // damit wird der PullUp an SCK sichtbar
> - warte deine benötigte Impulslänge ab
> - DDRB Bit 5 setzen  // Signal der SPI ist nun am SCK sichtbar
>
> So funktioniert das natürlich nur, wenn keine zusätzlichen externen
> PullUp oder PullDown Widerstände an SCK angeschlossen sind.

mfg.

von Rolf Magnus (Gast)


Lesenswert?

Michael Mokricky schrieb:
> Nebenbei wisst ihr wieviel Zeit das Einschalten der SPI bis zur
> Betriebsbereitheit in Anspruch nimmt?

Ich weiß es zwar nicht, hätte aber geschätzt, daß es einen Taktzyklus 
dauert. Soviel, wie's halt braucht, das Register zu beschreiben. Was 
sollte denn deiner Meinung da irgendwelche Zeit verbrauchen?

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.