Hallo,
ich habe ein Problem mit meiner I2C Programmierung. Ich soll eine I2C Kommunikaton mit einem Master (BECK Prozessor) und einem Slave ATMEGA32 realisieren. Leider hat mein erster Versuch nicht richtig funktioniert, deshalb habe im 2. Versuch es mit Interruptprogrammierung versucht.
Auf dem ersten Bild kann man einen Auszug von einem Logikport sehen. Das eigentliche problem ist das es mir nicht möglich ist das erste Datenbyte im Bild 11111111 zu verändern.
Bild 2 zeigt nur die Codesys Oberfläche.
Die kommunikation MasterTransmitter -->Slave Receiver funktioniert also einwandfrei.
Aber die Richtung Slave Transmitter -->Master Receiver funktioniert nicht.
Code:
#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<<TWEA);
break;
//ST - Slave Transmitter
case 0xA8: //Der Slave erkennt seine Adresse und die SLA+R Anweisung und bestätigt durch ACK.
TWCR=0;
TWCR=(1<<TWEN)|(1<<TWEA)|(1<<TWIE)|(1<<TWINT);
break;
case 0xB8: //Das in TWDR gespeicherte Byte wurde übertragen und ACK wurde vom Master empfangen.
//TWCR=0;
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
TWDR = 0b11110000;
break;
default:
while(1)
{
asm volatile ("nop");
}
break;
}
}
int main ()
{
sei();
TWAR=96;
TWBR=32;
TWSR=0;
TWCR=0;
TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWEA);
while(1)
{
asm volatile ("nop");
}
}
Vielleicht kann jemand mal über meinen C Text gucken und mir sagen warum ich das Datenbyte nicht verändern kann.
Lesezeichen