viael 0 3 апреля, 2008 Опубликовано 3 апреля, 2008 · Жалоба Люди ПАМАГИТЕ не могу больше на грабли наступать. Есть связка 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.Если делаю по аналогии только для внутренней срам (что для эзернет, что для усб срам) то все работает. SRAM_test2.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 апреля, 2008 Опубликовано 3 апреля, 2008 · Жалоба 0x00000258 28A10078 STMCSIA R1!,{R3-R6} <-падает в аборт здесь А значение R1 адекватное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 3 апреля, 2008 Опубликовано 3 апреля, 2008 · Жалоба 0x00000258 28A10078 STMCSIA R1!,{R3-R6} <-падает в аборт здесь А значение R1 адекватное? Вполне R1 = 0x8000000; Указывает на начало срам кторый висит на CS0 Вполне R1 = 0x8000000; Указывает на начало срам кторый висит на CS0 Посыпаю голову пеплом. 0x8000000!!!! указал в target хотя везде по тексту 0x80000000. Оказывается лыжи нормальные. aaarrr :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба Хочу использовать внешнюю срам для размещения отдельных функций в ней. Зря. Она там 16bit + waitstate обязательный - из Flash быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба Зря. Она там 16bit + waitstate обязательный - из Flash быстрее. На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня. Для запуска программ из внешней памяти лучше SDRAM вешать, быстрее работает и граблей меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmvlsi 0 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба Для запуска программ из внешней памяти лучше SDRAM вешать, быстрее работает и граблей меньше. Ну эта надо бы обосновать?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба Без кэш памяти программу из SDRAM выполнять ну очень тоскливо будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 7 апреля, 2008 Опубликовано 7 апреля, 2008 (изменено) · Жалоба Без кэш памяти программу из 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 пока нареканий небыло. Стоит по-дешевле. Даже не знаю что будет работать лучше ... Изменено 7 апреля, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба Еще тоскливее будет, когда этот контроллер будет глючить со статической памятью. Недавно на форум выкладывал осциллограмы работы контроллера статической памяти. Получается что этот контроллер работает неправильно, но при больших задержках работает к счастью для 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; никаких глюков не обнаружил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 7 апреля, 2008 Опубликовано 7 апреля, 2008 (изменено) · Жалоба У меня работает с такими настройками: никаких глюков не обнаружил Значит вам повезло. Какая ревизия чипа? У меня с такими не работает на B, но работало на A! Изменено 7 апреля, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба //--------------------------------------------------------------------------- // 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" все в порядке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба //--------------------------------------------------------------------------- // 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" все в порядке " Подтверждаю ревизия "В" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба У меня работает с такими настройками: PINSEL9 = 0x50555555; Ну и мусора... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 (изменено) · Жалоба EMCSTATICCNFG0 = EMCSTATICCNFG_MW8|EMCSTATICCNFG_BUFFER_ENABLE; 8-ми битный режим не проверял. Может кто пробовал SRAM на 32 бита? Изменено 8 апреля, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться