|
|
  |
LPC2214 External Memory Interface, Непонятная временная диаграмма |
|
|
|
Nov 18 2006, 09:51
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Собственно к LPC2214 подключен внешний чип (НЕ ПАМЯТЬ) по параллельной шине. Используется EMC BANK0 в восмиразрядном режиме.
При выполнении нескольких последовательно идущих операций записи CS0 устанавливается в активный уровень и "под ним" идут несколько импульсов BLS0. При выполнении операций чтения все нормально - на каждый импольс OE идет свой импульс CS.
Кроме того, при чередовании операций чтения и записи, независимо от порядка следования, CS захваиывает один импульс OE, при чем всегда ближайший к BLS.
Пример 1:
char C = 2;
*((char *)0x80000000) = C; *((char *)0x80000001) = C + 1; *((char *)0x80000002) = C + 2; *((char *)0x80000003) = C + 3;
Приводит к появлению одного импульса CS и четырех импульсов BLS. Длительность CS перекрывает все импульсы BLS.
Пример 2:
char C = 2; char X;
*((char *)0x80000000) = C; X = *((char *)0x80000001) ; *((char *)0x80000002) = C + 2; X = *((char *)0x80000003);
Приводит к появлению двух импульсов CS. Под первым СНАЧАЛА импульс OE для адреса 0x80000001, ПОТОМ импульс BLS для адреса 0x80000000. Под вторым то-же самое для адресов 0x80000002 0x80000003.
Собственно адрес не имеет значение.
Пример 3:
*((char *)0x80000000) = C; X = *((char *)0x80000000) ;
Или:
*((char *)0x800000E0) = C; X = *((char *)0x80000008) ;
Приводит к тому-же результату, то есть СНАЧАЛА импульс OE, ПОТОМ импульс BLS.
И еще. Обнаружил странную зависимость. Если перед и после оперции записи есть загрузка PC (ветвление, вызов подпрограмм) то все идет как по маслу, на каждый BLS выдается свой CS.
Прошерстил даташиты и ераты. Ничего по этому поводу не нашел.
Кто нибудь может хоть как-то покоментировать?
В догонку.
Проверить на другом CS не имею возможности ввиду занятых пинов другими функциями.
И вопрос: Неужели это MAM такие фортели выкидывает?
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Nov 18 2006, 19:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(amw @ Nov 18 2006, 11:51)  Неужели это MAM такие фортели выкидывает? "Интересные" эффекты. Надо будет свой эксперимент провести. А как банк настроен? А MAM, для проверки и отключить можно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2006, 21:18
|
Частый гость
 
Группа: Свой
Сообщений: 122
Регистрация: 24-05-05
Пользователь №: 5 329

|
наблюдал этот эффект. много волос на себе порвал, пока понял, почему моё устройство работает, мягко говоря, не так. Единственное, что мне помогло получить отдельный cs на каждую операцию - это запись или чтение в другой CS. Запись или чтение во внутреннюю память почему-то не влияла. То ли это EMC как-то "оптимизирует" свою работу, то ли просто ошибка. Я перестал над этим думать, пока не столкнулся с чудесами контроллера внешних прерываний. Просто принял по умолчанию, что данный контроллер работает именно так. Ктати, ещё одно интересное наблюдение есть: при выключении бита RBLE устройство перестаёт работать окончательно, хотя линий bls не использует, а работает исключительно по cs,oe,we
|
|
|
|
|
Nov 20 2006, 15:43
|
Частый гость
 
Группа: Свой
Сообщений: 122
Регистрация: 24-05-05
Пользователь №: 5 329

|
Цитата Других (кроме еще больших, нежели описано) хлопот с инициализацией EINT0 для работы по фронту не замечал. именно это и имелось в виду.
|
|
|
|
|
Nov 21 2006, 19:18
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Выходит не я единственный такой везучий  . Цитата А как банк настроен? А MAM, для проверки и отключить можно. BCFG0 = 0; MAM пока не перенастраивал. Цитата А компилятор ничего лишнего не оптимизирует? Нет. Проверял. Цитата Да и volatile тут поправильней будет. *((volatile char *)0x80000000) = C; В реальной программе как и положено (volatile unsigned char *) Цитата А попробуйте по одному адресу *((volatile char *)0x80000000) = C; X = *((volatile char *)0x80000000) ; Есть подозрение что будет всего одно обращение. Это описано в первом посте. Цитата Я эту проблему решаю вставкой nop между операциями записи. То же самое, AFAIR, и для чтения, т.к. при чтении контроллер шины может продержать СS и OE для нескольких последовательных адресов. nop или другие команды не помогают. Помогает загрузка в PC  . Пока решил проблему двумя функциями: unsigned char ext_read(unsigned char *addr) { return *addr; } void ext_write(unsigned char *addr, unsigned char data) { *addr = data; }
Сообщение отредактировал amw - Nov 21 2006, 19:21
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Nov 22 2006, 08:47
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(zltigo @ Nov 21 2006, 21:55)  Цитата(amw @ Nov 21 2006, 18:18)  BCFG0 = 0;
Странно, очень странно видеть обнуленный. Сейчас не досуг разобраться, но странно. Вы уверены, что "так надо"? Для байтовой SRAM с минимальными ожиданиями - нормально. Цитата(amw @ Nov 21 2006, 21:18)  Цитата Я эту проблему решаю вставкой nop между операциями записи. То же самое, AFAIR, и для чтения, т.к. при чтении контроллер шины может продержать СS и OE для нескольких последовательных адресов.
nop или другие команды не помогают. Помогает загрузка в PC  . ИМХО NOP-ов надо не 1 а на всю операцию чтения/записи. Для BCFG0=0 у Вас и чтение и запись исполняются 3 или 4 CCLK-такта (см описание BCFG0.IDCY). Т.е. нопов надо минимум 4 (ну или может 4-1=3, но врядли) а то и ещё больше. А команды переходов это частный случай этой задержки. Это чтобы CS и OE возвращались. А для того чтобы запись-чтение не переупорядочивались в чтение-запись возможно и одного такта задержки хватит, но это уже зависит от реализации отложенной записи, если это она, если нет то вообще не понятно!  PS А BCFG0.IDCY не пробовали увеличивать? Мож оно будет CS отпускать? PPS Видимо филипс о многом умолчал вот тут: Цитата Figure 10 and Figure 11 are showing typical read and write accesses to external memory. However, variations can be noticed in some particular cases. For example, when the first read access to the memory bank that has just been selected is performed, CS and OE lines may become low one XCLK cycle earlier than it is shown in Figure 10. Likewise, in a sequence of several consecutive write accesses to SRAM, the last write access will look like those shown in Figure 11. On the other hand, leading write cycles in that case will have data valid one cycle longer. Also, isloated write access will be identical to the one in Figure 11.
|
|
|
|
|
Nov 22 2006, 12:20
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Не ожидал такой полемики.
Может повторюсь, извините, но прояснить надо ситуацию, чтоб дискуссия не уходила в сторону.
ВСЕ СИГНАЛЫ ЕСТЬ И СООТВЕТСТВУЮТ РАЗРЯДНОСТИ И АДРЕСНОМУ ПРОСТРАНСТВУ. То есть пины адреса содержат правильный адрес, пины данных содержат правильные данные, сигналы выбора кристалла, разрешение выхода и выбора байта на правильных пинах. Там где и ожидалость. Проблема в последовательности выдачи импульсов. Аппаратная проблема, как я понимаю.
Теперь по существу. BCFG=0 потому как задержки мне не нужны, плата разведена толково, быстродействие внешнего чипа соответствует. Ничего странного не вижу. Я бы еще уменьшил, да EMC не позволяет.
Количество нопов на временную диаграмму не влияет (до 64 включительно).
ldr r0, =0x80000000 mov r1, 5 str r1, [r0] nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ldr r1, [r0]
дает ОДИН ИМПУЛЬС CS ПОД КОТОРЫМ СНАЧАЛА ИМПУЛЬС OE, А ПОТОМ ИМПУЛЬС BLS.
А вот такой код ldr r0, =0x80000000 mov r1, 5 b dummy1 dummy1: str r1, [r0] b dummy2 dummy2: ldr r2, [r0]
дает ДВА ИМПУЛЬСА CS. ПОД ПЕРВЫМ ИМПУЛЬС BLS, А ПОД ВТОРЫМ ИМПУЛЬС OE.
Загрузка в PC ДО операции записи предотвращает объединение операции записи с ПРЕДИДУЩЕЙ операцией чтения или записи. Загрузка в PC ПОСЛЕ операции записи предотвращает объединение операции записи со СЛЕДУЮЩЕЙ операцией чтения или записи.
Сейчас выключу MAM и проверю.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Nov 22 2006, 12:47
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(amw @ Nov 22 2006, 13:20)  Сейчас выключу MAM и проверю. Проверил. Выключил MAM. Просто закоментировал строки его включения. Временная диаграмма стала ПРАВИЛЬНОЙ (с моей точки зрения). На каждую операцию свой собственный CS. А дальше чудеса!!!!!!!!!!!!!!!!!!!! Убрал коментарии - то есть вернул программу в предидущее состояние. Временная диаграмма ОСТАЛАСЬ ПРАВИЛЬНОЙ. Подчеркиваю!!! Коментарий ставился на пустых строках перед и после строк настройки MAM. Потом просто убрал коментарий. В самих настройках MAM НИЧЕГО НЕ МЕНЯЛОСЬ. Перепроверил это несколько раз. Вот сижу тупо смотрю на осцилограф. И что мне теперь делать после этого? Считать, что исправилось само собой? А если фаза луны поменяется?
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Nov 22 2006, 13:51
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(amw @ Nov 22 2006, 13:47)  Цитата(amw @ Nov 22 2006, 13:20)  Сейчас выключу MAM и проверю.
Проверил. Выключил MAM. Просто закоментировал строки его включения. Временная диаграмма стала ПРАВИЛЬНОЙ (с моей точки зрения). На каждую операцию свой собственный CS. А дальше чудеса!!!!!!!!!!!!!!!!!!!! Убрал коментарии - то есть вернул программу в предидущее состояние. Временная диаграмма ОСТАЛАСЬ ПРАВИЛЬНОЙ. Подчеркиваю!!! Коментарий ставился на пустых строках перед и после строк настройки MAM. Потом просто убрал коментарий. В самих настройках MAM НИЧЕГО НЕ МЕНЯЛОСЬ. Перепроверил это несколько раз. Вот сижу тупо смотрю на осцилограф. И что мне теперь делать после этого? Считать, что исправилось само собой? А если фаза луны поменяется?  Нашел зависимость. MAM тут ни при чем. Все дело в задержках. Цитата ИМХО NOP-ов надо не 1 а на всю операцию чтения/записи. Для BCFG0=0 у Вас и чтение и запись исполняются 3 или 4 CCLK-такта (см описание BCFG0.IDCY). Т.е. нопов надо минимум 4 (ну или может 4-1=3, но врядли) а то и ещё больше. А команды переходов это частный случай этой задержки. Это чтобы CS и OE возвращались. Дело в том, что при первом включении EMC использовал максимальные задержки (BCFG), для верности, так сказать. Пронаблюдал описанную в начале ситуацию. Потом заметил зависимость от загрузки в PC и соорудил две функции. Потом перешел на минимальные задержки. Загрузка в PC имеет влияние при BCFG.WST1 и BCFG.WST2 меньше или равно восьми. Почему??? BCFG.IDCY не влияет на структуру временной диаграммы. Только на длительность. нопов нужно столько, сколько тактов дают все задержки + 2 (Почему 2???), то есть с учетом BCFG.WST1, BCFG.WST2 и BCFG.IDCY в сумме + 2. Тогда работает как надо (мне). Непонятным осталось на каком основании вообще происходит объединение импульсов BLS под общим CS. В моем понимании это противоречит требованиям надежности (моим и моей аппаратуры). Я ожидал чегото подобного для операций чтения из памяти, но очень удивляет невозможность повлиять на запись. Для памяти типа BurstROM есть специальный бит, а для записи нет и ГЛАВНОЕ, ЧТО ТАКОЕ ПОВЕЕНИЕ НИГДЕ НЕ ОПИСАНО. Во всяком случае я не нашел ни в User Manual, ни в Errata ни в AN10402. В ПДФах показаны временные диаграммы для одиночных операций. Всем спасибо!!! Надеюсь, что этот топик поможет тем, кто еще не наступил на эти грабли.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|