Mam śmieszny problem.
Korzystam z biblioteki I2C z tej strony:
http://mikrokontrolery.net/avr_c_09.htm
I praca w moim układzie wygląda tak, że odczytywany jest pierwszy bajt z układu slave, natomiast wszystkie kolejne są odczytywane jako 255. Jeśli każdy bajt odczytuje pojedynczo poprzedzając odczytanie startem i zaadresowaniem układu itd. to odczytują się prawidłowo...
Przypuszczam, ze problem wygląda tak, że pierwszy bajt jest odczytywany poprawnie, ale potem mój mikroprocesor nie wysyła slave'owi sygnału ack zrywając przez to transmisję
Dlatego kolejne bajty są odczytywane jako 255.
Chciałbym zwrócić uwagę konkretnie na ten fragment:
W oznaczonym miejscu wykonywana jest operacja wystawienia jakiegoś stanu na SDA, jednak to SDA nie jest tam wtedy wyjściem a wejściem, jak więc można coś na nie wpisać? Z drugiej strony mój problem polega na tym, że jak dodałem przed tą linijką polecenie SDA_OUT; to nic ono nie zmieniło...
Ma ktoś jakiś pomysł? Zajmuje się tą głupotą już któryś tydzień i wszystko zawodzi...
Korzystam z biblioteki I2C z tej strony:
http://mikrokontrolery.net/avr_c_09.htm
I praca w moim układzie wygląda tak, że odczytywany jest pierwszy bajt z układu slave, natomiast wszystkie kolejne są odczytywane jako 255. Jeśli każdy bajt odczytuje pojedynczo poprzedzając odczytanie startem i zaadresowaniem układu itd. to odczytują się prawidłowo...
Przypuszczam, ze problem wygląda tak, że pierwszy bajt jest odczytywany poprawnie, ale potem mój mikroprocesor nie wysyła slave'owi sygnału ack zrywając przez to transmisję
Chciałbym zwrócić uwagę konkretnie na ten fragment:
unsigned char i2cread(unsigned char ack)
{
unsigned char count = 8, temp = 0;
SET_SDA; SDA_IN;
do
{
delay();
SET_SCL;
delay();
temp <<= 1;
if (GET_SDA) temp++;
CLR_SCL;
} while (--count);
if(ack) SET_SDA; // <----- to miejsce mnie zastanawia
delay();
SET_SCL;
delay();
CLR_SCL;
return (temp);
}W oznaczonym miejscu wykonywana jest operacja wystawienia jakiegoś stanu na SDA, jednak to SDA nie jest tam wtedy wyjściem a wejściem, jak więc można coś na nie wpisać? Z drugiej strony mój problem polega na tym, że jak dodałem przed tą linijką polecenie SDA_OUT; to nic ono nie zmieniło...
Ma ktoś jakiś pomysł? Zajmuje się tą głupotą już któryś tydzień i wszystko zawodzi...