MB85RC64 (64kb FRAM) přes TWI - zápis pouze do adresy 0x8000

Ahoj mám problém se zápisem do paměti FRAM 64kb (MB85RC64). Paměť komunikuje přes TWI na Atmega32. Mám okopírovanou rutinu, která funguje až do adresy 0x8000. Pokud zapíšu nad tuto adresu, tak se mi zapisuje opět od nuly. Nechápu kde to přetejká, nebo kde je problém…mohl by mi prosím někdo poradit? Dík

unsigned char flash_write_byte(unsigned int address,unsigned char data){
TIMSK &= ~(1<<OCIE0); //vypnuti cit/cas
UCSRB = 0x00; //vypnuti UART
ADCSRA &= ~(1<<ADIE); //vypnuti AD

do{
//Put Start Condition on TWI Bus
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

//Poll Till Done
while(!(TWCR & (1<<TWINT)));

//Check status
if((TWSR & 0xF8) != 0x08)
  return FALSE;

//Now write SLA+W
//EEPROM @ 00h
TWDR=0b10100000;	

//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);

//Poll Till Done
while(!(TWCR & (1<<TWINT)));

}while((TWSR & 0xF8) != 0x18);

//Now write ADDRH
TWDR=((address&0xFF00)>>8);

//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);

//Poll Till Done
while(!(TWCR & (1<<TWINT)));

//Check status
if((TWSR & 0xF8) != 0x28)
return FALSE;

//Now write ADDRL
TWDR=(address&0x00FF);

//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);

//Poll Till Done
while(!(TWCR & (1<<TWINT)));

//Check status
if((TWSR & 0xF8) != 0x28)
return FALSE;

//Now write DATA
TWDR=(data);

//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);

//Poll Till Done
while(!(TWCR & (1<<TWINT)));

//Check status
if((TWSR & 0xF8) != 0x28)
return FALSE;

//Put Stop Condition on bus
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

//Wait for STOP to finish
while(TWCR & (1<<TWSTO));

//Wait untill Writing is complete

//Return TRUE

TIMSK = (1<<OCIE0);
UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
ADCSRA |= (1<<ADIE);

delay_mem(2);

return TRUE;
}

void init_twi(void){
//Set up TWI Module
PORTC |= 0x03; //pull up
TWBR = 10;
TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); //delici pomer 1
}

:arrow_right: administrator: přejmenováno z "FRAM a TWI"

//Now write ADDRH
TWDR=((address&0xFF00)>>Cool; neviem co je cool ale nama tam byt cislo 16 ?

Jak jsi dokázal v 8kB (0x0000 - 0x1FFF) paměti adresovat 32kB (0x0000 - 0x7FFF) do kterých ti to údajně pracuje správně?
edevice.fujitsu.com/fj/DATASHEET … 513109.pdf

Tak co se týče toho cool tak ve zdrojáku ode mě je 8. Jestli tam má bejt 16 tim se si nejsem úplně jistej, ale zkusím to.

Co de týče toho druhého komentáře tak máš pravdu. Myslel jsem, že to funguje, ale nefunguje. Každých 8kb se mi data opakujou. Dík za odpověď. Otázka je ale co s tím?

S tím nic neuděláš. Paměť má jen 8kB. Nemůžeš po ní přeci chtít, aby udržela víc dat, než je fyzicky schopná. Jesli 8kB(= 64kb) nestačí, sežeň si větší.

Aha tak to bude asi můj problém…celou dobu jsem žil v domění, že má 64kb. Ale proč v tom datasheetu teda píšou 8182 * 8? Abych se přiznal tak tohle jsou moje úplně první pokusy s externí pamětí a cokoliv co se jich týká je pro mě v podstatě neznámou. Moc díky za odpovědi…hned je čověk trošku vesejelší když ví, že je zas chyba mezi klávesnicí a židlí.

Paměť má opravdu 64kb (kilo BIT = x1024 bitů). Že má konfiguraci 8192*8 znamená, že je v paměti 8192 adres, na každou lze uložit najednou 8 bitů (1 bajt). To je 8kB (kilo BYTE).