PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit TWI Slave Attiny26



damfino
31.08.2010, 12:30
Habe schon wieder ein Problem dass ich nicht selbst lösen kann, diesmal mit einem Attiny Slave.
Der Master (Atmega32) verwendet die Fleury Bibliothek, der Slave (Attiny26) die von jtronics.de für die USI Schnittstelle.
Ich kann den Slave nie erreichen, wenn ich mit i2c_start_wait(0x10); den Attiny erreichen will steht der ganze Bus. Momentan will ich nur Daten vom Slave lesen.
Es ist auch der Kompass am Bus drauf, den kann ich erreichen solange ich den Slave nicht anspreche.

So soll der Slave angesprochen werden:


The Slave works like a I2C-EEPROM.

1. send - "SLave-Address + write"
2. send - "Buffer-Address" Address in which you like to start with write or read.

write data in to Slave rxbuffer
3. send - "SLave-Address + write"
4. send - "data" writes data in the buffer, start by rxbuffer[Buffer-Address]

or

read data from Slave txbuffer
3. send - "SLave-Address + read"
4. send - data = i2c_readAck(); Demands the Slave to send data, start by txbuffer[Buffer-Address].

Info:
- you have to change the buffer_size in the usiTwiSlave.h file
- Buffer-Address is counted up automatically
- if Buffer-Address > buffersize --> start by Buffer-Address= 0


und so habe ich das umgesetzt:


i2c_start_wait(0x10); // start I2C bus
i2c_write(1); // register

i2c_rep_start(0x11); // restart

l = (unsigned short)i2c_readAck();
h = (unsigned short)i2c_readAck();
volt_eins= uniq(l,h);

l = (unsigned short)i2c_readAck();
h = (unsigned short)i2c_readAck();
volt_zwei= uniq(l,h);

l = (unsigned short)i2c_readAck();
h = (unsigned short)i2c_readAck();
volt_drei= uniq(l,h);

l = (unsigned short)i2c_readAck();
h = (unsigned short)i2c_readAck();
volt_vier= uniq(l,h);


l = (unsigned short)i2c_readAck();
h = (unsigned short)i2c_readNak();
volt_ges= uniq(l,h);
i2c_stop();


und als Vergleich: so lese ich den Kompass ein:


i2c_start_wait(0xc0); // start I2C bus
i2c_write(1); // register

i2c_rep_start(0xc1); // restart
kompass[1] = (short)i2c_readNak();
i2c_stop();




Im Programm lese ich zuerst den Kompass ein und zeige den Wert am LCD an, dann denn Slave und dessen Werte am LCD. Angezeigt wird nur der erste Wert vom Kompass, dann steht alles.

Kabellänge ca 50cm, 4.7k Pullup am Master, Bus mit 100khz, Master 16Mhz, Slave 8Mhz interner Takt, der Slave kennt seine eigene Adresse natürlich auch.

Ich hab schon das ganze WE damit herumgekämpft, andere Lib (original Atmel, etc) probiert, es ändert sich nichts.
Hab auch kein Oszi um nachzusehen was los ist, aber vielleicht ist die Lösung so einfach dass ich sie gar nicht sehe.

LG!