Witam
Mam połączoną pamięć Flash AT45db161b z uP Atmega128.
W poniższym programie dokonuje zapisu liczby 0x44 do Flash'a, jednak gdy potem odczytuję pamięć to zz=0xFF
Czy coś może być nie tak w adresowaniu ? (od razu mówię, że jestem początkującym programistą uP i połączenie Flash'a z uP jest raczej ok)
Mam połączoną pamięć Flash AT45db161b z uP Atmega128.
W poniższym programie dokonuje zapisu liczby 0x44 do Flash'a, jednak gdy potem odczytuję pamięć to zz=0xFF
Czy coś może być nie tak w adresowaniu ? (od razu mówię, że jestem początkującym programistą uP i połączenie Flash'a z uP jest raczej ok)
#include <avr/io.h>
#define PORT_SPI PORTB
#define DDR_SPI DDRB
#define SS PB0
#define BUFFER_1_WRITE 0x84
#define BUFFER_2_WRITE 0x87
#define B1_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x88
#define MM_PAGE_TO_B1_XFER 0x53
#define BUFFER_1_READ 0x54
void write_data(unsigned char x);
unsigned char read_data(void);
void Master_init(void);
void write_SPI(unsigned char x);
int main(void)
{
unsigned char zz=0x00;
Master_init();
write_data(0x44);
zz=read_data();
return 0;
}
void Master_init(void)
{
/* Set MOSI, SCK and SS output, all others input */
DDR_SPI = 0x07;
PORT_SPI=0xFF;
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void write_data(unsigned char x)
{
while(!(PINB & 0x10)); //sprawdza RDY-BUSY
PORT_SPI &= ~(1<<SS); //zeruje CS
write_SPI(BUFFER_1_WRITE); //zapis danych do bufora 1
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(x);
PORT_SPI |=(SS<<1); //ustawia CS
while(!(PINB & 0x10)); //sprawdza RDY-BUSY
PORT_SPI &= ~(1<<SS); //zeruje CS
write_SPI(B1_TO_MM_PAGE_PROG_WITHOUT_ERASE); //zapis danych z bufora 1 do FLASH
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
PORT_SPI |=(SS<<1); //ustawia CS
}
void write_SPI(unsigned char x)
{
/* Start transmission */
SPDR = x;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
unsigned char read_data(void)
{
unsigned char data;
while(!(PINB & 0x10)); //sprawdza RDY-BUSY
PORT_SPI &= ~(1<<SS); //zeruje CS
write_SPI(MM_PAGE_TO_B1_XFER); //odczyt z FLASH do bufora 1
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
PORT_SPI |=(SS<<1); //ustawia CS
while(!(PINB & 0x10)); //sprawdza RDY-BUSY
PORT_SPI &= ~(1<<SS); //zeruje CS
write_SPI(BUFFER_1_READ); //odczyt z bufora 1
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
data=SPDR;
PORT_SPI |=(SS<<1); //ustawia CS
return data;
}