docHO
Joined: 15 Oct 2011 Posts: 1
|
Posted: Thu Jun 20, 2019 11:07 am Post subject: I2C-MULTI Problem mit ATMEGA328PB und MCP79410 |
|
|
Hallo,
wer kann helfen?
Wegen eines Adresskonflikts auf dem I2C Bus, habe ich eine Lösung mit dem ATMEGA328PB versucht, scheitere aber an dem I2C_TWI_MULTI.
Zunächst konfiguriere und initialisiere ich den I2C_TWI_MULTI - BUS (Bascom Beispiel):
$lib "I2C_TWI-MULTI.lib"
Config Scl = Portc.5 ' we need to provide the SCL pin name
Config Sda = Portc.4 ' we need to provide the SDA pin name
Config Sda1 = Porte.0 'use this for the second TWI
Config Scl1 = Porte.1
Config Twi = 400000
Config Twi1 = 400000
Dim _i2cchannel As Byte ' you MUST dim this variable yourself when using the above lib
I2cinit 'default TWI init
I2cinit Twi1 'optional TWI1 to init that interface
Nach Auswahl des jeweiligen Kanals mit _i2cchannel = 0 bzw. _i2cchannel = 1 werden alle Komponenten bis auf den Mcp79410 gefunden.
I2cstart
I2cwbyte I2C_address 'send address
I2cstop
If Err = 0 Then 'got ack
Print "OK "
Else
Print "ERROR "
End If
OK - M24m02_1 -- &B1010_0000 'an _i2cchannel = 1
OK - M24m02_2 = &B1010_1000 'an _i2cchannel = 1
ERROR -- Mcp79410 'an _i2cchannel = 0
ERROR -- Mcp79410eeprom 'an _i2cchannel = 0
OK - HT16K33 -- &B1110_0000 ''an _i2cchannel = 0
Das Umschalten zwischen den I2C Kanälen funktioniert offensichtlich, nur der MCP79410 wird nicht gefunden.
Zur Überprüfung der Verdrahtung und der Hardware habe ich mittels Software I2C die verschiedenen I2C – Bausteine separat angesprochen:
'****** I²C bus *******
'ONLY I2C hardware BUS $lib "I2C_TWI.Lbx"
Config Sda = Portc.4
Config Scl = Portc.5
Config Twi = 400000
I2cinit
'********
I2cstart
I2cwbyte I2C_address 'send address
I2cstop
If Err = 0 Then 'got ack
Print "OK "
Else
Print "ERROR "
End If
Das funktioniert ohne Probleme, die Komponenten an C.4 / C.5 antworten mit ACK
OK -- Mcp79410 -- &B1101_1110
OK -- Mcp79410eeprom -- &B1010_1110
OK -- HT16K33 -- &B1110_0000
Aktiviere ich aber die Hardware I2C ($lib "I2C_TWI.lbx), dann erhalte ich nur noch von dem HT16K33 ein ACK, der RTC Baustein meldet sich nicht mehr.
Starte ich den gleichen Versuch mit dem zweiten Software I2C an E.0 / E.1, dann antworten wie erwartet die Speicherbausteine M24M02-DR.
OK - M24m02_1 -- &B1010_0000
OK - M24m02_2 = &B1010_1000
Zusammenfassend gesagt:
Immer wenn mittels der entsprechenden .lbx auf HARDWARE I2C umgeschaltet wird, funktioniert der MCP79410 nicht mehr.
Um den üblichen Rückfragen vorzubeugen:
Nein, der Chip ist nicht defekt, ich habe zwei Exemplare probiert, das Problem bleibt bestehen.
Nein, es wurden keine pull up Widerstände (4K7) vergessen.
Nein, die Busgeschwindigkeit ist nicht zu hoch, ich habe auch Config Twi = 100000 probiert.
Nein, die Leitungslänge ist nicht zu lang, sondern eher kurz, wobei der HT16K33 am weitesten entfernt ist, der MCP7941 sitzt nur etwa 3 cm vom Atmega entfernt.
Der AtmegA328PB läuft mit dem internen Oszillator mit 8 Mhz.
Eigentlich würde ich das Problem bei dem MCP79410 suchen, aber dieser funktioniert mit SOFTWARE I2C problemlos.
Mein Gedanke ist nun, dass das Timing des HARDWARE I2C irgendwie kritisch ist.
Mir steht momentan kein Oszi zur Verfügung, bei Gelegenheit werde ich aber versuchen das Timing zu überprüfen.
Hat jemand eine Idee? Mache ich irgendwo einen (Denk-) Fehler.
Kann man in der .lbx irgend etwas ändern?
Kann man in den Registern des Atmega328PB irgendetwas anpassen?
Vielen Dank für eure Mühe und das Gehirnschmalz
(BASCOM-AVR version : 2.0.8.1 ) |
|