Forum: Mikrocontroller und Digitale Elektronik USI Interface als SPI Schnittstelle beim ATtiny261A


von Martin G. (magoe)


Angehängte Dateien:

Lesenswert?

Hallo liebe Controllerfreunde,

ich sizte gerade vo dem Problem, dass die Kommunikation über das 
USI-Interface einfach nicht klappen will. Alle denkbaren 
Konfigurationsmethoden aus dem Datenblatt hab ich schon durch. Vielleich 
kann mir von euch aber einer weiter helfen.
Das Ergebnis meines Werkes ist an Hand des Bildes im Anhang am besten zu 
sehen. (v.o.n.u. SCK, SDI, SDO, CS)

Ich habe alle nötigen Ausgänge konfiguriert:
1
  DDRB  |= (1<<CS)|(1<<SCK)|(0<<SDI);  // Ausgang
2
  DDRB  &= ~(1<<SDO);  // Eingang
3
  PORTB |= (1<<SDO);  // Pull-up

Ich habe den Timer0 im CTC-Mode initialisiert um den Takt für das 
USI-Interface zu generieren:
1
  TCCR0A = 0b00000001;      // CTC-Mode
2
  TCCR0B = (0<<CS01)|(1<<CS00);  // Vorteriler 0
3
  OCR0A = 100; // rund XXX kHz
4
  TIMSK = 0;
5
  
6
  ...
7
  TIMSK |= (1<<OCIE0A);    // Timer0 AN
8
9
  ...
10
ISR (TIMER0_COMPA_vect)
11
{
12
   USICR |= (1<<USITC);    // Takt-Pin toggeln
13
}

Und ich nutze die folgende Senderoutine:
1
while(1)
2
{
3
   PORTB &= ~(1<<CS);  // CS
4
         
5
   (void)SPITransfer(0x80 | 0x55);
6
   output = SPITransfer(0);
7
8
   PORTB |= (1<<CS);      // Chipselect zurücksetzen  
9
   _delay_ms(25);
10
}
11
12
static uint8_t SPITransfer(uint8_t d)
13
{
14
    USIDR = d;
15
    USISR = (1<<USIOIF);
16
    do {
17
         USICR = (1<<USIWM0)|(0<<USICS1)|(1<<USICS0)|(0<<USICLK);
18
       } while ((USISR & (1<<USIOIF)) == 0);  
19
    return USIDR;
20
}

Danke schon mal für eure Hilfe!

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe den Timer0 im CTC-Mode initialisiert um den Takt für das
>USI-Interface zu generieren:

Wozu. Die USI erzeugt ihren eigenen Takt.

AppNote zu dem Thema:

http://www.atmel.com/Images/doc2582.pdf
http://www.atmel.com/Images/AVR319.zip

MfG Spess

von Martin G. (magoe)


Lesenswert?

> Wozu. Die USI erzeugt ihren eigenen Takt.

Hallo Spess,

ich wollte den Takt durch den Timer erzeugen, da ich ihn dadurch besser 
einstellen kann, da ich noch nicht weiß, welche Geschwindigkeit der 
Speicherbaustein der als Slave dran hängen soll schafft.

Die Appnote für das USI-Interface und die Codebeispiele hab ich mir 
schon angesehen. Halfen mir aber halt irgendwie nicht weiter, da 
nirgends darauf eingegangen wird, wie das mit einem externen Takt durch 
Timer0 aussieht.

LG

von spess53 (Gast)


Lesenswert?

Hi

>Halfen mir aber halt irgendwie nicht weiter, da
>nirgends darauf eingegangen wird, wie das mit einem externen Takt durch
>Timer0 aussieht.

Verstehe ich jetzt nicht. Die Software in der Zip-Datei beruht doch auf 
der Verwendung des Timers.

MfG Spess

von Martin G. (magoe)


Angehängte Dateien:

Lesenswert?

Hallo Spess,

das hab ich wohl verwechselt. Die Portierung des sehr alten Codes 
brachte keinen Erfolg, deshalb habe ich mich selbst ans Werk gemacht. 
Ich habe das nochmal geflasht un ein Bild gemacht. Meine Portierung 
stell ich mal mit zur Verfügung.

LG

von spess53 (Gast)


Lesenswert?

Hi

>#define USI_DATAIN_PIN   PB1   //!< USI data input pin.
>#define USI_DATAOUT_PIN  PB0   //!< USI data output pin.

Das ist genau umgedreht. PB1 ist Ausgang und PB0 Eingang.

MfG Spess

von Martin G. (magoe)


Lesenswert?

>>#define USI_DATAIN_PIN   PB1   //!< USI data input pin.
>>#define USI_DATAOUT_PIN  PB0   //!< USI data output pin.
>
>Das ist genau umgedreht. PB1 ist Ausgang und PB0 Eingang.

Hallo

genau das war der Fehler! Ich hab mich nach den Bezeichnungen MISO und 
MOSI auf Seite 2 des Datenblatts gerichtet, da diese ja eigentlich die 
Datenrichtung für SPI angeben.

Vielen Dank dir für deine Hilfe!
LG

von spess53 (Gast)


Lesenswert?

Hi

>Ich hab mich nach den Bezeichnungen MISO und
>MOSI auf Seite 2 des Datenblatts gerichtet, da diese ja eigentlich die
>Datenrichtung für SPI angeben.

Das hat aber in diesem Fall nichts mit SPI zu tun. MOSI und MISO gehören 
in dem Fall zum ISP.

MfG Spess

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.