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

Еще интереснее стало. Вчера код работал прекрасно. Прихожу с утра, загружаю абсолютно тот же код - вместо картинки в память опять записывается какое-то дерьмо...Что происходит???????????????????????

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


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

Вероятнее всего что-то мешало DMA в процессе записи во внешнюю память - это недочеты самой VDK.

 

 

Вы точно даете преимущество DMA над процессором при обращении к памяти?

*pEBIU_AMGCTL |= 0x100;

 

Иначе, как известно, LWIP не работает

 

 

 

Еще интереснее стало. Вчера код работал прекрасно. Прихожу с утра, загружаю абсолютно тот же код - вместо картинки в память опять записывается какое-то дерьмо...Что происходит???????????????????????

 

Вообще-то так бывает, когда что-то нужное не инициализировано

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


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

Да, я установил cdmaprio в 1, один хрен.

 

Сузил проблему.

 

Вобщем, после загрузки всех данных во внешнюю память в регистре DMA1_0_IRQ_STATUS бит DMA_DONE устанавливается в 1, а бит DMA_RUN НЕ переходит в 0, хотя должен. Вызов функции printf("DMA done") переводит бит DMA_RUN в нулевое состояние (хрен его знает почему).

 

Если не использовать VDK, то при загрузке всех данных во внешнюю память DMA_RUN всегда сбрасывается в ноль, а бит DMA_DONE устанавливается в единицу.

 

Следовательно, при работе VDK DMA1 не может завершить корректно свою работу. Как это исправить?

Изменено пользователем Мухаммор

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


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

Эммм...Кажися, получилось.

 

 

VDK_PushCriticalRegion();
VideoSensorFrameCapture ( 0x02200000 );
while(DMA1_0_IRQ_STATUS&0x08){} //ждать пока не сбросится бит DMA_RUN
VDK_PopCriticalRegion();

 

 

Код функции захвата картинки:

void VideoSensorFrameCapture ( unsigned short *usPTR )
{
    *pDMA1_0_X_COUNT = 720;    // MI350 pixels per line        
    *pDMA1_0_Y_COUNT = 480;    // lines per frame from the sensor
    *pDMA1_0_X_MODIFY = 2;    // Modifier 2 because of 16-bit DMA mode
    *pDMA1_0_Y_MODIFY = 2;    // Modifier 2 because of 16-bit DMA mode
    *pDMA1_0_START_ADDR = usPTR; // Destination address of the image
    *pDMA1_0_CONFIG = STOP_MODE | RESTART | DMA2D | WDSIZE_16 | WNR;
    
    // PPI0 setup    
    *pPPI0_FRAME = 480;    //The PPI is set to receive X lines per frame
    *pPPI0_COUNT = 719;        //The PPI is set to stop receiving after X number of samples for each liene
    *pPPI0_CONTROL = POL_S | POL_C | DATALEN | DataPacking | CFG_GP_Input_3Syncs | GP_Input_Mode;

    *pDMA1_0_CONFIG |= DMAEN;    // | DMA enable
    ssync();
    *pPPI0_CONTROL |= PORT_EN;    // | Start PPI
    ssync();
}

 

А ведь так хотелось кого-нибудь убить... :maniac:

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


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

Следовательно, при работе VDK DMA1 не может завершить корректно свою работу. Как это исправить?

Выбросить это гавм... VDK. Работать с RTOS, не имея ее исходников, IMHO, несколько не комфортно.

void VideoSensorFrameCapture ( unsigned short *usPTR )
{
...
    *pDMA1_0_CONFIG = STOP_MODE | RESTART | DMA2D | WDSIZE_16 | WNR;
...    
}

У вас ведь BF561? Почему не хотите использовать 32-х битный DMA?

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


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

Не хочу, потому что параллельный порт исключительно шестнадцатиразряден! =)

 

Есть библиотеки для RTOS uCOS. А к ней LwIP прикрутить можно?

Изменено пользователем Мухаммор

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


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

Не хочу, потому что параллельный порт исключительно шестнадцатиразряден! =)

Ну и что? Внутренние шины и SDRAM ведь 32-х разрядные. А упаковка данных с PPI в 32 бита - забота DMA.

Есть библиотеки для RTOS uCOS. А к ней LwIP прикрутить можно?

Можно.

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


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

Ну и что? Внутренние шины и SDRAM ведь 32-х разрядные. А упаковка данных с PPI в 32 бита - забота DMA.

 

Спасибо, не знал о таком способе. Но все равно, в данном конкретном случае он никакой выгоды не даст...

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


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

Не хочу, потому что параллельный порт исключительно шестнадцатиразряден! =)

 

Есть библиотеки для RTOS uCOS. А к ней LwIP прикрутить можно?

 

 

В uCOS есть свой стек. Так что ничего прикручивать и не нужно по большому счету

Но uCOS хочет роялти

 

http://www.micrium.com/analog/index.html

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


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

В uCOS есть свой стек. Так что ничего прикручивать и не нужно по большому счету

Но uCOS хочет роялти

 

Чего хочет uCOS???

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


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

Чего хочет uCOS???

Денег

отчислений от прибыли :rolleyes:

Это коммерческая RTOS

 

Если проект некоммерческий они дают исходники

а иначе говорят - надо делиться

http://www.micrium.com/products/tcp-ip/tcp-ip_download.html

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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