Hallo, ich programmiere zur Zeit eine I2C Kommunikation. Den Master
(BECK sc24 Mikrocontroller)habe ich mit Codesys programmiert. Der Slave
ist ein Atmega32, der von mir in C programmiert wurde. Ich habe den
Slave mit Interrupts programmiert. Master Transmitter--> Slave receiver
funktioniert soweit, kann man im Anhang sehen.
Jetzt zu meinem Problem, die Funktion Slave Transmitter-->Master
receiver funktioniert leider nicht, um genau zu sein wird immer ein nack
angezeigt. Kann man im Anhang auf dem Screenshot vom Logikport sehen.
Vielleicht sieht jemand was im c Code falsch ist oder ergänzt werden
muss.
#include<avr/interrupt.h>
#include<util/twi.h>
#include<avr/io.h>
#include<util/delay.h>
ISR(TWI_vect)
{
switch(TWSR)
{
//SR - Slave Receiver
case 0x60: //Der Slave erkennt seine Adresse und erhält die SLA+W
Anweisung des Masters. Daraufhin bestätigt er mit ACK
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
break;
case 0x80: //Der explizit adressierte Slave empfängt das vom Master
gesendete Datenbyte und bestätigt durch ACK.
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
break; //Dies wird solange wiederholt, bis die STOP-Bedingung
eintrifft.
case 0xA0: //STOP-Bedingung wurde erkannt
TWCR=0;
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTO);
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWEA);
break;
//ST - Slave Transmitter
case 0xA8: //Der Slave erkennt seine Adresse und die SLA+R Anweisung
und bestätigt durch ACK.
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTO);
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWEA);
case 0xB8: //Das in TWDR gespeicherte Byte wurde übertragen und ACK
wurde vom Master empfangen.
TWDR = 0b11110000;
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
break;
case 0xC0: //Das in TWDR gespeicherte Byte ist das letzte das
übertragen wurde.
//Der Master hat dies erkannt und bestätigt durch NACK.
break;
default:
while(1)
{
asm volatile ("nop");
}
break;
}
}
int main ()
{
sei();
TWAR=(48<<1)|0;
TWBR=32;
TWSR=0;
TWCR=0;
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWEA);
while(1)
{
asm volatile ("nop");
}
}
#include<avr/interrupt.h>
#include<util/twi.h>
#include<avr/io.h>
#include<util/delay.h>
ISR(TWI_vect)
{
switch(TWSR)
{
//SR - Slave Receiver
case 0x60: //Der Slave erkennt seine Adresse und erhält die SLA+W
Anweisung des Masters. Daraufhin bestätigt er mit ACK
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
break;
case 0x80: //Der explizit adressierte Slave empfängt das vom Master
gesendete Datenbyte und bestätigt durch ACK.
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
break;
case 0xA0: //STOP-Bedingung wurde erkannt
TWCR&=~((1<<TWSTO)|(1<<TWSTA));
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWEA)|(1<<TWINT);
break;
//ST - Slave Transmitter
case 0xa8:
TWCR=0;
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
case 0xb8:
TWDR=200;
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
break;
case 0xc8:
break;
while(1)
{
asm volatile ("nop");
}
break;
}
}
int main ()
{
TWAR= (48<<1)|0;; //Adresse setzen
TWCR &= ~(1<<TWSTA)|(1<<TWSTO);
TWCR|= (1<<TWEA)|(1<<TWEN)|(1<<TWIE);
TWDR=0;
sei();
while(1)
{
asm volatile ("nop");
}
}
Habe den Code nochmals etwas verkürzt, habe leider immer noch das
Problem das Slave Transmitter Master --> Receiver nicht funktioniert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

