avr gcc i2c problem



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "AzaZeL" <AzaZeL_B_at_nospam_poczta.onet.pl>
Subject: avr gcc i2c problem
Date: Wed, 8 Feb 2006 15:51:01 +0100


Witam
mam problem z ukłądem ds1307 jest to RTC
napisałem sobie procedurki do obsługi i niestetu nie działaja
a w bascomie mi działa wiec sprzet jest ok

prosiłbym o naprowadzenie na przyczyne problemu
oto kod

#define sda 2
#define scl 3
#define ddr_i2c DDRD
#define port_i2c PORTD
#define opuz_i2c 10

void czekaj_i2c(unsigned char taui2c)
{
do
{
asm("nop");
}while(--taui2c!=0);
}

unsigned char I2C_read(unsigned char ack)
{
unsigned char i;
unsigned char b = 0;
ddr_i2c &= ~ (1<<sda); //sda=1
port_i2c |= 1<<sda;
czekaj_i2c(opuz_i2c);
for (i=0; i<8; i++) // czytanie 8 bitów
{
port_i2c |= 1 << scl ; //scl=1
ddr_i2c &= ~(1 << scl);
czekaj_i2c(opuz_i2c);
b <<= 1;
if (bit_is_set(port_i2c,sda))
b |= 1;
port_i2c &= ~( 1 << scl ); //scl=0
ddr_i2c |= 1 << scl;
czekaj_i2c(opuz_i2c);
}
if (ack == 0)
{
port_i2c &=~( 1<<sda); //sda=0
ddr_i2c |=1 << sda;
}
else
{
port_i2c |= 1<<sda; //sda=0
ddr_i2c &=~(1 << sda);
}

czekaj_i2c(opuz_i2c);
port_i2c |= 1 << scl ; //scl=1
ddr_i2c &= ~(1 << scl);
czekaj_i2c(opuz_i2c);
port_i2c &= ~( 1 << scl ); //scl=0
ddr_i2c |= 1 << scl;
czekaj_i2c(opuz_i2c);
port_i2c &=~( 1<<sda); //sda=0
ddr_i2c |= 1<<sda;
czekaj_i2c(opuz_i2c);
return(b);
}

void I2C_start(void)
{
port_i2c |= 1 << sda; //sda,scl=1
port_i2c |= 1 << scl;
ddr_i2c &= ~ (1<< sda);
ddr_i2c &= ~(1 << scl);
czekaj_i2c(opuz_i2c);
port_i2c &= ~(1 << sda); //sda=0
ddr_i2c |= 1<< sda;
czekaj_i2c(opuz_i2c);
port_i2c &= ~(1 << scl); //scl=0
ddr_i2c |= 1<< scl;
czekaj_i2c(opuz_i2c);
}

void I2C_stop(void)
{
port_i2c &=~( 1 << sda ); //sda,scl=0
port_i2c &=~( 1 << scl );
ddr_i2c |=1 << sda;
ddr_i2c |= 1 << scl;
czekaj_i2c(opuz_i2c);
port_i2c |= 1 << scl; //scl=1
ddr_i2c &=~(1 << scl);
czekaj_i2c(opuz_i2c);
port_i2c |= 1 << sda; //sda=1
ddr_i2c &=~(1 << sda);
czekaj_i2c(opuz_i2c);
}

unsigned char I2C_write(unsigned char b)
{
unsigned char i;
port_i2c &=~( 1 << sda ); //sda,scl=0
port_i2c &=~( 1 << scl );
ddr_i2c |=1 << sda;
ddr_i2c |= 1 << scl;
for (i=0; i<8; i++) // zapis 8 bitˇw
{
if (b & 0x80)
{
port_i2c |= 1<<sda; //sda=1
ddr_i2c &=~(1 << sda);
}
else
{
port_i2c &=~( 1<<sda); //sda=0
ddr_i2c |=1 << sda;
}
czekaj_i2c(opuz_i2c);
port_i2c |= 1 << scl ; //scl=1
ddr_i2c &= ~(1 << scl);
czekaj_i2c(opuz_i2c);
port_i2c &= ~( 1 << scl ); //scl=0
ddr_i2c |= 1 << scl;
b <<= 1; // przesu˝ o 1 bit
}
port_i2c |= 1<<sda; //sda=1
ddr_i2c &=~(1 << sda);
czekaj_i2c(opuz_i2c);
port_i2c |= 1 << scl ; //scl=1
ddr_i2c &= ~(1 << scl);
czekaj_i2c(opuz_i2c);
i=0xFF;
do
{
if (bit_is_clear(port_i2c,sda)) break; // je?eli jest potwierdzenie
czekaj_i2c(opuz_i2c);
i-- ;
}
while(i>0);
port_i2c &= ~( 1 << scl ); //scl=0
ddr_i2c |= 1 << scl;
czekaj_i2c(opuz_i2c);
return(i);
}


Pozdrawiam
AzaZeL