[AVR] USI I2C Slave - USI_START_VECTOR busy wait.

OP (Firma: esolutions GmbH) #4022165
Hallo,

ich implementiere gerade einen I2C Slave (USI) und weil ich das Rad 
nicht neu erfinden will, habe ich mir die

AVR312 - Using the USI module as a I2C slave

heruntergeladen.

Im Interrupt USI_START_VECTOR macht Atmel einen busy wait:
1
#pragma vector=USI_START_VECTOR
2
__interrupt void USI_Start_Condition_ISR(void)
3
{
4
    unsigned char tmpUSISR;                                         // Temporary variable to store volatile
5
    tmpUSISR = USISR;                                               // Not necessary, but prevents warnings
6
// Set default starting conditions for new TWI package
7
    USI_TWI_Overflow_State = USI_SLAVE_CHECK_ADDRESS;
8
    DDR_USI  &= ~(1<<PORT_USI_SDA);                                 // Set SDA as input
9

10
    // -----------------------------------
11
    // BUSY - WAIT im Interrupt 
12
    while ( (PIN_USI & (1<<PORT_USI_SCL)) & !(tmpUSISR & (1<<USIPF)) );
13
    // Wait for SCL to go low to ensure the "Start Condition" has completed.
14
    // -----------------------------------
15
                                                                       // If a Stop condition arises then leave the interrupt to prevent waiting forever.
16
    USICR   =   (1<<USISIE)|(1<<USIOIE)|                            // Enable Overflow and Start Condition Interrupt. (Keep StartCondInt to detect RESTART)
17
                (1<<USIWM1)|(1<<USIWM0)|                            // Set USI in Two-wire mode.
18
                (1<<USICS1)|(0<<USICS0)|(0<<USICLK)|                // Shift Register Clock Source = External, positive edge
19
                (0<<USITC);
20
    USISR  =    (1<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      // Clear flags
21
                (0x0<<USICNT0);                                     // Set USI to sample 8 bits i.e. count 16 external pin toggles.
22
}

Wenn ich mich da nicht täusche, dann verstöst das gegen die Haager 
Landkriegsordnung....

Im Notfall, wenn es keine bessere Lösung gibt, dann müsste man noch 
einen Interrupt auf diesen Flankenwechsel implementieren...

Oder hat jemand eine bessere Idee? Und/Oder vielleicht eine Lösung?

Schöne Grüße
Jens Riebold
#4022167
Jens Riebold schrieb:
> Wenn ich mich da nicht täusche, dann verstöst das gegen die Haager
> Landkriegsordnung....

Nur wenn man päpstlicher als der Papst sein will, oder neben dem USI 
andere sehr zeitkritische Interrupts hat.

Es gibt mit den 14-Pin ATtiny441/841 mittlerweile Tinys, die einen 
vollständigen I2C-Slave enthalten. Nicht so eine Krücke wie das USI. 
Entspricht dem TWI der Xmegas, auf reinen Slave reduziert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.