Forum: Mikrocontroller und Digitale Elektronik I2C Kabelverbindung unterbrechen und resume


von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Hallo,

ich habe ein zusätzliches Display (TWI Basiert) an meinem Board.
Nun möchte ich dieses im Betrieb abziehen und wieder anstecken können 
ohne den Atmega 16 in einen deadlock zu befördern.

Ist meine folgende Abänderung der Lib eine vernünftige Lösung, oder 
sollte man das anders lösen?
1
void I2C_WriteByte(uint8_t busAddr, uint8_t data) {
2
  uint8_t error = i2c_start(busAddr); // send bus address
3
  if (error) {//Own snipped
4
    scanForDevicesOnBus();
5
    return;
6
  }
7
  i2c_write(data); // then send the data byte
8
  i2c_stop();
9
}
10
void I2C_WriteRegister(uint8_t busAddr, uint8_t deviceRegister, uint8_t data) {
11
  uint8_t error = i2c_start(busAddr); // send bus address
12
  if (error) {//Own snipped
13
    scanForDevicesOnBus();
14
    return;
15
  }
16
  i2c_write(deviceRegister); // first byte = device register address
17
  i2c_write(data); // second byte = data for device register
18
  i2c_stop();
19
}
20
uint8_t I2C_ReadRegister(uint8_t busAddr, uint8_t deviceRegister) {
21
  uint8_t data = 0;
22
  uint8_t error = i2c_start(busAddr); // send device address
23
  if (error) {//Own snipped
24
    scanForDevicesOnBus();
25
    return data;
26
  }
27
  i2c_write(deviceRegister); // set register pointer
28
  i2c_start(busAddr + I2C_READ); // restart as a read operation
29
  data = i2c_readNak(); // read the register data
30
  i2c_stop(); // stop
31
  return data;
32
}

Grüße Oekel

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> sollte man das anders lösen?
Ich würde erst mal (z.B. mit einem zusätzlichen Pin) versuchen zu 
erkennen, ob das Display angesteckt ist.

Und immer dran denken: generell ist der I2C kein HotPlug Bus. Wenn an 
diesem Bus noch andere Teilnehmer hängen, dann werden bei Einstecken 
evtl. deren Daten oder Adressen korrumpiert...

: Bearbeitet durch Moderator
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.