Ich versuche, über I2C eine Verbindung zu einem IC herzustellen. Um die I2C-Kommunikation zu initialisieren, verwende ich die folgende Funktion:
void init_i2c(void ) {
uint8_t twst;
TWSR = 0; // no prescaler
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
TWCR = (1<<(TWINT))|(1<<TWSTA )|(1<<TWEN);
printf("TWCR 0x%x \n",TWCR);
while(!(TWCR & (1<< TWINT)));
printf(" Start condition has been transmitted \n");
if( (TWSR&0xF8) != TW_START){
printf(" Error at TWSR start 0x%x\n",TWSR);
}
// Setting Address
TWDR = 0x70;
// cleating TWCR
TWCR = (1<<TWINT) |(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_MT_SLA_ACK){
printf(" Error at TWSR 0x%x SLA_ACK 0x%x \n", TWSR, TW_MT_SLA_ACK); // here is the problem !!!!!!!!! TWSR value should be 0x18
}else {
printf(" tell now is good \n");
}
Die Verkabelung ist gut. Ich habe jeden Pin mit einem Oszilloskop gemessen, einschließlich der Frequenz des SCL [50 kHz]. das TWI-Statusregister ** bei der abschließenden if-Anweisung ist **0x20 statt 0x18
Irgendein Hinweis, was ich hier falsch mache?
Status 0x20 ist vollkommen gültig und normal, wenn kein Gerät auf die gesendete Adresse antwortet. Daher wäre als erstes zu prüfen, ob die Adresse gültig ist (kein Off-by-One-Bit-Fehler und einschließlich korrektem R/W-Bit). Wenn der Slave schließlich für die I2C-Kommunikation korrekt konfiguriert ist, nicht ausgesetzt usw.
Was sehen Sie auf der SDA-Linie mit einem Oszilloskop? Ist das letzte Bit (Acknowledge) Low oder High? (Das heißt, sieht AVR kein gültiges ACK oder bestätigt das Slave-Gerät die Adresse nicht?) Verwenden Sie die richtige Slave-Adresse? (d. h. kein Ein-Bit-Aus, da die Adressformate 7-Bit und 8-Bit nicht übereinstimmen)
Auoa
Motor
CHendrix
Krähe
Mikrofon
Chris Stratton
Krähe
Chris Stratton
Krähe