Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-14 16:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-09 11:11 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Добрый день.
Используется отладочная плата с установленным МК 1986ВЕ91Т. Серия МК 1538.
Пытаемся подключить NAND память.Столкнулись со следующей проблемой.
При попытке записать команду чтения ID процессор зависает.
В качестве примера взят код из спецификации.
Код:
int main (void)
{   
  GPIO_Init();
  // EBC Init
  MDR_RST_CLK->PER_CLOCK |= 1 << 30;
  MDR_EBC->CONTROL = ((0 << 12)
                    | (0 << 3)
                    | (1 << 2)); // NAND

  MDR_EBC->NAND_CYCLES = 0xFFFFFFF; // max Timing

  LedCicle (5); // Test Live
  // page 194 Specification;
  // Spec.Version 3.10.0
  // после выполнения следующей этой строки МК виснет
  *((volatile unsigned char *)(0x77200480)) = 0x00; // cmd Read ID
  // закоментировано, так, как все равно не доходит до этого места
//  unsigned char idl = *((volatile unsigned char *)(0x77080000)); // Data Read ID
//  unsigned char idh = *((volatile unsigned char *)(0x77080000)); // Data Read ID

  while (1)
   { LedCicle (1); // Test Live
    }
}

LedCicle (5); - мигание светодиодом - для контроля, что МК работает
если закоментировать строку с записью команды то мигание светодиодами выполняется
Если запись команды происходит, то мигание светодиодом прекращается
Что пробовали:
- устанавливали максимальные (NAND_CYCLES = 0xFFFFFFF) и минимальные (NAND_CYCLES = 0x0) тайминги работы с NAND
- увеличивали и уменьшали частоту ядра.
- Формировали обращение к разным диапазонам. Вместо 0x77200480 использовали адреса 0x10200480, 0x60200480, 0xA0200480
Всегда результат одинаковый. после выполнения команды чтения ID - МК зависает. Под отладкой после зависания невозможно просмотреть содержимое регистров и памяти. Повторное подключение отладчика возможно только после сброса МК (по питанию или от кнопки).
Ошибки в инициализации портов или таймингов не должны приводить к зависанию ядра (моё мнение). EBC должен сформировать сигналы согласно настройкам.Причина зависания - не понятна.
Что делается не так?

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-13 09:08 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Читаю "многочисленные" ответы и спецификацию на микросхему.
Возникает подозрение, что с NAND никто еще не работал на этом контроллере.
Проблема не решена.
По спецификации (глава "Работа с внешней NAND" кроме ВЕ94) возникли следующие вопросы
Спецификация 3.10.0. от 04.10.16

1.На стр.190, после таблицы 140 есть фраза "Контроллер внешней системной шины
во всех режимах не формирует сигналов выборки чипа СЕ."
На стр.193, табл.144 графа ФАЗА ДАННЫХ, для поля ADR[23:21] есть указание
"A[21] сигнализирует о необходимости снятия сигнала выбора кристалла по
завершению текущей команды".
Скорее всего опечатка, так как нет на портах соответствующего вывода.

2.Для работы с ОЗУ, ПЗУ есть диаграммы формирования команд записи-чтения.
Для режима NAND такие диаграммы отсутствуют.Хотелось бы их видеть, упрощает понимание процесса.

3.По регистру MDR_EBC->NAND_CYCLES поле t_alea[3:0]
Описание "Время доступа к регистрам ID."
Правильно понимаю - что это доступ к Идентификационным Данным микросхемы??
Почему это выделено отдельно? Модуль отслеживает соответствующую последовательность, чтобы сформировать задержку?
В описании на микросхему памяти такого параметра не нашел, время чтения всех данных одинаково.
Подключаем микросхему S34ML08G1 (Cypress)

4.Участвует ли в логике работы контроллера EBC сигнал Busy. Или он только отображается в регистре MDR_EBC->CONTROL?

5.По примеру кода в спецификации.
Комментарии указывают, что частота контроллера 100 МГц, хотя разрешенная частота работы 80 МГц.
Издержки копипаста (наверное)?

секция "Чтение ID"

*((volatile unsigned char *) (0x77200480)) = 0x00;
состав команды понятен (согласно таблице 144) - одна проблема останавливает ядро МК.Причины не выяснены.

Секция "Стирание блока"

// Фаза команды
*((volatile unsigned char *)(0x70768300))=0x11;
*((volatile unsigned char *)(0x70768301))=0x22;
*((volatile unsigned char *)(0x70768302))=0x33;
по первой строке все понятно (согласно таблице 144)
вопросы ко второй и третьей строкам.
Изменение значения в младшей тетраде - это "для себя" обозначить номер цикла?
Почему в каждом обращении задается 3 адресных цикла? И в каждом обращении код выполнения завершающей команды
Контроллер EBC отслеживает их количество по внутреннему счетчику (для формирования завершающей команды)?
Поэтому во втором и третьем обращении это поле не имеют значения?
Сразу дурацкий вопрос, если я записал первую строку, контроллер EBC будет обязательно ждать 2-ю и 3-ю,
Или эту операцию можно прервать (например командой записи данных).

6.Можно ли записывать данные в контроллер EBC обращаясь к данным бОльшей разрядности, например
*((volatile unsigned int *)(0x70088000))=0x12345678;

7.Будет ли контроллер EBC работать через каналы DMA при обращении к области памяти 0x3000_0000 –0x3FFF_FFFF
(или 0x:6000_0000 – xDFFF_FFFF) Согласно таблице 142 DMA имеет доступ к этим областям.
С учетом ERRATA ошибка 22 наверное правильно отредактировать таблицу 142(запретить доступ к области памяти 0x:5000_0000 – x5FFF_FFFF)

8.Кто нибудь работал на этом МК с NAND-флешь?

9.Есть отечественные микросхемы памяти объемом от 256 МБайт?

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-13 09:20 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1036
Откуда: Тула
У LDM-Systems есть отладочная плата на 1986ВЕ1 с такой памятью. В разделе "Документация" есть "Демонстрационный пример(1.45 МБ)" в котором, вроде как есть работа с этой памятью. Может это Вам поможет.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-13 11:35 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Посмотрел пример работы. Функции nand_flash_Init, nand_flash_ReadID.
Если отбросить обертки, то все сводится к следующему
Инициализация EBC
MDR_RST_CLK->PER_CLOCK |= 1 << 30;
MDR_EBC->CONTROL = 4; // ((0 << 12)| (0 << 3) |(1 << 2)); // NAND
запись команды на чтение ID
cmd_addr = 0x77200480;
*(volatile unsigned char*)cmd_addr = 0x00;
в моем случае сразу используется константа.
Настройка выводов GPIO не должна влиять на работу EBC.
ps.в данном примере есть ошибка (или опечатка). В функции nand_flash_ReadID первая строка кода (после объявления локальных переменных).Код команды записан в 10-м формате, должен быть HEX. Если это принципиальное отличие - тогда нет слов.
*(volatile unsigned char*)77080000 = 0x00;

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-13 12:58 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Разобрался. МК не виснет.
Причина - неверная настройка регистра MDR_EBC->NAND_CYCLES.
в ходе ряда экспериментов установил следующее
поле t_wp не должно быть равно 15 (0xF). все остальные поля этого регистра установлены 0xF.
то есть с настройкой
MDR_EBC->NAND_CYCLES = 0x0FFFEFFF; работает
с настройкой
MDR_EBC->NAND_CYCLES = 0x0FFFFFFF; не работает
MDR_EBC->NAND_CYCLES = 0x00000000; тоже не работает (но это мой косяк 0 тактов на длительность) Хотя не сказано что задавать нельзя.
возможно есть и другие ограничения. На соотношение между полями (типа как в CAN SJV строго меньше SEG2).
Главное EBC не вешает МК.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-19 12:33 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
очередная засада от EBC.
если зациклить одну команду
Код:
*((volatile unsigned char *)(0x77200480)) = 0x00; // cmd Read ID

то сигналы CLE, ALE, WE формируются (контроль осцилографом)

если в цикле выполнять последовательность
Код:
*((volatile unsigned char *)(0x77200480)) = 0x00; // cmd Read ID
idl = *((volatile unsigned char *)(0x77080000)); // Data Read ID
idh = *((volatile unsigned char *)(0x77080000)); // Data Read ID

то сигналы CLE, ALE, WE отсутствуют, формируется только OE
программные задержки между обращениями к EBC ситуации не меняют.

MDR_EBC->NAND_CYCLES = 0x04AA2466; если это сильно влияет, то куда и что править??

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-23 14:02 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 49
Откуда: ПКК "Миландр"
Сигналы формируются если считывать так:

Код:
while(1)
{  *((volatile unsigned char *)(0x77200480)) = 0x00; // запись команды на чтение ID
   idl = *((volatile unsigned char *)(0x77080000)); // чтение идентификатора NAND (low)
   idh = *((volatile unsigned char *)(0x77280000)); // чтение идентификатора NAND (hight)
   Delay(); // задержка 5-10 мкс
  }


В последнем считывании выставляется флаг - A[21], отпускающий внутренний "chip select" контроллера шины. Считыванием с этим битом необходимо завершать считывание блока данных.

Вот так-же несколько функций в качестве примера, которые могут быть полезны:

Код:
void ReadNand(unsigned long Adress, unsigned short Size, char *data)
{
  int i;
  unsigned char a1, a2, a3 ,a4;

  a1 = Adress >> 0;
  a2 = Adress >> 8;
  a3 = Adress >> 16;
  a4 = Adress >> 24;
 
  *((volatile unsigned char *) (0x70800000)) = a1;
  *((volatile unsigned char *) (0x70800000)) = a2;
  *((volatile unsigned char *) (0x70800000)) = a3;
  *((volatile unsigned char *) (0x70800000)) = a4;
 
  do
  {
  } while((MDR_EBC->CONTROL & 0x80) != 0x80);
 
  for(i=0;i<(Size-1);i++)
  {
    data[i] = *((volatile unsigned char *) (0x70080000));
  }
  data[Size-1] = *((volatile unsigned char *) (0x70280000));
}


Код:
void EraseNand(unsigned long Adress)
{
  unsigned char a2, a3, a4;

  a2 = Adress >> 8;
  a3 = Adress >> 16;
  a4 = Adress >> 24;
 
  *((volatile unsigned char *) (0x70768300)) = a2;
  *((volatile unsigned char *) (0x70768300)) = a3;
  *((volatile unsigned char *) (0x70768300)) = a4;
 
  do
  { 
  } while((MDR_EBC->CONTROL & 0x80) != 0x80);
}


Код:
void WriteNand(unsigned long Adress, unsigned short Size, char *data)
{
  int i;
  unsigned char a1, a2, a3, a4;

  a1 = Adress >> 0;
  a2 = Adress >> 8;
  a3 = Adress >> 16;
  a4 = Adress >> 24;
 
  *((volatile unsigned char *) (0x70800400)) = a1;
  *((volatile unsigned char *) (0x70800400)) = a2;
  *((volatile unsigned char *) (0x70800400)) = a3;
  *((volatile unsigned char *) (0x70800400)) = a4;
 
  for(i=0;i<(Size-1);i++)
  {
    *((volatile unsigned char *) (0x70088000)) = data[i];
  }
  *((volatile unsigned char *) (0x70188000)) = data[Size-1];
 
  do
  {
  } while((MDR_EBC->CONTROL & 0x80) != 0x80);
}

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-23 19:41 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Спасибо за бит [21]. Утром попробуем. Что же в документации про него так "криво" написано? "... снятия сигнала выбора кристалла" - хотя сигнал выбора кристалла в МК не формируется.
Еще пара вопросов (менее актуальных):
1.В приведенных функциях есть "тонкий" момент.
Функция ReadNand последний байт считывается командой
data[Size-1] = *((volatile unsigned char *) (0x70280000)); - бит 21 - все понятно.
Функция WriteNand последний байт записывается командой
*((volatile unsigned char *) (0x70188000)) = data[Size-1]; - бит 21 отсутствует, потому, что есть бит [20] выполнить код завершающей команды или опечатка?

2.В ветке на 1986ВЕ1Т (http://forum.milandr.ru/viewtopic.php?f=34&t=2588#p14120) при обсуждении EBC в режиме NAND сказано что при работе останавливается ядро (в том числе и SysTimer как часть ядра). Для 1986Ве91 - это актуально?
Если это так, то каким образом будет работать передача через DMA? Пример:
DMA инициирует передачу ПАМЯТЬ_ПАМЯТЬ (из ОЗУ в NAND). Если при этом остановится ядро, то это будет нехорошо (если мягко выражаться)

3.У контроллера EBC нет сигналов управления DMA (как например у АЦП или SPI). Каким образом модуль DMA может определять начало следующей транзакции.Ведь операцию ПАМЯТЬ_ПАМЯТЬ DMA (скорее всего) будет выполнять без задержек.

4.Риторический вопрос (сильно зависит от ответа на вопрос №2): Имеет ли смысл использовать DMA, если процессы нельзя "распараллелить" и ядро останавливается.Это ведь, как минимум, проблемы при обработке прерываний.

5.Просто, замечание. Использовать сигнал BUSY и тратить на него "дефицитный" сигнал АЦП - не имеет смысла (кроме совместимости ПО).Сигнал не учавствует в логике работы EBC. С точки зрения кода - нет разницы опрашивать порт напрямую, или регистр EBC->CONTROL.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-27 15:02 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Результат экспериментов.
1.Бит 21 - обеспечил корректное формирование команд после считывания данных.
2.При работе EBC ядро не останавливается.
Запустили аппаратный ШИМ на таймере и управление портом в прерывании от SysTimer.
При этом шла работа с NAND (чтение данных, ID, аббревиатуры)
По осцилографу - фронты сигналов не смещаются (время контроля 10-15 сек).
3. Поле t_alea в регистре MDR_EBC->NAND_CYCLES (биты 20-23) отвечает за паузу между окончанием записи команды и началом чтения не только ID (идентификатор микросхемы) но прочих данных.
4. Длительность поля t_rc должно быть строго больше длительности поля t_rea, для полей t_wc, t_wp - аналогично (t_wc > t_wp).

Пока не выяснены вопросы
1. Запись последнего байта (почему установлен бит 20, а не 21)
*((volatile unsigned char *) (0x70188000)) = data[Size-1];
2. За что отвечает поле t_whr в регистре MDR_EBC->NAND_CYCLES (биты 16-19) изменение значения не влияло на формируемую осцилограмму
2.1 про бит t_rr в регистре MDR_EBC->NAND_CYCLES (биты 24-27) - верим описанию (проверить не представляю как).

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с NAND-памятью
СообщениеДобавлено: 2017-окт-31 09:40 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Цитата:
1. Запись последнего байта (почему установлен бит 20, а не 21)
*((volatile unsigned char *) (0x70188000)) = data[Size-1];

Разобрались. После записи всех данных нужна завершающая команда. Именно это и формируется.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB