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

 
 
 
Reply to this topicStart new topic
> 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
aaarrr
сообщение Apr 3 2008, 20:34
Сообщение #2


Гуру
******

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



Код
0x00000258  28A10078  STMCSIA   R1!,{R3-R6}   <-падает в аборт здесь

А значение R1 адекватное?
Go to the top of the page
 
+Quote Post
viael
сообщение Apr 3 2008, 21:25
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 beer.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 4 2008, 15:01
Сообщение #4


Гуру
******

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



Цитата(viael @ Apr 3 2008, 23:24) *
Хочу использовать внешнюю срам для размещения отдельных функций в ней.

Зря. Она там 16bit + waitstate обязательный - из Flash быстрее.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
viael
сообщение Apr 5 2008, 06:34
Сообщение #5


Местный
***

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



Цитата(zltigo @ Apr 4 2008, 18:01) *
Зря. Она там 16bit + waitstate обязательный - из Flash быстрее.


На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня.
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Apr 5 2008, 23:02
Сообщение #6


Знающий
****

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



Цитата(viael @ Apr 5 2008, 09:34) *
На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня.


Для запуска программ из внешней памяти лучше SDRAM вешать, быстрее работает и граблей меньше.


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


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 5-09-06
Из: Nsk
Пользователь №: 20 094



Цитата(Vitaliy_ARM @ Apr 6 2008, 05:02) *
Для запуска программ из внешней памяти лучше SDRAM вешать, быстрее работает и граблей меньше.


Ну эта надо бы обосновать?!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 7 2008, 07:14
Сообщение #8


Гуру
******

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



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


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 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
zltigo
сообщение Apr 7 2008, 15:23
Сообщение #12


Гуру
******

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



Код
//---------------------------------------------------------------------------
// 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" все в порядке


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
viael
сообщение Apr 7 2008, 15:25
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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" все в порядке

"
Подтверждаю ревизия "В"
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2008, 15:25
Сообщение #14


Гуру
******

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



Цитата(viael @ Apr 7 2008, 17:03) *
У меня работает с такими настройками:
Код
  PINSEL9 = 0x50555555;

Ну и мусора...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Apr 8 2008, 11:20
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 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


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

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

 


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


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