Cześć,
Próbuję użyć TWI w AVR i mam pytanie - skąd mam wiedzieć, że STOP już został wysłany i mogę wysłać następny START?
Cześć,
Próbuję użyć TWI w AVR i mam pytanie - skąd mam wiedzieć, że STOP już został wysłany i mogę wysłać następny START?
Jako master nie musisz czekac na STOP. Mo¿esz wysy³aæ REPEATED START. Ja w³a¶nie wykombinowa³em jak nie wysy³aæ STOP.
Adam Wysocki pisze:
void i2c_stop(void) { /* send stop condition */ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // wait until stop condition is executed and bus released while(TWCR & (1<<TWSTO));
}/* i2c_stop */
Czyli dopóki TWSTO jest wysokie, to nic nie powinieneś robić. Ale.. osobiście miałem problemy z slave'ami które miały z jakiegoś powodu wolną obsługę I2C. Za stopem a przed kolejnym startem, wstawiałem delaya - i się już dobrze bujało.
Ciekawiej siê robi w ¶rodowisku multimaster. Jest sobie SLAVE RECEIVER i czeka na stop, ¿eby prze³±czyc sie na MASTER TRANSMITTER i wys³aæ swoje. Niby jest TWSR = A0 ( TWI_SRX_STOP_RESTART), ale jak elegancko rozró¿niæ te dwa stany? Eeech.... biorê siê za lekture.
Have something to add? Share your thoughts — no account required.
Ask the community — no account required