Prosze o pomoc w wyjasnieniu gdzie jest pies pogrzebany.
Napisałem prosty program w c do ATMEGA32, ktory powinien najpierw zapisac, a nastepnie odczytac wartosc 123 z adresu 2 w eeprom AT24C04 (po I2C) http://www.atmel.com/dyn/resources/prod_documents/doc0180.pdf. Niestety za kazdym razem wartosc odczytana wynosi 255, a zmienna status ma wartosc 32 (brak ACK). Wyprowadzenia A0, A1 i A2 sa podpiete do GND. Mikrokontroler jest taktowany 1Mhz (wewn. gen. RC). Rezystory podciagające linie SDA i SCL mają wartość 10k. Eeprom jest sprawny. Mikrokontroler zaprogramowałem programatorem USBasp z AVRdude.
Kod:
Napisałem prosty program w c do ATMEGA32, ktory powinien najpierw zapisac, a nastepnie odczytac wartosc 123 z adresu 2 w eeprom AT24C04 (po I2C) http://www.atmel.com/dyn/resources/prod_documents/doc0180.pdf. Niestety za kazdym razem wartosc odczytana wynosi 255, a zmienna status ma wartosc 32 (brak ACK). Wyprowadzenia A0, A1 i A2 sa podpiete do GND. Mikrokontroler jest taktowany 1Mhz (wewn. gen. RC). Rezystory podciagające linie SDA i SCL mają wartość 10k. Eeprom jest sprawny. Mikrokontroler zaprogramowałem programatorem USBasp z AVRdude.
Kod:
#define F_CPU 1000000UL // 1 MHz
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <string.h>
#include <util/twi.h>
// START
void twistart(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
// STOP
void twistop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while ((TWCR & (1<<TWSTO)));
}
// transmisja bajtu danych
void twiwrite(unsigned char data)
{
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
//odczyt bajtu danych
int twiread(int ack)
{
TWCR = ack ?
((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
:
((1 << TWINT) | (1 << TWEN)) ;
while (!(TWCR & (1<<TWINT)));
return TWDR;
}
int main (void)
{
int j = 0;
TWBR = 255;
//zapis do eeprom
twistart();
twiwrite(0b1010000);
int status = (TWSR & 0xF8);
twiwrite(2); //adres
twiwrite(123); //wartosc
twistop();
_delay_ms(200);
//odczyt z eeprom uprzednio zapisanej wartosci
twistart();
twiwrite(0b10100000);
twiwrite(2);
twistart();
twiwrite(0b10100001);
j = twiread(0); //O - NOACK
twistop();
//... dalej wyswietlam j na LCD 2x16