Forum: Mikrocontroller und Digitale Elektronik Attiny85 USI


von Georg (Gast)


Lesenswert?

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

von Georg (Gast)


Angehängte Dateien:

Lesenswert?

Habe jetzt doch noch etwas im Datenblatt gefunden. Das erklärt mein 
Problem.

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.