CLK des SPI beim AVR beeinflussen

Gast #2687691
Lesenswert?

Hallo!
Ich moechte das Audio-Modul SOMO-14D ansteuern. Dies kommuniert über 
eine einfache serielle Schnittstelle, sie verlangt nach CLK und DATA. 
Ich moechte diese gern über die SPI des At2560 ansteuern, jedoch 
verlangt das Modul als Startkennung, dass CLK für gewisse, kurze Zeit 
auf high- bzw low liegt.

Daher Frage: kann ich bei aktivierter SPI den Pegel von CLK noch 
beeinflussen?
Gast #2687873
Lesenswert?

>Daher Frage: kann ich bei aktivierter SPI den Pegel von CLK noch
>beeinflussen?

Du kannst wann immer du willst das SPI Modul wieder
abschalten und dann CLK als IO Pin benutzen.
Danach SPI wieder einschalten. Wo ist das Problem?
Gast #2687970
Lesenswert?

>Daher Frage: kann ich bei aktivierter SPI den Pegel von CLK noch
>beeinflussen?

Kommt drauf an, was Du unter "aktiviert" verstehst.
Der Takt legt erst los, wenn es irgendwas zu senden gibt,
d.h. etwas in das TX-Datenregister geschrieben, nicht
dann wenn /CS aktiv gemacht wurde.

Bei den meisten (allen?) SPIs kann die CLK-Phase und Inaktiv-Polarität 
konfiguriert werden.
Gast #2687982
Lesenswert?

>>Du kannst wann immer du willst das SPI Modul wieder
>>abschalten und dann CLK als IO Pin benutzen.
>>Danach SPI wieder einschalten.

>Ich find das irgendwie unelegant.
>Ist denn das der einzige Weg?

Was ist daran unelegant?
Das sind 10 Zeilen Code.

Kommen wir halt darauf zurück:

>Daher Frage: kann ich bei aktivierter SPI den Pegel von CLK noch
>beeinflussen?

Du kannst evtl. die SPI Frequenz so weit runter drehen
das das mit deinem Timing passt. Dann schreibst du einmal
0x01 ins SPDR und auf CLK kommen 8 Pulse. Möchte dein Modul das?
Wenn nein beginne wieder bei Null. SPI Modul abschalten........
Gast #2688009
Lesenswert?

holger schrieb:
> Wenn ich mir das Datenblatt mit den Timings so ansehe
> würde ich mir das mit dem SPI Modul sparen.
> Das ist mit simplem Pin wackeln in 10 Minuten programmiert.
>
>
>
>     Beitrag melden | Bearbeiten | Löschen |

Gerade, weil im Datenblatt ausschließlich Min- und keine Max- Zeiten 
vorgegeben sind, hielt ich das gerade für einfach (aussehend).
Ich habe mich auch schon daran versucht, die Steuerung per Pinwackeln zu 
realisieren aber ich habe keine (kompakte) Funktion hinbekommen, 
stattdessen bin ich über gigantische switch-Verzweigungen verzweifelt.

Vielleicht ein guter neuer Ansatz:
Wie müsste eine Funktion aussehen, die ein uint_8 übergeben bekommt und 
nach jedem Takt (CLK-Pinwackeln) den DATA-Pin gemäß übergebenem Wert 
wackelt?
Bin gespannt..
Gast #2688015
Lesenswert?

//////////////////////////////////////////////////////////////////////// 
//////
//////////////////////////////////////////////////////////////////////// 
//////
void SoftSPIWriteSlow(uint8_t data)
{
  uint8_t mask = 0x80;

  while(mask)
  {
    if(data & mask) { SPI_MOSI_HI; }
    else            { SPI_MOSI_LOW; }

    SPI_SCK_HI;
    _delay_us(2);
    SPI_SCK_LOW;
    _delay_us(2);

    mask >>= 1;
  }
}

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