Jump to content

    
Sign in to follow this  
slavka012

LPC1788, MatrixARB

Recommended Posts

Вопрос по регмстру matrixarb.

 

Есть проект с LCD, SDRAM. Ранее вся графика для экрана находилась во внутреннем флеше. Все работало замечательно. Сейчас перенес графику во внешний флеш и сразу начались глюки в виде какого-то мерцания экрана. Если я выключаю отрисовку и просто вхожу в бесконечный цикл мерцание прекращается.

 

Т.е. вроде очевидно что FIFO экрана время от времени не успевает получать данные. Ок. В даташите нашел регистр MATRIXARB, в котором написано, что чтобы отдать приоритет дисплею надо туда записать 0x00000c09. Записал, в этом случае все довольно быстро виснет.

 

Дефолтное значение регистра по даташиту - 0x0000000D

Попробовал записать его - все равно виснет

Посмотрел, что там было до моей записи - 0x00010004

 

Это странно, т.к. до сегодняшнего дня регистр matrixarb не был определен в LPC177x_8x.h там было RESERVED на его месте.

 

Вторая странность, что вот этот 16ый бит по даташиту должен быть всегда нулем:

Table 27. Matrix Arbitration register (MATRIXARB- 0x400F C188) bit description
11:10 PRI_LCD LCD DMA priority. 0
13:12 PRI_USB USB DMA priority. 0
15:14 - Reserved. Read value is undefined, only zero should be written. NA
16 ROM_LAT ROM latency select. Should always be 0. 0
31:17 - Reserved. Read value is undefined, only zero should be written. NA

Возникает подозрение, может я не туда пишу?

xprintf("& LPC_SC->MATRIXARB %x\n", &(LPC_SC->MATRIXARB) );
xprintf("  LPC_SC->MATRIXARB %x\n", LPC_SC->MATRIXARB );

и на выходе:

& LPC_SC->MATRIXARB 400fc188                                                    
  LPC_SC->MATRIXARB 10004

У кого-то есть идеи, что происходит?

 

Поставил breakpoint на ResetISR, значение этого регистра такое же, 0х10004

Записал туда 0x10C09, никакого эффекта

Share this post


Link to post
Share on other sites
Т.е. вроде очевидно что FIFO экрана время от времени не успевает получать данные.

Совсем неочевидно.

Чтобы стало очевидно, надо проверить FIFO_underflow_interrupt бит.

 

А после чего рассчитать интенсивность потока на LCD (в соответствии с настройками LCD) и сравнить с потоком выборки команд, раз уж LCD и память команд сидят на одном интерфейсе.

 

А посмотрев результат - перенести команды обращения к буферу во внутренний флэш или еще лучше - во внутреннюю SRAM.

Share this post


Link to post
Share on other sites
Совсем неочевидно.

Чтобы стало очевидно, надо проверить FIFO_underflow_interrupt бит.

 

Не очевидно? А какие другие варианты? Вопрос не о том, что куда переносить. Вся программа и так во внутреннем флеше, во внешнем флеше только данные.

 

Экран 800*600*8бит, 50Гц = 24МБ/сек. Шина 60MГц,32бит SDRAM = 240MB/sec

Вопрос только в правильной настройке matrix arbitration

Share this post


Link to post
Share on other sites
А какие другие варианты?

Масса. (Более прозаичных. Ключевое слов V-Sync, например. Да и по горизонтали тоже могут быть проблемы... Хотя трудно судить не видя картинку...)

В общем-то, это ваше, конечно, дело.

---

А если нет уверенности "туда ли я пишу"

*( ( volatile unsigned long *) 0x400FC188) ) = 0xC09 (0xC09 - как раз рекомендовано даташитом в вашем случае).

 

Но разбираться в стиле "очевидно-не очевидно" - можно крайне долго.

З.Ы. Ну и арбиртраж я бы устанавливал из когда где-нибудь внутри, еще до настройки всего остального.

P.S.2 Ну и скорость развертки LCD тоже можно поменять. К примеру по ходу работы и посмотреть что будет...

Edited by DpInRock

Share this post


Link to post
Share on other sites
Масса. (Более прозаичных. Ключевое слов V-Sync, например. Да и по горизонтали тоже могут быть проблемы... Хотя трудно судить не видя картинку...)

Что с ним может быть, с V-Syncом, и как это может быть связано с моими обращениями к внешнему флешу?

Share this post


Link to post
Share on other sites

Возможные причины вашей проблемы можно обсуждать вечность. Это неинтересно.

Если есть возможность узнать точно - теоретизировать просто глупо.

Узнайте состояние FIFO_underflow.

Share this post


Link to post
Share on other sites

NXP ответил, что у них баг в документации. Бит 16 должен быть всегда 1. Как это возможно, я что, первый попробовал использовать этот регистр?

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this