Hi,
den Code haste scheinbar richtig abgetippt, also muss der Fehler wo
anders sein! Zeig mal das restliche Programm bzw. mach ein mini Prog.
auf, damit wir es testen können.
Schaltplan wäre auch nicht schlecht, sowie der Name des EEProms das du
ansprechen willst.
Schreibe bitte NIE LEERE! IF - Anweisungen in dein Code, das ist nicht
gut!!!!
1
if((TWSR&0xF8)!=TW_START)//Wenn anderer Wert als beim senden --> Error
2
uart_puts("Keine TW-Start erhalten!");
3
....
4
if((TWSR&0xF8)!=TW_MT_SLA_ACK)//Prüfe TWI Status Register, wenn status anders als im MT_SLA_ACK -> Error
5
uart_puts("Keine TW_MT_SLA_ACK erhalten!");
6
....
für kleine Testprogs. ist es immer gut kleine DebugMess. zu senden! Im
richtigen Code, werden dann aber Return-Val. verwendet!
Stephan
Hallo,
also ein Teil funktioniert jetzt. Am Osci scheint auch alles in Ordnung
zu sein, das schreiben gibt mir KEINE Fehler aus, also alle ACK's werden
erhalten
1
//eeprom_twi_tests:
2
charSLA_W=0xA0;
3
charDATA0=0x00;
4
charDATA1=0x00;
5
charDATA2=0xAB;
6
charDATA3=0xAB;
7
8
9
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//uC als Master definieren, START condition
10
while(!(TWCR&(1<<TWINT)));//warten und prüfen ob richtig gesendet
11
if((TWSR&0xF8)!=TW_START){//Wenn anderer Wert als beim senden --> Error
12
//error?
13
uart_puts("error01");
14
}
15
16
TWDR=SLA_W;//SLA_W sendet die Adresse
17
TWCR=(1<<TWINT)|(1<<TWEN);
18
while(!(TWCR&(1<<TWINT)));
19
if((TWSR&0xF8)!=TW_MT_SLA_ACK){
20
//error?
21
uart_puts("error02");
22
}
23
//error?
24
TWDR=DATA0;//Data -> Daten in das TWDR Register geladen werden sollen
Hallo,
also ein Teil funktioniert jetzt. Am Osci scheint auch alles in Ordnung
zu sein, das schreiben gibt mir KEINE Fehler aus, also alle ACK's werden
erhalten
1
//eeprom_twi_tests:
2
charSLA_W=0xA0;
3
charDATA0=0x00;
4
charDATA1=0x00;
5
charDATA2=0xAB;
6
charDATA3=0xAB;
7
8
9
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//uC als Master definieren, START condition
10
while(!(TWCR&(1<<TWINT)));//warten und prüfen ob richtig gesendet
11
if((TWSR&0xF8)!=TW_START){//Wenn anderer Wert als beim senden --> Error
12
//error?
13
uart_puts("error01");
14
}
15
16
TWDR=SLA_W;//SLA_W sendet die Adresse
17
TWCR=(1<<TWINT)|(1<<TWEN);
18
while(!(TWCR&(1<<TWINT)));
19
if((TWSR&0xF8)!=TW_MT_SLA_ACK){
20
//error?
21
uart_puts("error02");
22
}
23
//error?
24
TWDR=DATA0;//Data -> Daten in das TWDR Register geladen werden sollen
Jetzt habe ich versucht, meine Bytes wieder auszulesen, es wird mir über
meine USB am Terminal, der error11 und error12 ausgegeben.
Der Code sieht so aus:
Hab nochmal geschaunt, wenn man ein erneutes START con senden will, muss
da ein TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //ReStart rein
TWSTA, das funktioniert schonmal, doch error12 bleibt und er gibt bei
TWSR nur ein komisches 0x00 raus, was im Datenblatt nicht verzeichnet
ist.
Vielen Dank für deine Hilfe.
MFG
Hi
ich sehe zwar den Fehler gerade nicht, aber es kann kein "TW_MT_SLA_ACK"
raus kommen!!!
Das MT steht für MasterTransmit!
ich würde diese hier erwarten:
TW_MR_SLA_ACK
TW_MR_SLA_NACK oder
TW_MR_ARB_LOST
in den seltenen Fällen auch
TW_BUS_ERROR
schau noch mal nach.
Stephan
>damit erhalte ich kein error mehr,
also war der Status doch nicht NULL!
Wenn dein Terminal-Programm nur ASCII-Daten anzeigt, dann musst du deine
DebugMess. ändern!!!!
>Ist das richtig so?
Ja, fast! Schau dir nochmal die Abfolge im DB deines EEProms an!
Da steht was zu ACK und NACK von Datenbytes.
mögliche Statuscodes vom MC überprüfen <- als TIP
TW_SR_DATA_ACK
TW_SR_DATA_NACK
Stephan
Falls es jemand jemals brauchen sollte.
Vielen Dank nochmal. Warst mir eine große Hilfe.
Eine Frage habe ich noch, wenn das eeprom "voll" ist, beginnt er von
vorn richtig? Gibt es eine Art Belegt-Status oder muss man beim
programmieren "mitrechnen"?
Mfg
>Eine Frage habe ich noch, wenn das eeprom "voll" ist, beginnt er von>vorn richtig? Gibt es eine Art Belegt-Status oder muss man beim>programmieren "mitrechnen"?
ja, im EEProm wird der Adresszeiger wieder auf Null gesetzt wenn du über
das Ende schreibst(ließt).
Einen Belegstatus gibs nicht!
so dann noch viel Spaß damit.
Stephan