[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Elektronik 06 января 2006 г. 08:55
В ответ на: Доброе утро. Вопрос по DataFlash(AT45...): прочитать могу, а записать нет, может кто сталкивался или есть грабли. Если не жалко, бросьте рабочий пример для AVR (желательно на С) отправлено <font color=gray>getm</font> 06 января 2006 г. 08:38

Мой примерчик, правда для 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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru