Vor etlichen Jahren verstand ich von I²C/TWI so ziemlich nix, hatte aber auch mal mit der Zeitdehnung des Slaves zu kämpfen. Damals hatte ich mit - zugebenermassen - unanständigen Mitteln mich aus der Affaire gezogen: ich hatte in den I²C-Routinen eine for-Schleife eingebaut. Aus meinen alten Beständen (nach mühevoller Suche) mal ein Beispiel zur Verdeutlichung :.. Der Bus ist damit komplett blockiert. .. Vielleicht habt Ihr dazu etwas Information für mich ..
Ich bin nicht sicher ob genau dieser Code gelaufen war, aber in die Richtung gings dann mal richtig gut. Mittlerweile lebe ich problemlos mit dem Stetching . . *gg*. Aber es war mir immerhin die Erfahrung wert.Code:unsigned char i2c_start(unsigned char address) { // uint8_t twst; // uint8_t tggl; // uint8_t tttt = TWBR; // // send START condition TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // wait until transmission completed // while(!(TWCR & (1<<TWINT))); // ################## for (uint16_t m = 0; m<=60000; m++) { if ((TWCR & (1<<TWINT))) break; // I2C-Device hat sich gemeldet for (uint8_t n = 0; n<= tttt; n++) // wenn nicht { tggl = 29 + 2; } // => Zeit schinden } // check value of TWI Status Register. Mask prescaler bits. twst = TW_STATUS & 0xF8; if ( (twst != TW_START) && (twst != TW_REP_START)) return 1; // send device address TWDR = address; TWCR = (1<<TWINT) | (1<<TWEN); // wail until transmission completed and ACK/NACK has been received // while(!(TWCR & (1<<TWINT))); // ################## for (uint16_t m = 0; m<=60000; m++) { if ((TWCR & (1<<TWINT))) break; // I2C-Device hat sich gemeldet for (uint8_t n = 0; n<= tttt; n++) // wenn nicht { tggl = 29 + 2; } // => Zeit schinden } // check value of TWI Status Register. Mask prescaler bits. twst = TW_STATUS & 0xF8; if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1; return 0; }/* i2c_start */
Am besten der alte Ratschlag: RTFM, z.B. die Application Note AVR311, Atmel-2565E-Using-the-TWI-Module-as-I2C-Slave_AVR311_Application Note-03/2016 oder so. Dazu natürlich auch die AVR315: Using the TWI module as I2C master (meine ist Rev. 2564B-AVR-09/04)... Muss nach einer Stop Condition nicht der Bus generell vom Slave freigegeben werden ? ..






Zitieren

Lesezeichen