Forum: Mikrocontroller und Digitale Elektronik arduino I2C abschalten


von Peter B. (pbw)


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?

: Bearbeitet durch User
von Stefan S. (sschultewolter)


Lesenswert?

Wenn I2C nicht in der setup eingestellt wird, sind die Pins frei zur 
Verfügung. Hardware SPI geht über die Schnittstelle nicht.

von holger (Gast)


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.

von Peter B. (pbw)


Lesenswert?

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

von holger (Gast)


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.

von M. P. (phpmysqlfreak)


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

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Peter Bochow schrieb:
> Hallo Gemeinde,
> ich möchte die Hardware-I2C auschalten um über die Pins noch einen
> SPI-Schaltkreis anzusteuern.

??? wenn du keinen I2C Schaltkreis dran hast und <wire.h> nicht lädts 
sind die A4 und A5 doch normale Ports.

von Peter B. (pbw)


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.

von Joachim B. (jar)


Lesenswert?

Peter Bochow schrieb:
> 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.

Klasse dann verrate doch mal wie, könnte andere hier auch interessieren.

Das ist ein Forum mit Austausch und keine Einbahnstrasse.

von Fragezeichen (Gast)


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.

von Joachim B. (jar)


Lesenswert?

Fragezeichen schrieb:
> Man könnte ja auch einen dieser Pegelwandler für I2C nehmen,

oder einen Analog Multiplexer der umschaltet (CD/HEF 4053) und bei SPI 
mit den Signalen CS/SS die I2C einfach trennt.

: Bearbeitet durch User
von M. P. (phpmysqlfreak)


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

von Peter B. (pbw)


Angehängte Dateien:

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
}

von Joachim B. (jar)


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.

von Paddy (Gast)


Lesenswert?

Mehr informationen ueber spi/i2c :

http://www.i2cchip.com/mix_spi_i2c.html

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.