Ich als "C-Neuling": probier ich mal
Du sendest erst eine 0xFF als erstes Datenbyte und dann eine 0x00 als
zweites Datenbyte.
ZWISCHEN diesen beiden sendest Du STOP. KLar, dass dann 0x00 im TWSR
steht.
Code formatieren geht mit
<Eckige KLammer auf> grosses C <eckige KLammer zu>
Hier der code
<Eckige KLammer auf> Schrägstrich grosses C <eckige KLammer zu>
1 | int twi_Send(uint8_t data1,unint8_t data2, uint8_t address){
|
2 | char string[4];
|
3 | /* DDRC &= !((1<<DD0)|(1<<DD1)); //SCA und SCL: lesen..
|
4 | PORTC= (1<<DD0)|(1<<DD1); //..und Pullups aktivieren*/
|
5 |
|
6 | TWCR= ((1<<TWINT)|(1<<TWSTA)|(1<<TWEN)); //TWI aktiveren und
|
7 | Start-Condition auslösen
|
8 | while(!(TWCR & (1<<TWINT))); //Warten auf Start-Condition
|
9 | if((TWSR & 0xF8) !=TW_START) uart_PutS("FEHLER: keine
|
10 | StartCond");//Wenn keine Start-Condition gesendet wurde, abbrechen
|
11 |
|
12 | TWDR=address & (0xFE); //Adresse mit Schreibbit (XXXXXXX0)
|
13 | in Datenregister laden..
|
14 | TWCR= ((1<<TWINT)|(1<<TWEN)); //..und senden
|
15 | while(!(TWCR & (1<<TWINT))); //warten auf ACK oder NACK
|
16 | if((TWSR & 0xF8) != TW_MT_SLA_ACK) uart_PutS("FEHLER: Slave reagiert
|
17 | nich");//Wenn kein Slave reagiert, abbrechen
|
data in data1 umbenannt: erstes Byte
1 | TWDR=data1; //Byte in Datenregister laden..
|
2 | TWCR= ((1<<TWINT)|(1<<TWEN)); //..und senden
|
3 | while(!(TWCR & (1<<TWINT))); //warten auf ACK oder NACK
|
4 | if((TWSR & 0xF8) != TW_MT_DATA_ACK) uart_PutS("FEHLER: Slave
|
5 | akzeptiert nicht"); //Wenn nicht vom Slave akzeptiert, abbrechen
|
data2 hinzugefügt: zweites Byte
1 | TWDR=data2; //Byte in Datenregister laden..
|
2 | TWCR= ((1<<TWINT)|(1<<TWEN)); //..und senden
|
3 | while(!(TWCR & (1<<TWINT))); //warten auf ACK oder NACK
|
4 | if((TWSR & 0xF8) != TW_MT_DATA_ACK) uart_PutS("FEHLER: Slave
|
5 | akzeptiert nicht"); //Wenn nicht vom Slave akzeptiert, abbrechen
|
6 |
|
7 |
|
8 |
|
9 | TWCR= ((1<<TWINT)|(1<<TWSTO)|(1<<TWEN)); //Stop-Condition auslösen
|
10 | uart_PutS("STOP");
|
11 | return 0;
|
12 | }
|
man kann data auch als Zeiger übergeben und vorab als Array anlegen.
Als Parameter könntest Du dann noch leaenge mit übergeben und in einer
Schleife deine Daten rausschicken, bis laenge erreicht wurde. und ERST
DANN das STOP schicken.
1 | while(dataindex < laenge) {
|
2 | TWDR=data[dataindex++); //Byte in Datenregister laden..
|
3 | TWCR= ((1<<TWINT)|(1<<TWEN)); //..und senden
|
4 | while(!(TWCR & (1<<TWINT))); //warten auf ACK oder NACK
|
5 | if((TWSR & 0xF8) != TW_MT_DATA_ACK) uart_PutS("FEHLER: Slave
|
6 | akzeptiert nicht"); //Wenn nicht vom Slave akzeptiert, abbrechen
|
7 | }
|
laenge = 2
data[0]= 255
data[1]= 0
twi_Send(uint8_t laenge,unint8_t* data, uint8_t address)
bin ich jetzt aber nicht sicher, wie das mit den Zeigern war ;-))
Daher, weil es ja immer zwei Bytes sind, würde ich einfach zweimal (wie
oben gezeigt) die Daten rausschicken, bevor STOP rausgeht.
Ich denke aber, das andere, die richtig Ahnung von C und Zeigern haben,
da eher was zu sagen können, nicht wahr? ;-))
Viele Grüße
AxelR.