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

Gradient

Участник
  • Постов

    770
  • Зарегистрирован

  • Посещение

Весь контент Gradient


  1. Когда порядка 3к различных типов и значений переменных идут подряд без имён, сомневаюсь что это облегчит сопровождение кода. Да и Вижуал студио не понимает директив #pragma location, __eeprom ...
  2. Спасибо, но использование варианта со структурами не подходит тем, что не позволяет автоматом сделать дефолтную прошивку для первого включения. Надо инициализировать новые значения в еепром вручную, что занимает пожалуй времени больше, чем правка адресов в коде. Т.е. нужен вариант, чтоб одновременно с работоспособостью обоих компиляторов использовать адреса, существовала возможность получить прошивку начальной инициализации. :rolleyes: -
  3. Есть утилита, которая меняет параметры устройства записью их в EEPROM AVR. Переменных этих накопилось уже довольно много, и начинаются проблемы с совпадением адресов (заданных жестко) при изменении кода утилиты и кода AVR. Приходится перепахивать всё, в случае сдвига переменной в секторе eeprom или добавлении новых на их место. Подскажите плиз, как оформить файл "eeprom.h", чтоб компилятор IAR и MSVS C++ могли извлекать адреса переменных по их именам. Подключение IAR-овской версии Visual Studio не понимает и выдаёт кучу ошибок. пример как сейчас сделано #define AUDIO_LEVEL_L 0x0fe8 #pragma location = AUDIO_LEVEL_L __root __eeprom volatile unsigned char AU_level_l = 0x80; -
  4. А что вы хотите от PPI_STATUS в режиме отличном от ITU-R 656? Он поддерживает в основном только этот режим. Единственный "общережимный" бит FT_ERR ошибка формата кадра, меняется если не совпадает число строк в кадре на момент прихода КСИ. Но он и не будет отражать аварийную ситуацию, т к число строк в кадре у Вас совпадает, просто в них "пиксельная фаза" сьехала. А не восстанавливается она потому, что Вы не делаете "привязку" адресации указателя в видео-буфере к началу кадра или строки. Она используется установленная при инициализации приложения, а надо это делать каждый кадр, чтоб картинка не гуляла куда ей хочется. Напишите простенькую функцию и по началу каждого кадрового импульса запускайте, обновляйте указатели. Для Вашего случая посмотрите конфиг под "Режим с тремя сигналами кадровой синхронизации". Это подробно расписано в даташите на BF533, раздел "Режимы с внешней кадровой синхронизацией". -
  5. >>BF561 подключен к сенсору через 10 сантиметровый МГТФ Тогда Вам не повезло. В своё время именно с этим и помучились. Если не будете буферизировать шину - вам ничто не поможет, в воздухе ничего не должно висеть. Или разводите всё на плате как положено. - Можно ещё попробовать подтянуть или к земле или к питанию все синхро, через резисторы 50-100 Ом, иногда помогает быстро разрулить траблы. Можно усложнить алгорит приема, с проверкой длительности строки по внешнему таймеру и синхронизацией от строчного импульса. Настроить PPI на перезапуск после каждой принятой строки. Но всё это отнимает ресурсы и заставит процессор постоянно отвлекаться на обработку этой задачи. Проще правильно развести плату ;)
  6. У Вас аппаратная причина сбоев, связанная с некорректной разводкой платы. Например шина синхронизации разведена близко с другими несинхронными сигналами, или жгут висит в воздухе. Проложите экран непосредственно под и над шиной PPI, проблема исчезнет. Попробуйте вот это, изменив установки для вашего сенсора: У меня работает идеально, круглосуточно без каких либо сбоев. //=================================================================== //File Name: ppi.h //Date Modified: 28/08/2009 //Software: VisualDSP++ 5.0 //CPU: BF561 //=================================================================== #ifndef _PPI_H_ #define _PPI_H_ //Prototype Functions void Init_PPI_new(void); void reinit_PPI_DMA(void); #endif //----------------------------------------------------------------------------- //File Name: ppi.c //Date Modified: 1/09/2009 //Software: VisualDSP++ 5.0 //CPU: BF561 //----------------------------------------------------------------------------- #include "ppi.h" //definitions for BF561 #include <cdefBF561.h> //PPI #define POLSa 15 #define POLCa 14 #define DLENa 11 #define SKIP_EOa 10 #define SKIP_ENa 9 #define DMA32a 8 #define PACK_ENa 7 #define FLD_SELa 6 #define PORT_CFGa 4 #define XFR_TYPEa 2 #define PORT_DIRa 1 #define PORT_ENa 0 //DMA #define FLOWa 12 #define NDSIZEa 8 #define DI_ENa 7 #define DI_SELa 6 #define RESTARTa 5 #define DMA2Da 4 #define WDSIZEa 2 #define WNRa 1 #define DMA_ENa 0 //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void Init_PPI_new(void) { //reinit_DMA(); *pPPI0_CONTROL= 0; //The PPI is set to lines quantity for each frame *pPPI0_FRAME = 524;//line_numbers;//total frame numbers //Blackfin pin Drivers is Enable and in use //*pFIO_INEN = 0xFFFF & (~(0x0100)); //*pFIO0_INEN = 0xFFFF; //*pFIO1_INEN = 0xFFFF; //*pFIO2_INEN = 0xFFFF; //Blackfin PF7-PF0 pin must be set as input 1= OUTPUT //*pFIO_DIR = 0x0100; *pPPI0_STATUS = 0; //set PPI mode *pPPI0_CONTROL= (0<<POLSa)| //PPI Frame Sync not inverted polarity = 0 (0<<POLCa)| //PPI_CLK not inverted polarity = 0 (0<<DLENa)| //8 bites bus interface width = 0 (0<<SKIP_EOa)| //PPI Skip Even/Odd Fild deny = 0 (0<<SKIP_ENa)| //PPI Skip Elements deny = 0 (1<<DMA32a)| //PPI DMA32 mode enable = 1 (1<<PACK_ENa)| //PPI Data Packing Mode Enabled = 1 (1<<FLD_SELa)| //PPI Active Field Select = 1, Fields 1 and 2 (0<<PORT_CFGa)| //пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ (0<<XFR_TYPEa)| //0=ITU.R656, input only active fields (0<<PORT_DIRa)| //Data flow direction rx=0 tx=1 (1<<PORT_ENa); //Enable } void reinit_PPI_DMA(void) { *pDMA1_0_CONFIG = 0; //Target address of the DMA //*pDMA1_0_START_ADDR = 0x00000004; //*pDMA1_0_NEXT_DESC_PTR = 0xFF802554; //Line_Length 16bit transfers will be executed *pDMA1_0_X_COUNT = 720;//Line_Length; //The modifier is set to *pDMA1_0_X_MODIFY = 2;//2 //Frame_Length 16bit transfers will be executed *pDMA1_0_Y_COUNT = 480;//Frame_Length;//480 //The modifier is set to 2 because of the 16bit transfers *pDMA1_0_Y_MODIFY = 2;//2;//2 //PPI Peripheral is used //*pDMA1_0_PERIPHERAL_MAP = 0x0; //DMA Config: *pDMA1_0_CONFIG =(1<<FLOWa)| //1=autobuffer (0<<NDSIZEa)| //0 (1<<DI_ENa)| //1 Interrupt Disable =0, Enable =1 (0<<DI_SELa)| //0 Interrupt after all buffer =0, after string =1 (1<<RESTARTa)| //1 (1<<DMA2Da)| //1 (1<<WDSIZEa)| //1=16bytes transfer, 2=32bytes transfer (1<<WNRa)| //1 Data direction: from mem =0, to mem=1 (1<<DMA_ENa); //1=Enable }
  7. >> У памяти AT45xxxD есть уникальный аппаратный номер Почему это обязательно должна быть AT45?! Мы используем S25FL128 ... >> искать эти проверки, но кому оно надо? о ... вы себе просто не представляете как ищут :) причем, не в ручную
  8. >> память то другая будет стоять Какая стоит память, не играет решающего значения Главное - что содержится в этой памяти И если ID процессора совпадает с тем что в памяти - тогда все ОК. Если нет, значит всё .... Поэтому как раз и получится тупо всё передрать. Для защиты, приходится выносить критические алгоритмы в другой процессор. А это вызывает сильный геморой и усложнение как софта так и железа. В плане защиты firmware, BlackFin абсолютно бестолково сделан. -
  9. Вот интересно. Возможно ли переделать драйвер от SM510PCI, чтоб он мог работать под VDSP++? Вероятно, такой вариант был бы более качественный, чем недоделки от AD.
  10. >>основная проблема в интерфейсах Вроде видел PPI вот у этого: SAM9G45 для видео. На мой взгляд - очень неплохой чип.
  11. Да уж... Если USB-ICE за 1200 не могут до ума довести, представляю что будет за 150 баксов... С первого взгляда сразу радует "гармоничное" расположение юсб разьёма. Всё продумано до мелочей! Кто бы сомневался ;)
  12. Кто тогда мешает этот номер читать всем кому не лень? Нет смысла абсолютно. Прошивку будут ковырять, явно не "пионеры", а знатоки таких дел. -
  13. Пока нигде в документации не встретил, существет ли маркер, метка, серийный номер, индивидуальный для каждого чипа. Если есть, по какому адресу его можно считать? Спасибо.
  14. Видимо, что-то близкое к этому: $USER_LIBRARIES_L2 = myLib.dlb, $LIBS; MEM_L2_SRAM {TYPE(RAM) START(0xFEB1A000) END(0xFEB1BFFF) WIDTH(8) } это в -->SECTIONS L2_sram { INPUT_SECTION_ALIGN(4) INPUT_SECTIONS($USER_LIBRARIES_L2(L2_sram)) } > MEM_L2_SRAM
  15. это видимо значение для старой инициализации тут 2 пути решения 1 переинициализировать по всем правилам, как по даташиту 2 найти функцию инициализации в ВДК и отключить её, заменить своей Попробуйте инициализировать ПЛЛ однократно, именно Вашими значениями. Не забудьте передёрнуть питание платы.
  16. Проверьте регистр состояния PLL (PLL_STAT) и убедитесь что частота успешно захвачена. А вообще-то, для изменения состояния на лету, должен выполняться определённый порядок программирования PLL. О чём подробно и было расписано в даташите... рекомендую прочитать.
  17. Мои эксперименты с uClinux для BF533 закончились фреймрейтом 16... 20fps от ffmpeg больше выдавить не удалось Зато на BF561 под scmRTOS при 720х480 30гц работает MPEG4 енкодер, при этом остаётся свободным около 55% ресурсов по времени. Кодировать картинку на лету - значительно дольше, чем делать преобразование в YUV. Можно запустить вашу задачу и под uClinux, но не на 531ом ... нужна шина памяти как минимум 32бита. -
  18. Можно, но только не понятно, зачем так мучиться? Всё решается одной дешёвой микросхемой энкодера за доллар. Подключить его по ITU-R BT656 занимает не более дня. -
  19. Можно, но качество сигнала будет неважное. Особенно в PAL, где для хорошей цветопередачи необходимо формировать цветовые поднесущие с минимальными фазовыми ошибками (не помню точно, но вроде 5град допуск). На BF это будет очень проблематично сделать.
  20. Писать по адресу 0x06000000 надо ядром A, или в ldf сделать INPUT_BUFFER общим для ядер A и B. Вероятно, Ваша программа может останавливается по этой причине.
  21. Я с VDK никогда не работал и не знаю как там реализуется доступ. Если страничной зашиты нет, то тогда остаётся только попробовать выровнять адресацию. #define ALIGN_TO_NEXT_WORD_BOUNDARY(x) ( (char *)(((((int)(x)) + 3) >> 2) << 2)) //выравнивание pAddress = ALIGN_TO_NEXT_WORD_BOUNDARY(INPUT_BUFFER); Даёте макросу адрес вашего буфера в памяти, получаете выровненый адрес, затем туда пишете *pAddress = 0xAA; Всё же проверьте наличие защиты памяти. Для этого просмотрите Register->Core->L1 Data Memory Registers Или принудительно установите разрешение доступа Что то типа этого: *pDMEM_CONTROL &= ~ENDCPLB; //Access to CPLB setup asm ("ssync;"); *pDCPLB_ADDR15 = 0x06000000; //сюда начало страницы памяти asm ("ssync;"); *pDCPLB_DATA15 = 0x0003001D; //сюда параметры доступа (PAGE_SIZE_4MB | CPLB_D_NOCACHE) asm ("ssync;"); *pDMEM_CONTROL |= ENDCPLB; asm ("ssync;"); //теперь можно попробовать записать pAddress = 0x06000000; *pAddress = 0xAA; Проверьте соответствие типа указателя данным. Если пишете 1 байт то char* итд .. Потестите с еденичным байтом, так проще понять причину затыка. Пока других идей нет. - ps Надеюсь, Вы ldf файл поправили и там всё сделано для 128MB памяти? И перенесли свои буфера в соответствующее место примерно так. /*Memory SDRAM 128MB*/ MEM_SDRAM_BANK0 { TYPE(RAM) START(0x00000004) END(0x01FFFFFF) WIDTH(8) }*/ MEM_SDRAM_BANK1 { TYPE(RAM) START(0x02000000) END(0x03FFFFFF) WIDTH(8) }*/ MEM_SDRAM_BANK2 { TYPE(RAM) START(0x04000000) END(0x05FFFFFF) WIDTH(8) }*/ MEM_SDRAM_BANK3 { TYPE(RAM) START(0x06000000) END(0x07FFFFFF) WIDTH(8) }*/ MEM_INPUT_BUFFER {TYPE(RAM) WIDTH(8) START(0x06000000) END(0x07FDFFFF)} //Это положить в: SECTIONS p0 .loop_buffer NO_INIT { _INPUT_BUFFER = .; . = . + 0x01FDFFFF; _INPUT_BUFFERend = .; } > MEM_INPUT_BUFFER
  22. Понятно. >>Для подключения банка_1 я записываю в EBIU_SDBCTL 0x00001515 в надежде, что смогу работать с банком_1 так же, как и с банком_0 - однако массив данных в банк_1 не записывается. В банк_0 он размещается и вычитывается без проблем. Тогда с точки зрения контроллера, у вас один 32х разрядный 128MB внешний банк. Проверьте, сброшен ли бит EBIU_SDGCTL (0 << WIDTHp) //use 32bit memory bus EBIU_SDBCTL в этом случае устанавливать только для нулевого банка //Setup for Bank 0 *pEBIU_SDBCTL = (2 << EB0CAW)| //column address width: 0-8bit,1-9bit,2-10bit,3-11 bit (3 << EB0SZ)| //Total SDRAM bank size:0-16MB,1-32MB,2-64MB,3-128MB (1 << EB0E); //1=SDRAM external bank enable Вроде так должно быть ... Кстати "глохнуть" может и по другой причине. Если у Вас используется защита памяти, то обращение к "закрытым" адресам вызывает исключение, и программа зависает. -
  23. Правильно глохнет - пусто там ... т е нет ничего. У Вас всего 64 мегабайта. 32 литра в одной банке с пивом, 32 литра в другой. Всего 64 литра. Когда вы хотите отхлебнуть из соседней бочки - там пусто ;) Запутался я с вашей памятью ... Загляните плиз в datasheet и напишите ёмкость в битах. Они обычно всегда пишут этот параметр. А потом посчитаем.
  24. Ну дык ... у Вас всего 64 метра на борту... чего же вы ещё хотите? 128 оттуда никак не выдавить.
×
×
  • Создать...