Dzięki Krauser
Chyba wyprowadziłeś mnie na prostą. Właściwie powinienem postawić Ci piwo "Leżajsk"
Czy mógłbyś potwierdzić czy prawidłowo widzę co się dzieje na liniach SDA i CSL przy wywołaniu np. i2cPutbyte(0xff)?
Czyli powinny polecieć same jedynki.
W poniższym kawałku na linia SDA będzie cały czas +5V, a SCL wyśle 8 impulsów zegarowych
Kod:
do {
if ( b & i ) I2C_SDL_HI;
else I2C_SDL_LO;
I2C_SCL_TOGGLE;
} while ( i >>= 1 );
// wysyłanie bajtu
A w tym kawałku MASTER sprawdzi czy SLAVE odebrał w/w 8 bitów (liczbę 0xff). Co ciekawe źródlem 9 bitu jest SLAVE a nie MASTER!
Kod:
I2C_SDL_HI; // pozostawienie SDA w stanie wysokim
DDR(SDAPORT) &= ~(1<<SDA);
HDEL;
I2C_SCL_HI;
b = PIN(SDAPORT) & (1<<SDA); // sprawdzenie bitu ACK
HDEL;
I2C_SCL_LO;
DDR(SDAPORT) |= (1<<SDA);
HDEL;
Tu natomiast funkcja "wie" czy SLAVE odebrał 8 bitów danych. Inna rzecz że program nie musi tej wiedzy wykorzystywać! Np funkcje I2C_write_buf_(...) i I2C_read_buf_(...) (str 286 i 287 "...C Podstawy Programowania" nie wykorzystują wiedzy na temat stanu ACK/NACK chociaż znają te stany.
Kod:
return (b == 0); //zwrócenie ACK jako rezultatu funkcji
.
}