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?
@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
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.
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
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 ??? ;-)
@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
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 ;-)
>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 :-)
@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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.