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


von Felix (Gast)


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?

von Falk (Gast)


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

von A.K. (Gast)


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.

von Branko Golubovic (Gast)


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

von Felix (Gast)


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.
1
 
2
unsigned char send_spi(unsigned char byte)
3
{
4
  DDRB=0xDF;
5
  USIDR=byte;
6
  USISR=(1<<USIOIF);
7
  do
8
    {USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);}
9
  while (!(USISR&(1<<USIOIF)));
10
  return USIDR;
11
}
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 ??? ;-)

von Falk (Gast)


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

von Felix (Gast)


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 ;-)

von ernst (Gast)


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 :-)

von Falk (Gast)


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

von Felix (Gast)


Lesenswert?

@ernst:

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

@Falk:

Schade,
aber trotzdem Danke auch an dich.

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.