|
|
  |
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 3 2008, 21:25
|
Местный
  
Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979

|
Цитата(aaarrr @ Apr 3 2008, 23:34)  Код 0x00000258 28A10078 STMCSIA R1!,{R3-R6} <-падает в аборт здесь А значение R1 адекватное? Вполне R1 = 0x8000000; Указывает на начало срам кторый висит на CS0 Цитата(viael @ Apr 4 2008, 00:13)  Вполне R1 = 0x8000000; Указывает на начало срам кторый висит на CS0 Посыпаю голову пеплом. 0x8000000!!!! указал в target хотя везде по тексту 0x80000000. Оказывается лыжи нормальные. aaarrr
|
|
|
|
|
Apr 5 2008, 06:34
|
Местный
  
Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979

|
Цитата(zltigo @ Apr 4 2008, 18:01)  Зря. Она там 16bit + waitstate обязательный - из Flash быстрее. На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня.
|
|
|
|
|
Apr 5 2008, 23:02
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(viael @ Apr 5 2008, 09:34)  На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня. Для запуска программ из внешней памяти лучше SDRAM вешать, быстрее работает и граблей меньше.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Apr 7 2008, 07:09
|
Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 5-09-06
Из: Nsk
Пользователь №: 20 094

|
Цитата(Vitaliy_ARM @ Apr 6 2008, 05:02)  Для запуска программ из внешней памяти лучше SDRAM вешать, быстрее работает и граблей меньше. Ну эта надо бы обосновать?!
|
|
|
|
|
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
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Apr 7 2008, 15:25
|
Местный
  
Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979

|
Цитата(zltigo @ Apr 7 2008, 18:23)  Код //--------------------------------------------------------------------------- // Initialize EMC for 512K SRAM //--------------------------------------------------------------------------- int extmem_init(void) { EMCCONTROL = EMCCONTROL_ENABLE; // EMC Enable PCONP |= 0x00000800; // Turn On Power EMC PCLK PINSEL6 = 0x00005555; // Bus Configuration PINSEL8 = 0x55555555; // PINSEL9 = 0x10110015; // CS0, BLS0 aka WE, OE, A18-16 EMCSTATICCNFG0 = EMCSTATICCNFG_MW8|EMCSTATICCNFG_BUFFER_ENABLE; EMCSTATICWAITWEN0 = 0; EMCSTATICWAITOEN0 = 0; EMCSTATICWAITRD0 = 1; EMCSTATICWAITPG0 = 0; EMCSTATICWAITWR0 = 0; EMCSTATICWAITTURN0 = 0; EMCSTATICEXTENDEDWAIT = 0; return( 0 ); } Ревизия "B" все в порядке " Подтверждаю ревизия "В"
|
|
|
|
|
Apr 7 2008, 15:25
|

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

|
Цитата(viael @ Apr 7 2008, 17:03)  У меня работает с такими настройками: Код PINSEL9 = 0x50555555; Ну и мусора...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 8 2008, 11:20
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(zltigo @ Apr 7 2008, 18:23)  Код EMCSTATICCNFG0 = EMCSTATICCNFG_MW8|EMCSTATICCNFG_BUFFER_ENABLE; 8-ми битный режим не проверял. Может кто пробовал SRAM на 32 бита?
Сообщение отредактировал Vitaliy_ARM - Apr 8 2008, 11:20
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|