Witam
Mam problem z SPI w Atmedze32. Staram się skomunikować ją z pamięcią 25LC128.
SPI inicjalizuję następujaco
Bajt pod wskazany adres wysyłam następująco:
Odczyt z pamięci odbywa się tak:
Wyjście SS procesora podpięte jest pod wejście CS pamięci, linie MISO i MOSI odpowiednio do SO i SI, SCK do SCK. Wejścia HOLD oraz WP pamięci podpięte są do +Vcc. Atmega pracuje na zewnętrznym kwarcu 16MHz. Po próbie zapisu i odczytu dowolnego znaku pod dowolny adres w EEPROMIE, zwracany jest znak '?'. Nie mam pomysłu co może być problemem, może któryś z kolegów znajdzie błąd w moim rozumowaniu.
Mam problem z SPI w Atmedze32. Staram się skomunikować ją z pamięcią 25LC128.
SPI inicjalizuję następujaco
void InicjalizacjaSPI(void)
{
// Wyjścia SS, SCK, oraz MOSI są wyjściami
DDRB = _BV(SPI_SS) | _BV(SPI_MOSI) | _BV(SPI_SCK);
// Ustawiamy SS oraz SCK w stan wysoki
PORTB = _BV(SPI_SS) | _BV(SPI_SCK);
// Uaktywniamy SPI, tryb Master, dzielnik 64
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR1) | _BV(SPR0);
}
Bajt pod wskazany adres wysyłam następująco:
void WyslijZnakEEPROM(char ch, short int adres)
{
// Ustawiam linię SS w stan niski
PORTB &= ~_BV(SPI_SS);
// Instrukcja zapisu zgodnie z dokumentacją pamięci EEPROM
SPDR = 0b00000010;
while(!(SPSR & (1<<SPIF)));
// Pierwsza połowa adresu
SPDR = (adres>>8);
while(!(SPSR & (1<<SPIF)));
// Druga połowa adresu
SPDR = adres;
while(!(SPSR & (1<<SPIF)));
// Znak do zapisu
SPDR = ch;
while(!(SPSR & (1<<SPIF)));
// Ustawiam linię SS w stan wysoki
PORTB |= _BV(SPI_SS);
}
Odczyt z pamięci odbywa się tak:
char OdbierzZnakEEPROM(short int addr)
{
// Ustawiam linię SS w stan niski
PORTB &= ~_BV(SPI_SS);
// Instrukcja odczytu z pamięci
SPDR = 0b00000011;
while(!(SPSR & (1<<SPIF)));
// Pierwsza połowa adresu
SPDR = (addr>>8);
while(!(SPSR & (1<<SPIF)));
// Druga połowa adresu
SPDR = addr;
while(!(SPSR & (1<<SPIF)));
// Odczyt zmiennej
addr=SPDR;
// Ustawiamy linię SS w stan wysoki
PORTB |= _BV(SPI_SS);
return addr;
}
Wyjście SS procesora podpięte jest pod wejście CS pamięci, linie MISO i MOSI odpowiednio do SO i SI, SCK do SCK. Wejścia HOLD oraz WP pamięci podpięte są do +Vcc. Atmega pracuje na zewnętrznym kwarcu 16MHz. Po próbie zapisu i odczytu dowolnego znaku pod dowolny adres w EEPROMIE, zwracany jest znak '?'. Nie mam pomysłu co może być problemem, może któryś z kolegów znajdzie błąd w moim rozumowaniu.