I2C/TWI Datenübertragung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datenübertragung über I2C/TWI zwischen zwei AVR Variante 1
    Nachdem ich schon Forum die Möglichkeit der Datenübertragung zwischen zwei AVR über TWI gezeigt habe möchte ich es hier noch mal zusammenfassend zeigen.

    Es gibt zwei Varianten der Verbindung zwischen zwei AVR über TWI.
    Die erste ist die mit der kauf LIB von MCS für derzeit 14,95 Euro.
    Diese LIB benötigt man hauptsächlich für AVR-Typen die kein Hardware TWI haben. In dem Download sind folgende Dateien enthalten

    - i2cslave.lib (für AVR ohne TWI)
    - i2c_twi-slave (für AVR mit TWI)
    - i2c_twi-slave-acknack (für AVR mit TWI)
    - xmega-twi-slave (für XMEGA)
    - I2C_USI_SLAVE.LIB (für AVR mit USI)

    Über diese LIB lässt sich der TWI-Bus relativ einfach aufbauen.

    Mit

    BASCOM-Quellcode

    1. $lib "i2c_twi-slave.lbx" 'Für Hardware TWI
    2. Config Twislave = &H70 , Btr = 2 , Bitrate = 100000
    3. Enable Interrupts
    lässt sich ein AVR zum TWI Slave machen. &H70 ist dabei die Slave-Adresse, Btr = 2 die Anzahl an Byte die vom Master gelesen werden, Bitrate = 100000 ist die Busfrequenz (100KHz).

    Die LIB erfordert noch einige Unterprogramme im Slave für die Übertragung

    BASCOM-Quellcode

    1. Twi_stop_rstart_received:
    2. 'wird angespungen wenn der Master ein STOP oder REPSTART sendet
    3. Return
    4. Twi_addressed_goread:
    5. 'Der Slave wurde adressiert und der Master will Daten lesen
    6. Return
    7. Twi_addressed_gowrite:
    8. 'Der Slave wurde adressiert und der Master will Daten schreiben
    9. Return
    10. Twi_gotdata:
    11. 'Daten empfangen
    12. Return
    13. Twi_master_needs_byte:
    14. 'Der Master benötigt Daten
    15. Return
    16. Twi_master_need_nomore_byte:
    17. 'Der Master benötigt keine Daten mehr
    18. Return
    Alles anzeigen

    Über die LIB werden auch einige Variablen zur Verfügung gestellt. Diese sind folgende:
    - Twi_btw ist ein Zähler der nach jedem I2cwbyte um eins erhöht und mit I2cstop zurück gesetzt wird.
    - Twi_btr wird nach jedem I2crbyte um eins erhöht.
    - Twi ist eine Variable in der dann die Daten nach jedem I2cwbyte/[b]I2crbyte zur Verfügung stehen.
    Bei I2crbyte muss der Variablen Twi ein Wert übergeben werden z.B. Twi = 25.

    Hier mal ein Beispiel-Code für den Slave

    BASCOM-Quellcode

    1. 'I2C Slave
    2. 'Test von I2C/TWI mit ATMega8
    3. $regfile = "m8def.dat"
    4. $crystal = 8000000
    5. $hwstack = 64
    6. $swstack = 64
    7. $framesize = 64
    8. $lib "i2c_twi-slave.lbx" 'Für Hardware TWI
    9. Config Twislave = &H70 , Btr = 2 , Bitrate = 100000
    10. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
    11. Config Lcd = 16 * 2
    12. Enable Interrupts
    13. Dim Befehl As Byte , Wert As Byte
    14. Cursor Off
    15. Cls
    16. Do
    17. Loop
    18. End
    19. Twi_stop_rstart_received:
    20. Return
    21. Twi_addressed_goread:
    22. Return
    23. Twi_addressed_gowrite:
    24. Return
    25. Twi_gotdata:
    26. Select Case Twi_btw
    27. Case 1 : Befehl = Twi
    28. Case 2 : Wert = Twi
    29. End Select
    30. Select Case Befehl
    31. Case 0 :
    32. 'Begrüßung
    33. Locate 1 , 1
    34. Lcd " I2C Slave Test "
    35. Locate 2 , 1
    36. Lcd " Bascomforum.de "
    37. Case 1 :
    38. 'Befehl 1 mit drei Werten
    39. Locate 1 , 1
    40. Lcd "Befehl " ; Befehl ; " "
    41. Select Case Wert
    42. Case 0 :
    43. Locate 2 , 1
    44. Lcd "Wert " ; Wert ; " "
    45. Case 1 :
    46. Locate 2 , 1
    47. Lcd "Wert " ; Wert ; " "
    48. Case 2 :
    49. Locate 2 , 1
    50. Lcd "Wert " ; Wert ; " "
    51. End Select
    52. Case 2 : Cls
    53. End Select
    54. Return
    55. Twi_master_needs_byte:
    56. Return
    57. Twi_master_need_nomore_byte:
    58. Return
    Alles anzeigen

    Der Master wird bei dieser Variante wie bei jeder anderen I2C Verbindung konfiguriert.

    Beispiel-Code für den Master

    BASCOM-Quellcode

    1. 'I2C Master
    2. 'Test von I2C/TWI mit ATMega8
    3. $regfile = "m8def.dat"
    4. $crystal = 8000000
    5. $hwstack = 64
    6. $swstack = 64
    7. $framesize = 64
    8. $lib "i2c_twi.lbx" 'Für Hardware TWI
    9. Config Scl = Portc.5
    10. Config Sda = Portc.4
    11. Config Twi = 100000
    12. Dim Befehl As Byte , Wert As Byte
    13. I2cinit
    14. Do
    15. 'Begrüßung
    16. Befehl = 0
    17. Wert = 0
    18. Gosub Sende_twi_daten
    19. Wait 2
    20. 'Befehl 1 mit Wert 0
    21. Befehl = 1
    22. Wert = 0
    23. Gosub Sende_twi_daten
    24. Wait 2
    25. Befehl = 1
    26. Wert = 1
    27. Gosub Sende_twi_daten
    28. Wait 2
    29. Befehl = 1
    30. Wert = 2
    31. Gosub Sende_twi_daten
    32. Wait 2
    33. 'Display löschen
    34. Befehl = 2
    35. Wert = 0
    36. Gosub Sende_twi_daten
    37. Wait 5
    38. Loop
    39. End
    40. Sende_twi_daten:
    41. I2cstart
    42. I2cwbyte &H70 'Slave Adresse
    43. I2cwbyte Befehl
    44. I2cwbyte Wert
    45. I2cstop
    46. Return
    47. 'Ende
    Alles anzeigen

    172 mal gelesen