Próbuję obsługiwać układ pcf8583 przez i2c, i wydaje się że komunikacja właśnie po i2c nie chce mi działać.. Kod do i2c pobrałem z internetu, nie znam na tyle tej magistrali, żeby samemu sobie to napisać.. Oto część kodu:
U mnie nie chce to działać, program jest zaczerpnięty z tego formum, na forum widziałem, że kilka osób tego używa, ktoś miał jakiś problem może z 'uruchomieniem' tego kodu? Może coś trzeba zmienić?
Dzięki z góry za pomoc, pozdr.
Krzysiek
#define SCL I2C_SCL
#define SDA I2C_SDA
void
i2c_wbyte (uint8_t dana)
{ //wysłanie pojedynczego bajtu do Slave'a I2C
uint8_t i;
for (i = 0; i < 8; i++) { //będzie 8 bitów
if (dana & 0x80) //badaj najstarszy bit wysyłanego znaku
I2C_DDR |= _BV (SDA); //wyslij "1"
else
I2C_DDR &= ~_BV (SDA); //wyslij "0"
//i2c_delay(0);
I2C_DDR |= _BV (SCL);
i2c_delay (i2cdelay);
I2C_DDR &= ~_BV (SCL);
i2c_delay (i2cdelay);
dana <<= 1; //przygotuj następny bit do wysłania
}
I2C_DDR |= _BV (SDA); //zwolnij linię SDA dla Slave'a
i2c_delay (i2cdelay);
I2C_DDR |= _BV (SCL);
//while(!(I2C_PIN & _BV (SCL))); //czekaj, aż Slave będzie gotowy do przyjęcia następnego bitu
while (!SDA) ; //czekaj, aż Slave będzie gotowy do przyjęcia następnego bitu
i2c_delay (i2cdelay);
i = I2C_PIN & _BV (SDA); //czytaj potwierdzenie ACK od Slave'a
I2C_DDR &= ~_BV (SCL);
i2c_delay (i2cdelay);
}
uint8_t
i2c_rbyte (bool ack)
{ //przyjęcie pojedynczego bajtu od Slave'a I2C
//parametr ack=1 oznacza, że jest wysyłany ostatni bajt bloku,
//nie należy więc wysyłać potwierdzenia
uint8_t dana = 0, i;
for (i = 0; i < 8; i++) { //będzie 8 bitów
I2C_DDR &= ~_BV (SCL);
i2c_delay (i2cdelay);
I2C_DDR |= _BV (SCL);
i2c_delay (i2cdelay);
dana <<= 1; //przygotuj miejsce na kolejny odebrany bit
dana |= ((I2C_PIN & _BV (SDA)) == 1 ? 1 : 0); //dopisz odebrany bit
}
I2C_DDR &= ~_BV (SCL);
if (ack) //czy wysyłać potwierdzenie?
I2C_DDR &= ~_BV (SDA); //wyslij ACK
else
I2C_DDR |= _BV (SDA); //brak potwierdzenia sygnalizuje zakończenie bloku
i2c_delay (i2cdelay);
I2C_DDR |= _BV (SCL);
//while(!(I2C_PIN & _BV (SCL))); //czekaj, aż Slave będzie gotowy do przyjęcia następnego bitu
while (!SDA) ; //czekaj, aż Slave będzie gotowy do przyjęcia następnego bitu
i2c_delay (i2cdelay);
I2C_DDR |= _BV (SDA); //zwolnij linię SDA
I2C_DDR &= ~_BV (SCL);
return dana;
}
U mnie nie chce to działać, program jest zaczerpnięty z tego formum, na forum widziałem, że kilka osób tego używa, ktoś miał jakiś problem może z 'uruchomieniem' tego kodu? Może coś trzeba zmienić?
Dzięki z góry za pomoc, pozdr.
Krzysiek