Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC4088+NOR Flash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Polaris
Доброго всем времени суток!

Поднимаю постепенно проект на LPC4088, теперь столкнулся с проблемой реализации работы с NOR-Flash в связке с LPC4088. NOR - MX29GL512, это полный аналог S29GL512. На EMC висит кроме того еще SDRAM, она работает без вопросов, на данный момент я ее отключил, чтобы добиться хоть какой-то работоспособности флэшки. Со стороны железа все в полном порядке. После безуспешных попыток поднять статическую память на EMC написал функции чтения-записи тупо ногодрыганьем - ID памяти читается без ошибок.
Вод код инициализации:

Код
  config.CSn = 1;
  config.AddressMirror = 0;
  config.ByteLane = 0;
  config.DataWidth = 16;

  config.ExtendedWait = 0;
  config.PageMode = 0;

  config.WaitWEn = 0x1f;//0x3;
  config.WaitOEn = 0x1f;//0x3;
  config.WaitWr = 0x1f;//0xA;
  config.WaitPage = 0x1f;//0x8;
  config.WaitRd = 0x1f;//0x5;
  config.WaitTurn = 0x1f;//0x7;
  StaticMem_Init(&config);

  // pause
  TIM_ConfigStruct.PrescaleOption = TIM_PRESCALE_USVAL;
  TIM_ConfigStruct.PrescaleValue  = 1;
  TIM_Init(LPC_TIM0, TIM_TIMER_MODE,&TIM_ConfigStruct);
  TIM_Waitms(1000);


Задержки выставил максимальные, чтобы никаких вопросов не было.

В соответствии со своим соединением изменил lpc_emc.c:

Код
    for(i = 0; i < 32; i++)
    {
      if (i<=15)
        PINSEL_ConfigPin(3,i,1);
      if ((i<=25)||(i==31))
        PINSEL_ConfigPin(4,i,1);
    }
    PINSEL_ConfigPin(5,0,1);


Отдадчик показывает по адресам с 0x90000000 всякий бред, чаще всего 0xff. ID чипа памяти тоже, естественно, не читается, только 0xff:
Код
#define M16(adr)     (*((volatile unsigned short *) (adr)))

  M16(MX29_BASE_ADDRESS + 0x555) = 0xAA;
  M16(MX29_BASE_ADDRESS + 0x2AA) = 0x55;
  M16(MX29_BASE_ADDRESS + 0x555) = 0x90;
  SST_id1 = M16(MX29_BASE_ADDRESS + 0x00);


Поиск подобных проблем в инете дал следующий результат: http://www.lpcware.com/content/forum/lpc17...flash-s29gl128p
Проблема совершенно аналогична, только на lpc1788.

Может быть, кто-то сталкивался именно с проблемой использования EMC и CS1? Я уже во что угодно готов поверить после того, как пару дней назад обнаружил, что на LPC4088 второй порт USB ничего не пишет и не читает, если буфер обмена не расположен в памяти USB, про которую в даташите вообще ничего толком не сказано. Причем вроде бы подобная проблема была на LPC2478 и только на чтение, но, видимо, ошибки у них при использовании режимов работы чуть отличающихся от стандартных не проверяет никто. Если я не прав в этом - ткните меня, пожалуйста, в документацию, где про это написано.

Очень рассчитываю на чей-то опыт в данном вопросе, не хотелось бы работать с внешней памятью ручками. Не очень, правда, понимаю, зачем разработчик платы выбрал именно CS1, но сейчас ничего не могу изменить.

Заранее спасибо!
toweroff
Покажите на схеме, как подключена NOR

Очень вероятно, что с адресацией проблема

Polaris
Цитата(toweroff @ Aug 12 2013, 11:04) *
Покажите на схеме, как подключена NOR

Очень вероятно, что с адресацией проблема


А что конкретно с адресацией? Вроде бы в ручном режиме идентификатор читается успешно, ноги практически все прозвонил - проблем не нашел. Или Вы не про железо?
toweroff
В 16-битном варианте не используется A-1 (=DQ15) и A0 подключается к A1 EMC
Проверьте схемотехнику, возможно просто банально ошиблись с разводкой
Polaris
Цитата(toweroff @ Aug 12 2013, 14:02) *
В 16-битном варианте не используется A-1 (=DQ15) и A0 подключается к A1 EMC
Проверьте схемотехнику, возможно просто банально ошиблись с разводкой

Это вроде бы как раз в байтовом режиме, а у нас вордовый, DQ15 - вывод шины данных. Плюс шифт в SCS я отключил. Схемотехника верна, если бы она не была верна - думаю, что не читался бы идентификатор чипа в режиме ручного управления выводами. Или я что-то не понимаю?
toweroff
Цитата(Polaris @ Aug 12 2013, 16:45) *
Это вроде бы как раз в байтовом режиме, а у нас вордовый, DQ15 - вывод шины данных. Плюс шифт в SCS я отключил. Схемотехника верна, если бы она не была верна - думаю, что не читался бы идентификатор чипа в режиме ручного управления выводами. Или я что-то не понимаю?


так о том и речь sm.gif руками делаете все правильно, а EMC не может. A0 NOR точно приходит на A1 EMC?


посмотрите осциллографом все управляющие сигналы, что там вообще происходит...

Polaris
Цитата(toweroff @ Aug 12 2013, 15:10) *
так о том и речь sm.gif руками делаете все правильно, а EMC не может. A0 NOR точно приходит на A1 EMC?


посмотрите осциллографом все управляющие сигналы, что там вообще происходит...


Нет, не приходит. Все соединено строго один к одному: A0 LPC -> A0 NOR, A1 LPC -> A1 NOR, ... , A24 LPC -> A24 NOR. Все, теперь понял sad.gif Разработчик накосячил с соединением...

Спасибо огромное за решение! Так бы и ходил-бродил вокруг да около sm.gif
Polaris
Цитата(toweroff @ Aug 12 2013, 15:10) *
так о том и речь sm.gif руками делаете все правильно, а EMC не может. A0 NOR точно приходит на A1 EMC?


посмотрите осциллографом все управляющие сигналы, что там вообще происходит...


Хотя нет, знаете, я поспешил. Смещение для 16 бит можно скомпенсировать в SCS, там все настроено верно, так что вопрос остается открытым!
toweroff
Цитата(Polaris @ Aug 12 2013, 18:40) *
Хотя нет, знаете, я поспешил. Смещение для 16 бит можно скомпенсировать в SCS, там все настроено верно, так что вопрос остается открытым!

Возможно, я что-то упустил... Но! Когда этот бит EMCSC в 0, адрес сдвигается на 1 бит. Таким образом, в A0 будет A1

И теперь посмотрите, что получается: A0 в EMC не используется, но вы-то его активно пользуете! Таким образом, дополнительная часть адреса также должна быть сдвинута!


Код
M16(MX29_BASE_ADDRESS + (0x555<<1)) = 0xAA;
M16(MX29_BASE_ADDRESS + (0x2AA<<1)) = 0x55;
M16(MX29_BASE_ADDRESS + (0x555<<1)) = 0x90;
Polaris
Цитата(toweroff @ Aug 12 2013, 17:26) *
Возможно, я что-то упустил... Но! Когда этот бит EMCSC в 0, адрес сдвигается на 1 бит. Таким образом, в A0 будет A1

И теперь посмотрите, что получается: A0 в EMC не используется, но вы-то его активно пользуете! Таким образом, дополнительная часть адреса также должна быть сдвинута!


Код
M16(MX29_BASE_ADDRESS + (0x555<<1)) = 0xAA;
M16(MX29_BASE_ADDRESS + (0x2AA<<1)) = 0x55;
M16(MX29_BASE_ADDRESS + (0x555<<1)) = 0x90;


Нет, к сожалению sad.gif Я уже взвел этот бит сдвига, ничего это не изменило в общей картине.
toweroff
Цитата(Polaris @ Aug 12 2013, 20:55) *
Нет, к сожалению sad.gif Я уже взвел этот бит сдвига, ничего это не изменило в общей картине.

он, в этой ситуации, наоборот должен быть в 0. А все адреса (0x555, 0x2AA) нужно сдвинуть на 1 бит влево, чтобы, после выставления на шину в виде (An-A0)=>(A(n-1)-A1), они все-таки выставились для NOR как надо
Polaris
Цитата(toweroff @ Aug 12 2013, 19:39) *
он, в этой ситуации, наоборот должен быть в 0. А все адреса (0x555, 0x2AA) нужно сдвинуть на 1 бит влево, чтобы, после выставления на шину в виде (An-A0)=>(A(n-1)-A1), они все-таки выставились для NOR как надо


Да нет, вроде бы. Когда смещения на шине нет, то нужно как раз взводить бит, чтобы A0 на EMC соответствовал A0 микросхемы памяти.
toweroff
Цитата(Polaris @ Aug 12 2013, 21:48) *
Да нет, вроде бы. Когда смещения на шине нет, то нужно как раз взводить бит, чтобы A0 на EMC соответствовал A0 микросхемы памяти.

ога, и как это Вы собираетесь обратиться по адресу 0x555, если к 16-битной шине EMC будет обращаться только по четным адресам и A0 вообще не используется?
И учтите, что адрес 0x555 - это адрес для NOR. А теперь почитайте, как работает EMC и что вообще реально будет на шине
Polaris
Цитата(toweroff @ Aug 12 2013, 20:39) *
ога, и как это Вы собираетесь обратиться по адресу 0x555, если к 16-битной шине EMC будет обращаться только по четным адресам и A0 вообще не используется?
И учтите, что адрес 0x555 - это адрес для NOR. А теперь почитайте, как работает EMC и что вообще реально будет на шине

Ага, понял, то есть, как раз без отсутствия смещения нужно смещать адрес. Уже запутался со всем этим. Но вряд ли это поможет, потому что пробовал уже всевозможные комбинации, в том числе и сдвигал адрес на бит влево.
toweroff
Цитата(Polaris @ Aug 12 2013, 23:28) *
Но вряд ли это поможет, потому что пробовал уже всевозможные комбинации, в том числе и сдвигал адрес на бит влево.

1. EMCSC в 0. Это даст нам выставление на пинах EMC (An..A0) адреса в виде (An+1..A1). Если бит будет в 1, то нужный пин A0 не будет работать!
2. К baseaddr прибавляем нужный адрес, сдвинутый на 1 разряд влево
должно работать
Polaris
Цитата(toweroff @ Aug 12 2013, 21:39) *
1. EMCSC в 0. Это даст нам выставление на пинах EMC (An..A0) адреса в виде (An+1..A1). Если бит будет в 1, то нужный пин A0 не будет работать!
2. К baseaddr прибавляем нужный адрес, сдвинутый на 1 разряд влево
должно работать

Так получается, что при EMCSC = 1 A0 в режиме доступа по словам не используется вообще, все линии адреса смещаются вправо на один. А при EMCSC = 0 линии все-таки не смещаются, происходит следующее: static memory addresses are shifted to match the lowest address bit needed for bus width. Но как по мне, это значит, что адрес автоматически сдвигается влево на разряд, или я что-то не понимаю?
toweroff
Цитата(Polaris @ Aug 13 2013, 00:29) *
Так получается, что при EMCSC = 1 A0 в режиме доступа по словам не используется вообще, все линии адреса смещаются вправо на один. А при EMCSC = 0 линии все-таки не смещаются, происходит следующее: static memory addresses are shifted to match the lowest address bit needed for bus width. Но как по мне, это значит, что адрес автоматически сдвигается влево на разряд, или я что-то не понимаю?

да как раз не влево, а вправо! к первому нужному биту, в зависимости от разрядности шины
в 16-битном варианте - на 1 бит, в 32-битном - на два, в 8-битном - вообще не сдвигается (0)
в результате самый младший адресный пин будет принимать значение A1, A2 или A0
Но, т.к. NOR адресуется, все-таки, с нуля, то значение адреса нужно сдвинуть на 1 бит теперь уже влево
Нарисуйте уже картинку себе и все сразу станет ясно. В данном случае физические пины - это некоторое окно, на которое отображается содержимое адреса, когда лезешь в область CS1
Старшая часть дешифруется и начинается работа с EMC и содержимым младшей части (сколько там? A0-A24 или A25). Нарисуйте эту картинку и куча вопросов сразу отпадет сама собой
Polaris
Цитата(toweroff @ Aug 12 2013, 22:43) *
да как раз не влево, а вправо! к первому нужному биту, в зависимости от разрядности шины
в 16-битном варианте - на 1 бит, в 32-битном - на два, в 8-битном - вообще не сдвигается (0)
в результате самый младший адресный пин будет принимать значение A1, A2 или A0
Но, т.к. NOR адресуется, все-таки, с нуля, то значение адреса нужно сдвинуть на 1 бит теперь уже влево
Нарисуйте уже картинку себе и все сразу станет ясно. В данном случае физические пины - это некоторое окно, на которое отображается содержимое адреса, когда лезешь в область CS1
Старшая часть дешифруется и начинается работа с EMC и содержимым младшей части (сколько там? A0-A24 или A25). Нарисуйте эту картинку и куча вопросов сразу отпадет сама собой

Ок, спасибо, что-то я совсем торможу. Завтра попробую вычитать, но я вроде бы пробовал уже и сдвигать, эффекта это не дало. Но в любом случае попробую еще, других вариантов пока нет. Спасибо!
Polaris
Нет, не помогло.
EMCSC = 1, адрес сдвигаю, эффекта ноль:
M16(MX29_BASE_ADDRESS + (0x555<<1)) = 0xAA;

Дело в чем-то системном.
toweroff
Цитата(Polaris @ Aug 13 2013, 10:29) *
Нет, не помогло.
EMCSC = 1, адрес сдвигаю, эффекта ноль:
M16(MX29_BASE_ADDRESS + (0x555<<1)) = 0xAA;

Дело в чем-то системном.

да сколько раз-то!
EMCSC=0!
Polaris
Цитата(toweroff @ Aug 13 2013, 11:16) *
да сколько раз-то!
EMCSC=0!


Какое-то там описание очень противоречивое, в CMSIS вообще другое написано как обычно. Но эффекта нет и при EMCSC = 0, как я уже и говорил.
toweroff
Цитата(Polaris @ Aug 13 2013, 13:25) *
Какое-то там описание очень противоречивое, в CMSIS вообще другое написано как обычно. Но эффекта нет и при EMCSC = 0, как я уже и говорил.

а вот при нулевом бите нужно уже как раз смотреть задержки
что там с тактированием EMC, какая частота?
что показывает осциллограф? совпадают реальные тайминги с рассчитанными?
Polaris
Цитата(toweroff @ Aug 13 2013, 11:31) *
а вот при нулевом бите нужно уже как раз смотреть задержки
что там с тактированием EMC, какая частота?
что показывает осциллограф? совпадают реальные тайминги с рассчитанными?

Частота 60 МГц, 120 поделена на 2. Тайминги выставлены на максимум. Осциллографом тут довольно затруднительно подцепиться, к сожалению.
toweroff
Кстати, а куда подключен по схеме /WR NOR?
Polaris
Цитата(toweroff @ Aug 13 2013, 12:13) *
Кстати, а куда подключен по схеме /WR NOR?


P4.25, как и полагается
toweroff
Проверьте настройки ByteLane на всякий случай. Жаль, что осциллом не заглянуть, много шаманств бы не понадобилось
Что там еще.. ChipSelect=LOW, буферизацию отключить пока, BurstRead тоже
Polaris
Цитата(toweroff @ Aug 13 2013, 13:03) *
Проверьте настройки ByteLane на всякий случай. Жаль, что осциллом не заглянуть, много шаманств бы не понадобилось
Что там еще.. ChipSelect=LOW, буферизацию отключить пока, BurstRead тоже

Ага, уже поотключал это. А что конкретно наиболее характерно посмотреть осциллографом? Возможно, что где-то смог отковырнуть лак на дорожках.
toweroff
/WR относительно /CS, их длительности
Запустить в цикле чтение/запись по паре-тройке адресов, четных и нечетных; посмотреть, что же все-таки на самом деле творится в младших разрядах адреса

Вот еще нашел что интересное:

EMCControl register

Сам по себе EMC-то включен?
Polaris
Цитата(toweroff @ Aug 13 2013, 13:37) *
/WR относительно /CS, их длительности
Запустить в цикле чтение/запись по паре-тройке адресов, четных и нечетных; посмотреть, что же все-таки на самом деле творится в младших разрядах адреса

Вот еще нашел что интересное:

EMCControl register

Сам по себе EMC-то включен?


Ну да, включен, конечно
toweroff
Есть возможность выложить схему в части подключения NOR к контроллеру и окончательный вариант инициализации EMC?
Polaris
Цитата(toweroff @ Aug 13 2013, 14:53) *
Есть возможность выложить схему в части подключения NOR к контроллеру и окончательный вариант инициализации EMC?

Осциллограф никак не помог sad.gif Частоты не те, 30 МГц - не тянет, ничего толком не видно.

Вот схема подключения:



Шину данных не стал приводить, там все один к одному.
Инициализация осталась такой же, как была в начальном посте, разве что сдвиг поставил в адрес для чтения Id.
toweroff
Откуда ж 30 МГц? sm.gif
60 МГц/32 = 500нс ~~ 2MHz
посмотрите, /WR генерится нормально? Помнится, с 2478 были проблемы с ByteLane настройками. Но там генерился /WR или /BLSx, здесь, вроде как, /WR генерится всегда
по схемотехнике, вкупе с EMCSC все в порядке. Посмотрите еще EMCBC, поставьте в 0
Деда Мороза нет, где-то косяк. В железе, судя по всему, ошибок нет.
Polaris
Цитата(toweroff @ Aug 13 2013, 15:46) *
Откуда ж 30 МГц? sm.gif
60 МГц/32 = 500нс ~~ 2MHz
посмотрите, /WR генерится нормально? Помнится, с 2478 были проблемы с ByteLane настройками. Но там генерился /WR или /BLSx, здесь, вроде как, /WR генерится всегда
по схемотехнике, вкупе с EMCSC все в порядке. Посмотрите еще EMCBC, поставьте в 0
Деда Мороза нет, где-то косяк. В железе, судя по всему, ошибок нет.

30 МГц на нем указано, а минимальное разрешение - 0.5 мкс. И четкой картины нет, вроде бы OE есть в районе 500 нс, CE тоже есть, но там сложный сигнал, поймать четко не могу, а вот WE не вижу в упор. Хм...
toweroff
Цитата(Polaris @ Aug 13 2013, 18:33) *
а вот WE не вижу в упор. Хм...

вооот. Очень похоже
Выставьте Byte lane в 1 (STATICCONFIG, бит PB)
Polaris
Цитата(toweroff @ Aug 13 2013, 15:46) *
Откуда ж 30 МГц? sm.gif
60 МГц/32 = 500нс ~~ 2MHz
посмотрите, /WR генерится нормально? Помнится, с 2478 были проблемы с ByteLane настройками. Но там генерился /WR или /BLSx, здесь, вроде как, /WR генерится всегда
по схемотехнике, вкупе с EMCSC все в порядке. Посмотрите еще EMCBC, поставьте в 0
Деда Мороза нет, где-то косяк. В железе, судя по всему, ошибок нет.

Рассмотрел лучше, CS четырежды опускается вниз, все правильно, прололжительность около 500 нс. OE опускается один раз - тоже все верно. WE никак не показывает активность.

Цитата(toweroff @ Aug 13 2013, 16:41) *
вооот. Очень похоже
Выставьте Byte lane в 1 (STATICCONFIG, бит PB)


Я даже не знаю, что сказать... Заработало! Причем прочитал еще раз про Byte Lane еще раз - ну не очевидно же совершенно! Какое отношение он имеет к WE, если я не использую BLS?

Спасибо Вам огромное за решение и проявленное терпение!!!! Вы реально смогли по моим куцым фразам все это понять!!!
toweroff
Цитата(Polaris @ Aug 13 2013, 18:54) *
Я даже не знаю, что сказать... Заработало! Причем прочитал еще раз про Byte Lane еще раз - ну не очевидно же совершенно! Какое отношение он имеет к WE, если я не использую BLS?

я тоже много шишек на лбу заработал, пока это все нашел. Похоже, NXP тянет EMC машину уже давно и добавляет новые грабли, не убирая старых sm.gif
теперь остается правильно задать задержки для максимальной производительности

UPD
И еще момент. Выход RD/BSY - учтите, он Open Drain. Либо резистор к VCC, либо у пина pullup включите
Polaris
Цитата(toweroff @ Aug 13 2013, 17:26) *
я тоже много шишек на лбу заработал, пока это все нашел. Похоже, NXP тянет EMC машину уже давно и добавляет новые грабли, не убирая старых sm.gif
теперь остается правильно задать задержки для максимальной производительности

UPD
И еще момент. Выход RD/BSY - учтите, он Open Drain. Либо резистор к VCC, либо у пина pullup включите

Ну, задержки - это уже рабочий момент, справлюсь sm.gif Но документация у них определенно странная, если не быть в курсе - по ней невозможно добиться результата, не потратив кучу времени на опыты. А еще и CMSIS тоже небезгрешен, вроде хочется все красиво сделать, но сразу не выходит sm.gif

Спасибо за советы еще раз!!! sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.