Witam, chciałbym się zapytać czy mógłby znawca w tym temacie rzucić okiem i powiedzieć co mniej więcej jest źle w tym kodzie(staralem sie pisać zgodnie z standardem i2c. Wiem że atmega32 ma sprzętowe TWI ale moim zadaniem jest napisanie programowego co niestety sprawia mi trudnosci. Mianowicie układ przy wysłaniu adresu zwraca mi 1(NACK)
Poprawiłem tytuł - Regulamin. [c_p]
void twi_init()
{
//Ustawienie lini jako wyjscie
D_TWI|=(1<<SCL)|(1<<SDA);
//zwolnienie lini
P_TWI|=(1<<SCL)|(1<<SDA);
}
void start_twi(void) //Funkcja wysylajaca bit startu
{
P_TWI|=(1<<SCL)|(1<<SDA);
_delay_us(5);
P_TWI&=~(1<<SDA);
_delay_us(5);
P_TWI&=~(1<<SCL);
}
void stop_twi(void) // Funkcja wysylajaca bit stopu
{
P_TWI&=~((1<<SCL));
P_TWI&=~((1<<SDA));
_delay_us(5);
//Generowanie bitu stopu
P_TWI|=(1<<SCL);
_delay_us(5);
P_TWI|=(1<<SDA);
_delay_us(5);
}
unsigned char send_8b(unsigned char DATA)
{
for(int i = 7 ; i >0 ; i--) //Petla wysylajaca 8 bitow
{
if(DATA&(1<<i)) //jezeli 1 to wysli 1 a jezeli 0 to wysli 0
{
P_TWI|=(1<<SDA);
}
else
{
P_TWI&=~(1<<SDA);
}
_delay_us(5);
P_TWI|=(1<<SCL);
_delay_us(4); // minimalny czas trwania poziomu 1 danych 4
P_TWI&=~(1<<SCL);
// _delay_us(5); // minimalny czas trwania poziomu 0 danych 4.7
}
//Ustawienie jako wejscie aby odczytac ACK lub NACK
P_TWI|=(1<<SDA);
D_TWI&=~(1<<SDA);
_delay_us(5);
// Ustawienie zegara na wysoki stan
P_TWI|=(1<<SCL);
//Sprawdzenie jaki sygnal generuje SLAVE ACK lub NACK
if((I_TWI&(1<<SDA)))
ACK_TWI=1;
else
ACK_TWI=0;
_delay_us(5);
P_TWI&=~(1<<SCL); //zegar w niskim poziomie
D_TWI|=(1<<SDA); //ustawienie portu jako wyjscie
_delay_us(5);
//Funkcja zwraca potwierdzenie 0 ACK 1 NACK
return ACK_TWI;
}Poprawiłem tytuł - Regulamin. [c_p]