hmm ... hab den original Code momentan nicht hier. Aber er war ca. so:
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(); if(i<cnt-1) i2c_write_ack(); //schreibt ein ACK delay(); } i2c_stop(); return i; }
Also ich hab es nach gemessen und es ist eindeutig der Slave der die Leitung runter zieht.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; }
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![]()







Zitieren

Lesezeichen