Перейти к содержанию
    

SK-MLPC2468 + external SRAM

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

 

Есть связка 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:

 

Есть укого каки идеи?

Проект прилагаю.

 

P.S.Если делаю по аналогии только для внутренней срам (что для эзернет, что для усб срам) то все работает.

SRAM_test2.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А значение R1 адекватное?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А значение R1 адекватное?

 

Вполне R1 = 0x8000000;

Указывает на начало срам кторый висит на CS0

 

Вполне R1 = 0x8000000;

Указывает на начало срам кторый висит на CS0

 

Посыпаю голову пеплом. 0x8000000!!!! указал в target хотя везде по тексту 0x80000000.

 

Оказывается лыжи нормальные. aaarrr :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу использовать внешнюю срам для размещения отдельных функций в ней.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На SK-MLPC24787 512Кх8bit. А вобще чисто в целях изучения камня.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Ну эта надо бы обосновать?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без кэш памяти программу из 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще тоскливее будет, когда этот контроллер будет глючить со статической памятью. Недавно на форум выкладывал осциллограмы работы контроллера статической памяти. Получается что этот контроллер работает неправильно, но при больших задержках работает к счастью для 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;

никаких глюков не обнаружил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня работает с такими настройками:

никаких глюков не обнаружил

 

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

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

"

Подтверждаю ревизия "В"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

EMCSTATICCNFG0 = EMCSTATICCNFG_MW8|EMCSTATICCNFG_BUFFER_ENABLE;

8-ми битный режим не проверял. Может кто пробовал SRAM на 32 бита?

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...