www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USI-->Clock Polarity


Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich würde gerne die USI-Schnittstelle vom ATtiny2313 als SPI-Master 
nutzen, habe aber das Problem, das mein Slave immer eine fallende Flanke 
an der Clockleitung erwartet um Daten des aktuellen Bits zu übernehmen. 
Ich weiß das es bei einer richtigen SPI ein Bit (CPOL: Clock Polarity) 
im Statusregister gibt, durch dessen setzen man die Clockleitung 
invertieren kann.
Hat vielleicht einer von euch ne Idee, wie ich bei der USI des 
ATtiny2313 die CLockleitung invertieren kann?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Felix

>Hat vielleicht einer von euch ne Idee, wie ich bei der USI des
>ATtiny2313 die CLockleitung invertieren kann?

Entweder durch Hardware (Inverter, 74HC04) oder Software (SPI in 
Software).

MFG
Falk

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
USI als SPI-Master macht ja recht wenig mit dem Takt selber, das ist 
weitgehend der Job des Programmierers. Und so macht es auch kaum einen 
Unterschied, ob man einen SPI-Master nun per USI oder komplett "zu Fuss" 
implementiert.

USI ist vor allem interessant bei SPI-Slave und TWI-Slave.

Autor: Branko Golubovic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Felix,

Im Datenblatt seite 151 steht:

"Three-wire mode. Uses DO, DI, and USCK pins...
The Data Input (DI) and Serial Clock (USCK) pins do not affect the
normal port operation. When operating as master, clock pulses are
software generated by toggling the PORT Register, while the data
direction is set to output. The USITC bit in the USICR Register can be
used for this purpose."

Branko

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Danke erstmal für die schnellen Antworten.
Ich poste euch einfach mal den wichtigen Teil meines Quelltextes, dann 
könnte ihr mir ja vieleicht helfen, was noch abzuändern ist.
 
unsigned char send_spi(unsigned char byte)
{
  DDRB=0xDF;
  USIDR=byte;
  USISR=(1<<USIOIF);
  do
    {USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);}
  while (!(USISR&(1<<USIOIF)));
  return USIDR;
}
Das Problem ist, das der controller das Bit nun immer bei einem toggle 
von hi nach low übers Schieberegister rausschiebt (also genau in dem 
moment der Flanke von der Clock toggelt auch das Bit)  und dann liegt es 
an der Datenleitung wärend des hi low Übergangs von der Clockleitung an.
-,__,--,__,--,__,-- CLK
_,-----,_____,----- DO (MOSI)

Und ich brauch es halt genau invertiert.
Was kann ich denn in dem Code ändern, damit dies klapt? Ich hab 
überlegt, die Clockleitung mit USITC schon vor der schleife zu toggeln, 
aber dan schiebt er mir ja auch gleich da erste bit raus (vielleicht 
hilft es ja das toggeln vor dem setzen des USIOIF bits zu tun, oder wird 
es dadurch wieder zurückgesetzt?). Auch hab ich schon mal versucht den 
Clock-Pin vorher mit PORTB=128 high zu setzten, das das erste toggeln 
automatisch von high nach low geht, das klappt aber auch nett so recht.
Leute, was mache ich nur wieder falsch ??? ;-)

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Felix

>Leute, was mache ich nur wieder falsch ??? ;-)

Gar nix, das USI vom 2313 ist ein Kastrat mit eher beschränkten 
Fähigkeiten. Mach die SPI in Software und alles ist paletti. Das ist nur 
minimal langsamer.

MFG
Falk

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Falk,
dass beruhigt mich sehr. Hast du vieleicht noch nin Tip, wo ich ein 
Beispiel für solch eine Routine finde?
Sicherlich ist es eigentlich auch kein grosses Ding, sowas selber zu 
schreiben, müssten ja eigentlich nur zwei ineinande verschachtelte For 
schleifen sein, wenn ich da jetzt richtig liege. Aber der Teufel steckt 
ja bekanntlich im Detail, und weil ich mich grad in diesen Dingen ganz 
besonders dusselig anstelle, ist es bestimmt besser, wenn ich mir mal 
sowas vorher ansehe, befor ich weider wie wild drauflosprogrammiere ;-)

Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leute, was mache ich nur wieder falsch ??? ;-)
ich denke so:
du setzt usiclk + usitc gleichzeitig:
(also genau in dem
moment der Flanke von der Clock toggelt auch das Bit)
setze erst nur usiclk, im nächsten befehl nur usitc.
dann schiebt er erst die daten raus, danach toggelt der pin
mit usitc :-)

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Felix

>dass beruhigt mich sehr. Hast du vieleicht noch nin Tip, wo ich ein
>Beispiel für solch eine Routine finde?

Hab ich leider nicht.

MfG
Falk

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ernst:

Danke Ernst,
ich werde gleich in den Keller rennen und es ausprobieren
:-)

@Falk:

Schade,
aber trotzdem Danke auch an dich.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.