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
}
administrator: přejmenováno z "FRAM a TWI"