I2C - help help

Feb 07, 2006 3 Replies

Drugie popo³udnie zastanawiam siê, dlaczego metoda wys³ania danych przez I2C, podana w nocie katalogowej ATmega8 nie chce dzia³aæ. Mam pod³±czony oscyloskop + podci±gaj±ce rezystory 10k dla nó¿ej SDA i SCL, ale wywo³anie tej funkcji z odpowiednimi parametrami, nie powoduje jakiejkolwiek zmiany na tych pinach.



Czy ustawienie: TWCR = (1<<TWEN) // prze³±czenie pinów PC4 i PC5 na sprzêtowe TWI



powinno ustawiæ te wyj¶cia w stan wysoki? U mnie mimo rezystorów, stan jest niski. Poni¿ej uproszczony kod, który nic nie robi...


void SendI2C(char rejestr, char dana) {



char SLA_W = 0x20; // adres uk³ad MAX9850 char DATAR = rejestr; // adres rejestru char DATA = dana; // dana do zapisu



//ustalanie prêdko¶ci transmisji I2C TWBR = 0x10; TWSR |= 0x03;



TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Send START condition



while (!(TWCR & (1<<TWINT)));



// ########################################### // ## slave adress ### TWDR = SLA_W; // przepisanie bajtu adresu do wys³ania TWCR = (1<<TWINT) | (1<<TWEN);



while (!(TWCR & (1<<TWINT)));



// ########################################### // ## register adress ### TWDR = DATAR; // przepisanie bajtu danych do wys³ania TWCR = (1<<TWINT) | (1<<TWEN);



while (!(TWCR & (1<<TWINT)));



// ########################################### // ## data byte ###



TWDR = DATA; // przepisanie bajtu danych do wys³ania TWCR = (1<<TWINT) | (1<<TWEN);



while (!(TWCR & (1<<TWINT)));


TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //Transmit STOP condition }



Widzę że nikt ci nie odpowiada. Na czymś innym niż assembler nie piszę ale może przyda ci się unit asemblera do I2C. Jak tak to pisz na PRIV. Może jakaś analiza głębsza itp.

A jeszcze przed TWCR by sie przydało zdefiniować dla odpowiednich pinów portu active pullup, czyli np. sbi(port, bit). ktory to port i bity sprawdz w datasheet.

DJ

Sprawê ju¿ rozwi±za³em. Przyczyna okaza³a siê trywialna, ale w trakcie prac wydawa³o siê, ¿e takie pod³±czenie jest poprawne. Po prostu inny uk³ad pod³±czony do magistrali I2C (MAX1980 czy jako¶ tak) zwiera³ piny do masy... Ten kod, który tu umie¶ci³em jest poprawny. Dziêki za zainteresowanie moim problemem.

Pzdr. K.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required