[an error occurred while processing this directive]
|
Мой примерчик, правда для 4-х микросхем.
Инициализация SPI
SPCR = 0x5c;
union fla
{
volatile unsigned long l_write_LAST;
volatile unsigned char b_write_LAST[4];
}flas;union bla
{
volatile unsigned int fl_sigg;
volatile unsigned char b_sigg[2];
}wrfl;
unsigned char write_SPI(unsigned char to_SPI)
{
SPDR = to_SPI;
while (!(SPSR & 0x80));
return SPDR;
}unsigned char sta_FLASH(void)
{
PORTD = PORTD | 0xe0;
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
write_SPI(0x57); // Запрос состояния
read_SPI = write_SPI(0xff); // Холостой байт
PORTD = PORTD | 0xe0;
return read_SPI;
}void read_page(void)
{
while((sta_FLASH() & 0x80) != 0x80);
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
cmd_byte[0] = 0x53; // Чтение страницы в буфер 1
cmd_byte[1] = (unsigned char)(PAGE >> 6);
cmd_byte[2] = (unsigned char)(PAGE << 2);
cmd_byte[3] = 0x00;
for(ind_BUF = 0; ind_BUF < 4; ind_BUF = ind_BUF + 1) write_SPI(cmd_byte[ind_BUF]);
PORTD = PORTD | 0xe0;
}void write_page(void)
{
while((sta_FLASH() & 0x80) != 0x80);
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
cmd_byte[0] = 0x83; // Программирование страницы буфером 1
cmd_byte[1] = (unsigned char)(PAGE >> 6);
cmd_byte[2] = (unsigned char)(PAGE << 2);
cmd_byte[3] = 0x00;
for(ind_BUF = 0; ind_BUF < 4; ind_BUF = ind_BUF + 1) write_SPI(cmd_byte[ind_BUF]);
PORTD = PORTD | 0xe0;
}void read_buf(unsigned int num_READ) // Чтение из буфера num_READ байт
{
while((sta_FLASH() & 0x80) != 0x80);
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
write_SPI(0x54); // Чтение буфера 1
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00); // Нашел - Урааааа = надо было вставить еще одно чтение
for(ind_BUF = 0; ind_BUF < num_READ; ind_BUF = ind_BUF + 1) dest[ind_BUF] = write_SPI(0xff);
PORTD = PORTD | 0xe0;
}void cmp_page(void)
{
while((sta_FLASH() & 0x80) != 0x80);
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
cmd_byte[0] = 0x60; // Сравнение страницы с буфером 1
cmd_byte[1] = (unsigned char)(PAGE >> 6);
cmd_byte[2] = (unsigned char)(PAGE << 2);
cmd_byte[3] = 0x00;
for(ind_BUF = 0; ind_BUF < 4; ind_BUF = ind_BUF + 1) write_SPI(cmd_byte[ind_BUF]);
while(((read_SPI = sta_FLASH()) & 0x80) != 0x80);
PORTD = PORTD | 0xe0;
}void clr_page(void) // Стирание страницы
{
while((sta_FLASH() & 0x80) != 0x80);
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
cmd_byte[0] = 0x81; // Стирание страницы
cmd_byte[1] = (unsigned char)(PAGE >> 6);
cmd_byte[2] = (unsigned char)(PAGE << 2);
cmd_byte[3] = 0x00;
for(ind_BUF = 0; ind_BUF < 4; ind_BUF = ind_BUF + 1) write_SPI(cmd_byte[ind_BUF]);
PORTD = PORTD | 0xe0;
}
void write_buf(void) // Заполнение буффера
{
while((sta_FLASH() & 0x80) != 0x80);
if(CS_FL == 0) PORTD = PORTD & CS1;
if(CS_FL == 1) PORTD = PORTD & CS2;
if(CS_FL == 2) PORTD = PORTD & CS3;
if(CS_FL == 3) PORTD = PORTD & CS4;
write_SPI(0x84); // Запись буфера 1
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for(ind_BUF = 0; ind_BUF < 528;ind_BUF = ind_BUF + 1) write_SPI(dest[ind_BUF]);
PORTD = PORTD | 0xe0;
}
E-mail: info@telesys.ru