|
SK-MLPC2468 + external SRAM, требуется совет знающих |
|
|
|
Apr 3 2008, 20:24
|
Местный
  
Группа: Свой
Сообщений: 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] хотя в "железе" этот участок кода работал без проблем. Уже не знаю кому доверять симулятору или "железу", может и сам подглюкиваю Есть укого каки идеи? Проект прилагаю. P.S.Если делаю по аналогии только для внутренней срам (что для эзернет, что для усб срам) то все работает.
|
|
|
|
|
 |
Ответов
|
Apr 7 2008, 13:02
|
Знающий
   
Группа: Свой
Сообщений: 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
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Apr 7 2008, 15:03
|
Местный
  
Группа: Свой
Сообщений: 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; никаких глюков не обнаружил
|
|
|
|
|
Apr 7 2008, 15:07
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(viael @ Apr 7 2008, 18:03)  У меня работает с такими настройками: никаких глюков не обнаружил Значит вам повезло. Какая ревизия чипа? У меня с такими не работает на B, но работало на A!
Сообщение отредактировал Vitaliy_ARM - Apr 7 2008, 15:08
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
Сообщений в этой теме
viael SK-MLPC2468 + external SRAM Apr 3 2008, 20:24 aaarrr Код0x00000258 28A10078 STMCSIA R1!,{R3-R6}... Apr 3 2008, 20:34 viael Цитата(aaarrr @ Apr 3 2008, 23:34) Код0x0... Apr 3 2008, 21:25 zltigo Цитата(viael @ Apr 3 2008, 23:24) Хочу ис... Apr 4 2008, 15:01 viael Цитата(zltigo @ Apr 4 2008, 18:01) Зря. О... Apr 5 2008, 06:34  Vitaliy_ARM Цитата(viael @ Apr 5 2008, 09:34) На SK-M... Apr 5 2008, 23:02   dmtr Цитата(Vitaliy_ARM @ Apr 6 2008, 05:02) Д... Apr 7 2008, 07:09   zltigo Цитата(viael @ Apr 7 2008, 17:03) У меня ... Apr 7 2008, 15:25 zltigo Код//---------------------------------------------... Apr 7 2008, 15:23 viael Цитата(zltigo @ Apr 7 2008, 18:23) Код//-... Apr 7 2008, 15:25 Vitaliy_ARM Цитата(zltigo @ Apr 7 2008, 18:23) КодEMC... Apr 8 2008, 11:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|