Adam Wysocki
Guest
Tue Feb 10, 2009 9:45 pm
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?
--
http://www.extreme-photo.pl/
PcmOL
Guest
Wed Feb 11, 2009 12:01 am
"Adam Wysocki" <gophi.at.chmurka.net@nospam.invalid> wrote in message
news:gophi.pme.1234298391@news.chmurka.net...
Quote:
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.
PH
Guest
Wed Feb 11, 2009 12:06 am
Adam Wysocki pisze:
Quote:
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?
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.
--
PH
PcmOL
Guest
Wed Feb 11, 2009 8:53 am
"PH" <sinuh3@wp.pl> wrote in message
news:gmt4jf$uo4$1@julia.coi.pw.edu.pl...
Quote:
Adam Wysocki pisze:
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?
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.