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

 
 
> SK-MLPC2468 + external SRAM, требуется совет знающих
viael
сообщение Apr 3 2008, 20:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



Люди ПАМАГИТЕ не могу больше на грабли наступать.

Есть связка SK-MLPC24787 от starterkit.ru + SkyLink + uVision3 3.53(компилер RealVew 3.1.0.93).
Хочу использовать внешнюю срам для размещения отдельных функций в ней.
шаг первый:
после стартапа Си-шной фунцией инициализирую EMC. Последовательно заполняю все ячейки внешней срам, потом считываю, сравниваю все ОК.
шаг второй:
переношу функцию инициализации в стартап. Повторяю процедуру все ОК полет нормальный.
шаг третий:
указываю линкеру разместить какую либо функцию во внешней памяти. После этого
начинаю выпадать DAbort на этапе __scatterload_copy

Код
                 __scatterload_copy:
0x00000250  E2522010  SUBS      R2,R2,#0x00000010
0x00000254  28B00078  LDMCSIA   R0!,{R3-R6}
0x00000258  28A10078  STMCSIA   R1!,{R3-R6}   <-падает в аборт здесь
0x0000025C  8AFFFFFB  BHI       __scatterload_copy(0x00000250)
0x00000260  E1B02E82  MOVS      R2,R2,LSL #29
0x00000264  28B00030  LDMCSIA   R0!,{R4-R5}
0x00000268  28A10030  STMCSIA   R1!,{R4-R5}
0x0000026C  45904000  LDRMI     R4,[R0]
0x00000270  45814000  STRMI     R4,[R1]
0x00000274  E1A0F00E  MOV       PC,R14


для того чтобы убедиться что с EMC все ок до входа в __main делаю пробную запись в срам,

Код
PCONP_OFS                EQU     0x0C4     ; SCB Base Address
PINSEL_BASE_ADDR        EQU        0xE002C000
PINSEL6_OFS                EQU        0x18
PINSEL8_OFS                EQU        0x20
PINSEL9_OFS                EQU        0x24
EMC_BASE_ADDR            EQU        0xFFE08000
EMC_STA_CFG0_OFS        EQU        0x200
EMC_STA_WAITWEN0_OFS    EQU        0x204
EMC_STA_WAITOEN0_OFS    EQU        0x208
EMC_STA_WAITRD0_OFS        EQU        0x20C
EMC_STA_WAITPAGE0_OFS    EQU        0x210
EMC_STA_WAITWR0_OFS        EQU        0x214
EMC_STA_WAITTURN0_OFS    EQU        0x218



                MOV     R1, #1
                LDR     R0, =EMC_BASE_ADDR
                STR     R1,[R0]
            ;PCONP  |= 0x00000800;  /* Turn On EMC PCLK */
                LDR     R0, =SCB_BASE
                LDR     R1,[R0,#PCONP_OFS]
                ORR     R1,R1,#0x00000800;/* Turn On EMC PCLK */
                STR     R1,[R0,#PCONP_OFS]
            ;PINSEL6 = 0x00005555;
                LDR     R1, =0x00005555
                LDR     R0, =PINSEL_BASE_ADDR
                STR     R1,[R0,#PINSEL6_OFS]
            ;PINSEL8 = 0x55555555;
                LDR     R1, =0x55555555
                STR     R1,[R0,#PINSEL8_OFS]
            ;PINSEL9 = 0x50555555;
                LDR     R1, =0x50555555
                STR     R1,[R0,#PINSEL9_OFS]
            ;EMC_STA_CFG0 = 1<<19;
                LDR     R1, =0x00080000
                LDR     R0, =EMC_BASE_ADDR
                STR     R1,[R0,#EMC_STA_CFG0_OFS]
            ;EMC_STA_WAITWEN0 = 0;
                LDR     R1, =0
                STR     R1,[R0,#EMC_STA_WAITWEN0_OFS]
            ;EMC_STA_WAITOEN0  = 0x0;
                LDR     R1, =0
                STR     R1,[R0,#EMC_STA_WAITOEN0_OFS]
            ;EMC_STA_WAITRD0   = 0x1;
                LDR     R1, =1
                STR     R1,[R0,#EMC_STA_WAITRD0_OFS]
            ;EMC_STA_WAITPAGE0 = 0x0;
                LDR     R1, =0
                STR     R1,[R0,#EMC_STA_WAITPAGE0_OFS]
            ;EMC_STA_WAITWR0   = 0x0;
                LDR     R1, =0
                STR     R1,[R0,#EMC_STA_WAITWR0_OFS]
            ;EMC_STA_WAITTURN0 = 0x0;
                LDR     R1, =0
                STR     R1,[R0,#EMC_STA_WAITTURN0_OFS]

            ;external ram write test
                LDR     R1, =3
                LDR     R0, =0x80000000
                STR     R1,[R0]
                STMIA   R0!,{R3-R6}


все работает,
но как только начинается копирование в __scatterload_copy падает в аборт.

Потом баг второй обнаружился уже позже когда я попытался отлаживаться не на железе, а в
симуляторе.Начал выпадать в DAbort здесь,

Код
                MOV     R1, #1
                LDR     R0, =EMC_BASE_ADDR
                STR     R1,[R0]
            ;PCONP  |= 0x00000800;  /* Turn On EMC PCLK */
                LDR     R0, =SCB_BASE
                LDR     R1,[R0,#PCONP_OFS]
                ORR     R1,R1,#0x00000800;/* Turn On EMC PCLK */
                STR     R1,[R0,#PCONP_OFS]


хотя в "железе" этот участок кода работал без проблем. Уже не знаю кому доверять симулятору или "железу",
может и сам подглюкиваю wacko.gif

Есть укого каки идеи?
Проект прилагаю.

P.S.Если делаю по аналогии только для внутренней срам (что для эзернет, что для усб срам) то все работает.
Прикрепленные файлы
Прикрепленный файл  SRAM_test2.rar ( 30.06 килобайт ) Кол-во скачиваний: 44
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 7 2008, 07:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Без кэш памяти программу из SDRAM выполнять ну очень тоскливо будет.
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Apr 7 2008, 13:02
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(aaarrr @ Apr 7 2008, 10:14) *
Без кэш памяти программу из SDRAM выполнять ну очень тоскливо будет.


Еще тоскливее будет, когда этот контроллер будет глючить со статической памятью. Недавно на форум выкладывал осциллограмы работы контроллера статической памяти. Получается что этот контроллер работает неправильно, но при больших задержках работает к счастью для SRAM стабильно неправильно. При обращении к памяти по адресам (к примеру) от 0 до 8, фактически обращается так 1,0,3,2,5,4,7,6,8 (было проверено в режиме 32-х разрядной SRAM). Для того, кто использует саму память SRAM и при больших задержках чтения создается иллюзия, что она работает правильно (SRAM
всеравно в каком порядке туда будут писать, главное чтобы в том порядке и считывали, некоторые разработчики пользуются этим при разводке). Но это говорит о том, что контроллер сделан не по спецификации. По осциллограммам было видно, что адрес меняется во время импулься READ, чего не должно быть. Еще одна неприятная вешь, это уменьшение длительности сигнала READ в несколько раз, при чтении каждого 16-го двойного слова! 8-ми и 16-ти разрядный режим не проверял. Думаю что это источник потенциальных глюков, возможно некоторые виды SRAM могут сбоить из-за коротких импульсов READ.

Работаю с CPLD.
Пока самую большую скорость чтения получил при таких настройках:
Запись не использую.
Код
EMC_STA_WAITWEN0  = 0x2;
EMC_STA_WAITOEN0  = 0x2;
EMC_STA_WAITRD0   = 0x06;
EMC_STA_WAITPAGE0 = 0x1F;
EMC_STA_WAITWR0   = 0x1F;
EMC_STA_WAITTURN0 = 0xF;


В начале ориентировались на работу SRAM, по переднему фронту READ должен быть правильный адрес, который контроллер должен был выставить до., в этот момент память по этому адресу выставляет данные. По заднему фронту контроллер считывает данные с шины. Еще память не обязательно должна сразу по фронту считывать адрес, может считать его и позже, главное должна успеть выставить данные. При уменьшении EMC_STA_WAITRD0 контроллер начинает менять адрес вместе с передним фронтом, при больших задержках - немного дальше от начала READ. Если у кого-то осциллограмы другие, сообщите пожалуйста.
На днях оформлю отчет и отправлю NXP.

На на контроллер SDRAM пока нареканий небыло. Стоит по-дешевле.
Даже не знаю что будет работать лучше ...

Сообщение отредактировал Vitaliy_ARM - Apr 7 2008, 13:06


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
viael
сообщение Apr 7 2008, 15:03
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



Цитата(Vitaliy_ARM @ Apr 7 2008, 16:02) *
Еще тоскливее будет, когда этот контроллер будет глючить со статической памятью. Недавно на форум выкладывал осциллограмы работы контроллера статической памяти. Получается что этот контроллер работает неправильно, но при больших задержках работает к счастью для SRAM стабильно неправильно. При обращении к памяти по адресам (к примеру) от 0 до 8, фактически обращается так 1,0,3,2,5,4,7,6,8 (было проверено в режиме 32-х разрядной SRAM). Для того, кто использует саму память SRAM и при больших задержках чтения создается иллюзия, что она работает правильно (SRAM
всеравно в каком порядке туда будут писать, главное чтобы в том порядке и считывали, некоторые разработчики пользуются этим при разводке). Но это говорит о том, что контроллер сделан не по спецификации. По осциллограммам было видно, что адрес меняется во время импулься READ, чего не должно быть. Еще одна неприятная вешь, это уменьшение длительности сигнала READ в несколько раз, при чтении каждого 16-го двойного слова! 8-ми и 16-ти разрядный режим не проверял. Думаю что это источник потенциальных глюков, возможно некоторые виды SRAM могут сбоить из-за коротких импульсов READ.

Работаю с CPLD.
Пока самую большую скорость чтения получил при таких настройках:
Запись не использую.
Код
EMC_STA_WAITWEN0  = 0x2;
EMC_STA_WAITOEN0  = 0x2;
EMC_STA_WAITRD0   = 0x06;
EMC_STA_WAITPAGE0 = 0x1F;
EMC_STA_WAITWR0   = 0x1F;
EMC_STA_WAITTURN0 = 0xF;


В начале ориентировались на работу SRAM, по переднему фронту READ должен быть правильный адрес, который контроллер должен был выставить до., в этот момент память по этому адресу выставляет данные. По заднему фронту контроллер считывает данные с шины. Еще память не обязательно должна сразу по фронту считывать адрес, может считать его и позже, главное должна успеть выставить данные. При уменьшении EMC_STA_WAITRD0 контроллер начинает менять адрес вместе с передним фронтом, при больших задержках - немного дальше от начала READ. Если у кого-то осциллограмы другие, сообщите пожалуйста.
На днях оформлю отчет и отправлю NXP.

На на контроллер SDRAM пока нареканий небыло. Стоит по-дешевле.
Даже не знаю что будет работать лучше ...


У меня работает с такими настройками:
Код
  EMC_CTRL = 0x00000001;

  PCONP  |= 0x00000800;        /* Turn On EMC PCLK */

  PINSEL6 = 0x00005555;
  PINSEL8 = 0x55555555;
  PINSEL9 = 0x50555555;

  EMC_STA_CFG0 = 1<<19;


  EMC_STA_WAITWEN0  = 0x0;
  EMC_STA_WAITOEN0  = 0x0;
  EMC_STA_WAITRD0   = 0x1;
  EMC_STA_WAITPAGE0 = 0x0;
  EMC_STA_WAITWR0   = 0x0;
  EMC_STA_WAITTURN0 = 0x0;
  EMC_STA_EXT_WAIT =  0;

никаких глюков не обнаружил
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Apr 7 2008, 15:07
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(viael @ Apr 7 2008, 18:03) *
У меня работает с такими настройками:
никаких глюков не обнаружил


Значит вам повезло. Какая ревизия чипа? У меня с такими не работает на B, но работало на A!

Сообщение отредактировал Vitaliy_ARM - Apr 7 2008, 15:08


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 23:55
Рейтинг@Mail.ru


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