hmm ... hab den original Code momentan nicht hier. Aber er war ca. so:
Code:
int read_data(addr, subaddr, uint8 *data, uint8 cnt){
uint8 i;
ic2_start(addr+write);
delay();
i2c_write(sub_addr);
if(!i2c_read_ack()){
i2c_stop();
return;
}
delay();
i2c_start(addr+read);
delay();
for(i=0;i<cnt;i++){
*(data++) = i2c_read();
if(i<cnt-1)
i2c_write_ack(); //schreibt ein ACK
delay();
}
i2c_stop();
return i;
}
meine korrigierte Version ist:
Code:
int read_data(addr, subaddr, uint8 *data, uint8 cnt){
uint8 i;
ic2_start(addr+write);
delay();
i2c_write(sub_addr);
if(!i2c_read_ack()){
i2c_stop();
return;
}
delay();
i2c_start(addr+read);
delay();
for(i=0;i<cnt;i++){
*(data++) = i2c_read();
i2c_write_ack(i<cnt-1); //schreibt ein ACK wenn der Parameter 0 ist und NOACK wenn der Parameter 1 ist
delay();
}
i2c_stop();
return i;
}
Also ich hab es nach gemessen und es ist eindeutig der Slave der die Leitung runter zieht.
Aber stimmt schon, eigentlich müsste der Slave einfach reseten und auf empfang gehen wenn eine stop-condition kommt. Und so wie ich das sehe sollte er das nach dem Quelltext auch tun. Wer weiß vielleicht ein bug im TWI
Lesezeichen