Attiny85 USI

Gast #5824254
Hallo zusammen,

habe in diesem Thread: Beitrag "attiny USI Slave Implementierung" einen 
Beispielcode gefunden, der mit einem Attiny mittels USI einen I2C-Slave 
implementiert.

Der Code ist hier zu finden: 
https://www.mikrocontroller.net/attachment/highlight/12871

Habe den Code für einen Attiny85 angepasst und es funktioniert auch 
alles wie es soll. Jedoch habe ich eine Frage zum Verständnis:

In Code aus dem Link oben steht folgendes:
1
switch(COMM_STATUS) {
2
  case NONE:
3
    if (((BUF_USI_DATA & 0xfe) >> 1) != USI_ADDRESS) {  // if not receiving my address
4
      // disable USI interrupt on overflow; disable SCL low on overflow
5
      USI_CONTROL &= ~((1<<USIOIE) | (1<<USIWM0));
6
    }
7
    else { // else address is mine
8
      DDR_USI  |=  (1<<PORT_USI_SDA);
9
      USI_STATUS = 0x0e;  // reload counter for ACK, (SCL) high and back low
10
      if (BUF_USI_DATA & 0x01) COMM_STATUS = ACK_PR_TX; else COMM_STATUS = ACK_PR_RX;
11
    }
12
    break;
13
  case ACK_PR_RX:
14
    DDR_USI  &= ~(1<<PORT_USI_SDA);
15
    COMM_STATUS = BYTE_RX;
16
    break;
17
  case BYTE_RX:
18
    /* Save received byte here! ... = USI_DATA*/
19
    DDR_USI  |=  (1<<PORT_USI_SDA);
20
    USI_STATUS = 0x0e;  // reload counter for ACK, (SCL) high and back low
21
    COMM_STATUS = ACK_PR_RX;
22
    break;
23
  case ACK_PR_TX:
24
    /* Put first byte to transmit in buffer here! USI_DATA = ... */
25
    PORT_USI |=  (1<<PORT_USI_SDA); // transparent for shifting data out
26
    COMM_STATUS = BYTE_TX;
27
    break;
28
  case PR_ACK_TX:
29
    if(BUF_USI_DATA & 0x01) {
30
      COMM_STATUS = NONE; // no ACK from master --> no more bytes to send
31
    }
32
    else {
33
      /* Put next byte to transmit in buffer here! USI_DATA = ... */
34
      PORT_USI |=  (1<<PORT_USI_SDA); // transparent for shifting data out
35
      DDR_USI  |=  (1<<PORT_USI_SDA);
36
      COMM_STATUS = BYTE_TX;
37
    }
38
    break;
39
  case BYTE_TX:
40
    DDR_USI  &= ~(1<<PORT_USI_SDA);
41
    PORT_USI &= ~(1<<PORT_USI_SDA);
42
    USI_STATUS = 0x0e;  // reload counter for ACK, (SCL) high and back low
43
    COMM_STATUS = PR_ACK_TX;
44
    break;
45
  }

Ich verstehe nun nicht ganz, was im case
1
case ACK_PR_TX:
 die Zeile
1
PORT_USI |=  (1<<PORT_USI_SDA); // transparent for shifting data out
 macht. Handelt es sich dabei einfach um das Einstellen eines 
High-Pegels am Pin SDA, oder hat das in diesem Zusammenhang (USI) eine 
andere Bedeutung? Ich frage deshalb, weil der Autor des Codes auch den 
Kommentar "transparent for shifting data out" dahinter geschrieben hat. 
Was hat es damit auf sich? Konnte im Datenblatt keinen entsprechenden 
Hinweis finden....

Über irgendwelche Tipps wäre ich sehr dankbar!

Viele Grüße
Georg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 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.