Cześć!
Od jakiegoś czasu nie mogę sobie poradzić z obsługą I2C. Mam ATMege32 i podłączony do niej układ PCF8574. Chcę na początek ustawić na portach PCFa np same zera - żeby sprawdzić czy transmisja działa. No i nie działa. Oto cały mój kod (kompiluję pod winavr):
Kod jest wzięty z netu i po części z noty aplikacyjnej ATMegi.
Nie znam się za bardzo i możliwe, że coś przegapiłem.
Może trzeba jakoś inaczej skonfigurować linie SDA i SCL? Może jakieś opóźnienia są potrzebne?
Proszę o pomoc.
Od jakiegoś czasu nie mogę sobie poradzić z obsługą I2C. Mam ATMege32 i podłączony do niej układ PCF8574. Chcę na początek ustawić na portach PCFa np same zera - żeby sprawdzić czy transmisja działa. No i nie działa. Oto cały mój kod (kompiluję pod winavr):
#include <compat/twi.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
// procedura transmisji sygnału START
void twistart(void)
{
sbi(PORTC, 0); // i2c SCL on ATmega163,323,16,32,etc
sbi(PORTC, 1); // i2c SDA on ATmega163,323,16,32,etc
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
// procedura transmisji sygnału STOP
void twistop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while ((TWCR & (1<<TWSTO)));
}
// procedura transmisji bajtu danych
void twiwrite(char data)
{
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
//procedura odczytu bajtu danych
char twiread(char ack)
{
TWCR = ack
? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
: ((1 << TWINT) | (1 << TWEN)) ;
while (!(TWCR & (1<<TWINT)));
return TWDR;
}
void main()
{
twistart();
twiwrite(01001011);
twiwrite(0x00);
twistop();
while(1){}
}
Kod jest wzięty z netu i po części z noty aplikacyjnej ATMegi.
Nie znam się za bardzo i możliwe, że coś przegapiłem.
Może trzeba jakoś inaczej skonfigurować linie SDA i SCL? Może jakieś opóźnienia są potrzebne?
Proszę o pomoc.
