реклама на сайте
подробности

 
 
> Кто работал с памятью at45db161d или в принципе с at45dbxxxd, пожалуйста подскажите, Проблемы с at45db161d и их решение
lomtev
сообщение Sep 23 2007, 07:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 22-08-07
Пользователь №: 29 980



Так вот, ситуация такая. Использовал примеры программ из аппноутов, переписал коды команд на те которые советуют в даташите. Перепроверил и в других источниках типа занятие 7 с сайт 123avr. Функции написаны правильно. Сначала стираю память, потом пишу в нее значения до 176, тобишь записываю 176 байт. Потом читаю память и сохраняю данные в массив, после вывожу массив на экран (в выводе символов ошибок нет точно), выводятся исключительно значения 255, в рядок так 255 255 255 и т.д. Впихивал вывод значений в разные места программы с выводом разных переменных - вроде все работает. да и в противном случае вывело первоначальное значение массива а это 0. Забавная еще вещь наблюдается, программа написана изначально была для 28 ногово чипа, а я использую 8 ногий так что приходится читать занятость из регистра стуса строчкой типа while (!(SPSR & temp));, я думал что ошибка в ожидании и добавил строчку SPDR = STATUS_REGISTER;, но потом удалил, покуда изменений не произошло.
Так теперь зараза не хочет работать без этой строчки, хотя раньше работала так же криво как и сейчас.
И еще при стирании биты выставляются как я понял в значение 255.
Кто-нибудь сталкивался или работал с данным чипом? В тупике. предположений нет вообще. Если кто хочет помочь и нуждается в наглядной демонстрации кода, то я выложу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sensor_ua
сообщение Sep 23 2007, 08:11
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Похоже, чтение регистра статуса неправильное. Покажи. Вероятно отправляешь не 0xD7+1 байт, а только 0xD7 и сразу читаешь содержимое регистра SPI;)


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
lomtev
сообщение Sep 23 2007, 10:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 22-08-07
Пользователь №: 29 980



Цитата(sensor_ua @ Sep 23 2007, 12:11) *
Похоже, чтение регистра статуса неправильное. Покажи. Вероятно отправляешь не 0xD7+1 байт, а только 0xD7 и сразу читаешь содержимое регистра SPI;)

Кажится и в правду. Сложно без BUSY. Сам код:

#define BUFFER_1_WRITE 0x84 // запись буфера 1
#define BUFFER_2_WRITE 0x87 // запись буфера 2
#define BUFFER_1_READ 0xD4 // чтение буфера 1
#define BUFFER_2_READ 0xD6 // чтение буфера 2
#define STATUS_REGISTER 0xD7 // регистр состояния
#define BLOCK_ERASE 0x50 // очистка 512 страниц

void flash_write(unsigned char flash_data)
{
static unsigned int buffer_counter;
// Хранит позицию в буфере для записи следующего байта

static unsigned int page_counter; // Номер страницы в памяти

unsigned char temp = 0x80; //Проверка 7 бита в регистре статуса

// interrupt выключениеd, SPI port включениеd, master mode, MSB first, SPI mode 3, Fcl/4
SPCR = 0x5C; // включили SPI


// Если установлен флаг "new_data" - то обнулим счетчики
if(new_data) // страниц и буферов
{
buffer_counter = 0; // писАть в начало буфера
page_counter = 0; // писАть в нулевую страницу
new_data = 0; // сбросить "new_data" флаг
}

//Вот здесь вопрос - из даташита как я понял надо писать до chip_select
SPDR = STATUS_REGISTER; //Вот тут как раз тема с не важным байтом
while (!(SPSR & temp)); // ждем пока память освободится
//Вот тут как раз тема с не важным байтом
PORTB &= ~DF_CHIP_SELECT; // включение DataFlash

SPDR = BUFFER_1_WRITE;
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = 0x00; // не важно
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = (char)(buffer_counter>>8); // не важно
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = (char)buffer_counter; // buffer address
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = (char)flash_data; //write data into SPI Data Register
while (!(SPSR & temp)); // ожидание завершения передачи

PORTB |= DF_CHIP_SELECT; // выключение DataFlash

last_byte_position_buffer = buffer_counter;
// сохранили в какую ячейку буфера был записан последн. байт
buffer_counter++;
// Хранит позицию в буфере для записи байта
}


void flash_read(){

unsigned int page_counter = 0;
unsigned int buffer_counter = 0;
unsigned char temp = 0x80;

SPCR = 0x5C; //Включили SPI
PORTB &= ~DF_CHIP_SELECT; // включаем DataFlash

/* Закоментировано, покуда записываю только 176 байт, даже страницу буфера не заполняю, поэтому решил просто записать-прочитать из буфера. Было предположение что функция стирания выставляет 0xFF, а я этой командой пишу это все в буфер из страницы памяти и получаю все байты 0xFF, закоментиорвал но результата не дало. Вот.

SPDR = MM_PAGE_TO_B1_XFER; // передаём страницу в буфер 1
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = (char)(page_counter >> 6);
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = (char)(page_counter << 2);
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; //не имеющий значения байт
while (!(SPSR & temp)); // ожидаем завершения передачи
*/
//Начинается отсюда

SPDR = BUFFER_1_READ; // читаем из буфера 1
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // не имеющего значения байт
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // начать с адреса 0 буфера
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
for (buffer_counter =0; buffer_counter < 176; buffer_counter++)
{
SPDR = 0xFF;
// записываем фиктивное значение в начало сдвигового регистра

while (!(SPSR & temp)); // ожидаем завершения передачи

bt_word[buffer_counter] = (int)SPDR;
// воспроизводим данные из сдвигового регистра
}
PORTB |= DF_CHIP_SELECT; // выключение DataFlash
}

Есть предположение что кривые темы с битами адреса, со всякими смещениями битов влево вправо. Надо будет проработать четко по даташиту. Вот вопрос адрес пишется с BF9 до BF0 или наоборот, тобишь единица должна накидываться начиная со старшего или младшего бита?

Сообщение отредактировал lomtev - Sep 23 2007, 10:08
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- lomtev   Кто работал с памятью at45db161d или в принципе с at45dbxxxd, пожалуйста подскажите   Sep 23 2007, 07:48
- - sensor_ua   Цитатая понял надо писать до chip_select Неправиль...   Sep 23 2007, 10:40
|- - lomtev   Цитата(sensor_ua @ Sep 23 2007, 14:40) Не...   Sep 23 2007, 10:59
- - sensor_ua   ЦитатаSPDR = STATUS_REGISTER; while (!(SPSR ...   Sep 23 2007, 11:07
|- - lomtev   Написал аналог предложенного выше цикла... вот что...   Sep 23 2007, 18:24
- - sensor_ua   Ну а остальные команды обрамить CS? Вот примерчик ...   Sep 23 2007, 18:40
|- - lomtev   Цитата(sensor_ua @ Sep 23 2007, 22:40) Ну...   Sep 23 2007, 18:51
|- - lomtev   Цитата(lomtev @ Sep 23 2007, 22:51) ДА вр...   Sep 23 2007, 20:02
- - sensor_ua   Чтение/запись буфера не требуют проверки статуса н...   Sep 23 2007, 20:05
- - lomtev   Я уже начал искать совершенно тупые варианты и наз...   Sep 23 2007, 20:05
|- - OLEG_BOS   Цитата(lomtev @ Sep 23 2007, 23:05) Я уже...   Sep 23 2007, 20:16
|- - lomtev   Цитата(OLEG_BOS @ Sep 24 2007, 00:16) В к...   Sep 23 2007, 20:25
|- - OLEG_BOS   Цитата(lomtev @ Sep 23 2007, 23:25) Ясно,...   Sep 23 2007, 20:28
- - sensor_ua   )) MISO - Master Input Slave Output MOSI - Master ...   Sep 23 2007, 20:32
|- - lomtev   Цитата(sensor_ua @ Sep 24 2007, 00:32) ))...   Sep 23 2007, 20:59
- - sensor_ua   Цитатая не понял что есть такое. Вот-вот. Проблема...   Sep 23 2007, 21:02
|- - lomtev   Цитата(sensor_ua @ Sep 24 2007, 01:02) Во...   Sep 23 2007, 21:05
- - sensor_ua   Цитатаона может работать и на пяти Для этого нужно...   Sep 23 2007, 21:13
- - Snaky   Цитата(lomtev @ Sep 23 2007, 14:48) Кто-н...   Sep 24 2007, 03:53
- - sensor_ua   ЦитатаЕсть готовая рабочая билиотека А была надежд...   Sep 24 2007, 04:12
|- - lomtev   Цитата(sensor_ua @ Sep 24 2007, 08:12) А ...   Sep 24 2007, 14:00
|- - zltigo   Цитата(lomtev @ Sep 24 2007, 17:00) в 8 н...   Sep 24 2007, 15:10
- - GDI   Раньше выпускались АТ45 с какой то буквой(вроде , ...   Sep 24 2007, 12:01
- - sensor_ua   ЦитатаВозможно удивитесь Не принимайте так близко ...   Sep 24 2007, 14:30
|- - lomtev   Цитата(sensor_ua @ Sep 24 2007, 18:30) Не...   Sep 24 2007, 20:01
- - lomtev   В прикрепленном файле функции. Файл не большой пос...   Sep 24 2007, 21:16
- - sensor_ua   1) Прерывания пока разрешать не нужно (в setup()),...   Sep 25 2007, 03:34
|- - lomtev   1. В setup написал #asm("cli") // запре...   Sep 25 2007, 17:49
|- - rezident   Цитата(lomtev @ Sep 25 2007, 23:49) Парни...   Sep 25 2007, 18:10
- - GDI   Вот библиотека с которой я работаю, инициализация ...   Sep 25 2007, 06:44
- - lomtev   Предложенный исходник, написан явно не для Codevis...   Sep 25 2007, 18:38
|- - rezident   Цитата(lomtev @ Sep 26 2007, 00:38) Предл...   Sep 25 2007, 18:49
- - lomtev   ТАк парни, кажись пошло г**вно по трубам, перепаял...   Sep 25 2007, 18:59
- - sensor_ua   А какой проц? пока почему-то думал, что мега16.   Sep 25 2007, 19:25
- - lomtev   Всё парни.... всё заработало, по крайней мере перв...   Sep 25 2007, 19:31
- - urasinov   ЦитатаВторая - Не знаю почему но программатор (Обы...   Sep 26 2007, 04:06
- - GDI   Программатор все же лучше сделать покруче, наприме...   Sep 26 2007, 06:58
- - lomtev   Фишка не в самом программаторе, а в компе, если пр...   Sep 26 2007, 17:28
- - lomtev   Заметил странную штуку. Была проблема что у меня н...   Sep 26 2007, 19:48
- - sensor_ua   А unsigned char k не пробовал?   Sep 26 2007, 20:43
|- - lomtev   Цитата(sensor_ua @ Sep 27 2007, 00:43) А ...   Sep 27 2007, 16:29
- - lomtev   Я иногда дивлюсь своему аналитическому уму Добав...   Sep 27 2007, 18:19
- - sensor_ua   eds == 0xFF для Цитатаfor(i=0; i<eds; i++) //Р...   Sep 27 2007, 18:41
- - lomtev   Я бобер хитрый и вывел значение которое должно ото...   Sep 27 2007, 20:33
- - Ivaxa   Решил и про свою проблему написать. При замене AT4...   Jan 23 2008, 13:13
- - uriy   А какую частоту CLK используете? У меня при частот...   Jan 23 2008, 19:15
- - Roger   Помогите решить проблемы, курсач нужно было сдать ...   Dec 11 2009, 13:47
- - GDI   Программатор пробовали от схемы отключать?   Dec 14 2009, 11:50
- - Roger   Цитата(GDI @ Dec 14 2009, 14:50) Программ...   Dec 15 2009, 19:11


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016