arduino I2C abschalten

OP #4108203
Lesenswert?

Hallo Gemeinde,
ich möchte die Hardware-I2C auschalten um über die Pins noch einen 
SPI-Schaltkreis anzusteuern.Die I2C Pins am Arduino pro mini sind A4 und 
A5.
Jetz habe ich softwaremässig eine SPI auf die gleichen Pins gelegt,mit 
dem Erfolg das SPI nur geht wenn I2C nicht intalisiert ist.Wie kann ich 
I2C abschalten?
Gast #4108240
Lesenswert?

>ich möchte die Hardware-I2C auschalten um über die Pins noch einen
>SPI-Schaltkreis anzusteuern.Die I2C Pins am Arduino pro mini sind A4 und

Das ist eine schlechte Idee. Es mag ja noch sein das I2C dein
SPI nicht stört solange CS high ist. Die Frage ist was deine
I2C slaves zum SPI auf SDA, SCL sagen. Ich würde das sein lassen.
Gast #4108249
Lesenswert?

>Die Slaves tun nichts solange ihre Adresse nicht erscheint.Spanungen
>sind ja die selben.

Und wer sagt dir das im SPI Datenstrom nicht willenlos
Start, Stop und auch deine Slaveadresse auftauchen?
Das wird nix.
#4108252
Lesenswert?

Peter Bochow schrieb:
> Hallo
> Die Slaves tun nichts solange ihre Adresse nicht erscheint.Spanungen
> sind ja die selben.

Ich kenne gerade die Spec für I2C nicht ausreichend, aber was passiert, 
wenn die "Adresse" zu schnell rein kommt, und Clock-Stretching 
zuschlägt?
Einer zieht aktiv auf LOW, der andere aktiv auf HIGH - und nun?

Ich würde eventuell einfach eine weitere /CS nehmen, und bei der 
Hardware-SPI bleiben. - Oder wenn es unbedingt sein muss, die evtl. 
vorhandenen I2C -Slaves komplett trennen.

Das Abschalten des TWI-Interfaces kann man auch direkt mit einem 
Registerzugriff erledigen, entsprechend des Datenblattes vom verbauten 
Controller (Atmega328?).

Edit: Danke holger, daran dachte ich gerade nicht. ACK
OP #4108741
Lesenswert?

Marcel Papst schrieb:

> Das Abschalten des TWI-Interfaces kann man auch direkt mit einem
> Registerzugriff erledigen, entsprechend des Datenblattes vom verbauten
> Controller (Atmega328?).
>
Das habe ich gesucht.Mein doppeltes Interface funktioniert nun.Ein IC 
mit I2C und ein IC mit SPI an den beiden selben Leitungen plus /CS bei 
SPI.
an Holger Die Datenformate sind so unterschiedlich das ich da keine 
Sorge habe.
Vielen Dank an alle.
Gast #4109032
Lesenswert?

Man könnte ja auch einen dieser Pegelwandler für I2C nehmen, welchen man 
einseitig disablen kann. Somit wäre I2C-Bus im SPI-Betrieb abtrennbar 
und den SPI stört das gedudel ohne den passenden CS eh nicht.
#4109416
Lesenswert?

Peter Bochow schrieb:
> Marcel Papst schrieb:
>> Das Abschalten des TWI-Interfaces kann man auch direkt mit einem
>> Registerzugriff erledigen, entsprechend des Datenblattes vom verbauten
>> Controller (Atmega328?).
>>
> Das habe ich gesucht.Mein doppeltes Interface funktioniert nun.Ein IC
> mit I2C und ein IC mit SPI an den beiden selben Leitungen plus /CS bei
> SPI.

Um Folgefehler - je nach Umsetzung des Tipps - zu vermeiden, hoffe ich, 
dass du den Inhalt des TWCR sicherst, deine SPI-Routine arbeiten lässt, 
und anschließend das TWCR wieder zurücksetzt. - Nicht, dass es im 
nächsten Thread heißt, I2C funktioniert nicht mehr.

Am besten wäre, dass du mal über den Code schauen lässt, sodass wir den 
entsprechenden Teil mal nachvollziehen können. OT: Aber kurz vorweg:
Manchen Leuten hier kann man es nicht recht machen, sodass der Code von 
denen eventuell zerrissen wird. - Aber das hast du vielleicht auch schon 
gemerkt. /OT
OP #4109479
Lesenswert?

Hallo,
Ich habe die Library TWI und WIRE aus der Adruino IDE modifiziert,so 
habe ich jetzt Zugiff auf das Register TWCR über die WIRE Bibliotek
1
WIRE-library:
2
 //ausschalten des Buses um andere Sachen mit den Ports zu machen   
3
void TwoWire::TWIreleaseBus() 
4
{
5
   twi_releaseBus() ; 
6
}
7
//einschalten des Buses    
8
void TwoWire::TWIenableBus() 
9
{
10
 twi_enableBus() ; 
11
}
12

13
TWI-library:
14
* 
15
 * Function twi_releaseBus
16
 * Desc     releases bus control
17
 * Input    none
18
 * Output   none
19
 */
20
void twi_releaseBus(void)
21
{
22
  // release bus
23
  TWCR = _BV(~TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);
24

25
  // update twi state
26
  twi_state = TWI_READY;
27
}
28

29
void twi_enableBus(void)
30
{
31
  // release bus
32
  TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);
33

34
  // update twi state
35
  twi_state = TWI_READY;
36
}
Angehängte Dateien:
#4109761
Lesenswert?

Peter Bochow schrieb:
> Ich habe die Library TWI und WIRE aus der Adruino IDE modifiziert,

wieso das denn?

du kannst doch selber die Register lesen und schreiben....

Ich hatte mal eine zeitlang wire.h und die Fleury Lib zusammen genutzt, 
war aber doppel moppel
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

deswegen du hast auch trotz der wire.h vollen Zugriff auf die Register.

Ich lese im Interrupt (10ms) an einem I2C LCD Port Tasten ( bis zu 8) 
aus um Ports zu sparen, evtl. I2C stretching 100-200µs stört mich alle 
10ms nicht.

Nur für gleichzeitige IRMP Abfrage muss ich den IRQ wieder im Interrupt 
freigeben.

Funktionsweise:

alle 64µs IRQ, IRMP Abfrage, Zähler zählt hoch bis 10ms gibt den IRQ 
wegen I2C stretching 100-200µs frei um keinen IR zu verlieren und fragt 
die I2C Tastatur ab.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren