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
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