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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.