![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
Vitaliy_ARM
-
Постов
508 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Vitaliy_ARM
-
-
Необходимо сделать такое устроство. На одной стороне стоит контроллер LPC1766, ADC которого цифрует 10 бит данных при 100 кГц тактовой частоте, дальше этот процессор должен отфильтровать данные FIR-ом и послать буфер 1024 байта в Ethernet, второй процессор принимает эти данные и пропускает через ЦАП. Проблема этой задачи такова:
Как правильно сделать синхронизацию АЦП и ЦАПа в такой связке? Пропуски пакетов категорически запрещены. Задержка должна быть размером в один буфер. Может кто-то решал подобную задачу?
-
И я хочу IPP для PXA-270 linux
Интересно, а для других арм, например ARM11 от Sunsung эти библиотеки можно использовать?
-
Еще один вопрос "Проблема с установкой драйверов под Windows7" по данной теме был задан Vitaliy_ARM в теме Помогите c Cypress CY7C68013, Изохронная IN точка и FIFO.
У меня тоже работает в режиме Test Mode. Подписывать драйвера той утилитой еще не пробовал. Видимо майкрософт решили содрать еще немного денег с производителей. Сколько стоит получить подпись у майкрософт для своего устройства?
P.S.
Может тогда уже лучше использовать FT2232H?: http://www.ftdichip.com/Drivers/D2XX.htm
-
Проблема с установкой драйверов под Windows7.
Скачал новый пакет разработчика с новыми драйверами: http://www.cypress.com/?rID=34870
Подправил, как описано в мануале, VID и PID.
Собственно проблема в том, что нет цифровой подписи у драйвера. От сюда не могу поставить драйвер для CY7C68013A. Система сначала говорит, что устанавливаемый драйвер не имеет сертификата, все равно продолжить? Жму да. После установки выдает сообщение, прикрепленное к посту.
Пробовал делать и такой маневр:
Для отключения проверки цифровой подписи при установке драйверов я использую: gpedit.msc=>Конфигурация_пользователя=>Администрат ивные_шаблоны=>Система=>Установка_драйвера=>Цифров ая_подпись_драйверов_устройств=>Включен=>> Пропустить .
Результат тот же.
Так же отключал UAC при помощи утилиты UAC off.
Что еще можно сделать? Возможно ли сделать цифровую подпись своими силами?
-
Там же и вторая схема есть...
Есть, мне нужна была именно эта, потому что она для KSZ8001
-
-
Без проблем. Описывается даже в родных AN, да и на форуме неоднократно спрашивали.
В родном даташите есть подключение через MII интерфейс. Этого нет.
Будем искать.
Moderator:Тема перенесена, как не имеющая отношения к ARM-ам.
Понял
-
Есть устройство с Ethernet (LPC2378 + KSZ8001), есть некоторый модуль на борту которого стоит KSZ8001 и выводы для подключения трансформатора.
Вопрос:
Каким образом можно их подключить без трансформатора (имеется ввиду по линиям Tx(+/-) и Rx(+/-)), есть ли схема и можно ли это делать?
-
Народ, а где драйвера взять для этого примера или нужно самому писать?
-
Считывается слово из адреса Reset Handler (0x04), и загружается в PC.
Так и сделал:
// загружаем в указатель значение, находящееся по адресу FIRST_PAGE_ADDR + 0x04 void (*App)() = (void(*)())(*((DWORD*)(FIRST_PAGE_ADDR + 0x04))); // запускаем приложение App();
Все работает, спасибо!
-
PC загружается из 0x04, а не им.
Немного не понял что это значит. Поясните пожалуйста.
-
Что по какому адресу? После сброса Reset Handler находится по адресу 0x04.
Забиваю адрес 0x04 в PC при отладке, указатель начинает бежать по векторам подряд и через некоторое время вылетает в аппаратный хендел. Если забить в него адрес __iar_program_start, то программа начинает работать. Может так нельзя делать? Или проблема собственно что резет находится в этот момент не по 0х04 адресу?
-
Запись в даташите:
Following a hardware reset, the Boot ROM is temporarily mapped to address 0. This isnormally transparent to the user. However, if execution is halted immediately after reset by
a debugger, it should correct the mapping for the user. See Section 33–6.
В секции 33:
Following chip reset, a portion of the Boot ROM is mapped to address 0 so that it will be automatically executed. The Boot ROM switches the map to point to Flash memory prior to user code being executed. In this way a user normally does not need to know that this re-mapping occurs. However, when a debugger halts CPU execution immediately following reset, the Boot ROM is still mapped to address 0 and can cause confusion. Ideally, the debugger should correct the mapping automatically in this case, so that a user does not need to deal with it.
-
Для STM32 применяю так:
Загрузчик находится 0х0800 0000
Программа
#define KERNEL_START_APP 0x08004000
Обратите внимание что у кортекса в начале вектора прерывания находится указатель на стек
а +4 начало программы
Спасибо за код. Но для начала хочу понять весь механизм. Все знают что в иар по резету происходит переход в __iar_program_start .
Я в прикладной программе нашел адрес этой подпрограммы. И в загрузчике сделал вызов именно по этому адресу, забив адрес в регистр PC. Прошивка заработала!
Однако когда я забиваю в PC в прикладной программе начало таблицы векторов 0x10000 со смещением: 0x00000, 0x00002, 0x00004 и т.д. процессор улетает в хардваре еррор дефаулт хэндл. Т.е. ошибка состоит в том, что в вызове прикладной программы происходит переход "НЕ ТУДА".
Вот кусок яровского стартапа:
EXTERN __iar_program_start PUBLIC __vector_table PUBLIC __vector_table_0x1c DATA __vector_table DCD sfe(CSTACK) ; Top of Stack DCD __iar_program_start ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler __vector_table_0x1c DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler DCD WDT_IRQHandler ; Watchdog Handler DCD TMR0_IRQHandler ; TIMER0 Handler DCD TMR1_IRQHandler ; TIMER1 Handler DCD TMR2_IRQHandler ; TIMER2 Handler DCD TMR3_IRQHandler ; TIMER3 Handler DCD UART0_IRQHandler ; UART0 Handler DCD UART1_IRQHandler ; UART1 Handler DCD UART2_IRQHandler ; UART2 Handler DCD UART3_IRQHandler ; UART3 Handler DCD PWM1_IRQHandler ; PWM1 Handler DCD I2C0_IRQHandler ; I2C0 Handler DCD I2C1_IRQHandler ; I2C1 Handler DCD I2C2_IRQHandler ; I2C2 Handler DCD SPI_IRQHandler ; SPI Handler DCD SSP0_IRQHandler ; SSP0 Handler DCD SSP1_IRQHandler ; SSP1 Handler DCD PLL0_IRQHandler ; PLL0 Handler DCD RTC_IRQHandler ; RTC Handler DCD EINT0_IRQHandler ; EXT Interupt 0 Handler DCD EINT1_IRQHandler ; EXT Interupt 1 Handler DCD EINT2_IRQHandler ; EXT Interupt 2 Handler DCD EINT3_IRQHandler ; EXT Interupt 3 Handler DCD ADC_IRQHandler ; ADC Handler DCD BOD_IRQHandler ; BOD Handler DCD USB_IRQHandler ; USB Handler DCD CAN_IRQHandler ; CAN Handler DCD GPDMA_IRQHandler ; General Purpose DMA Handler DCD I2S_IRQHandler ; I2S Handler DCD Ethernet_IRQHandler ; Ethernet Handler DCD RIT_IRQHandler ; Repetitive Interrupt Timer Handler DCD MotorControlPWM_IRQHandler; Motor Control PWM Handler DCD QE_IRQHandler ; Quadrature Encoder Handler DCD PLL1_IRQHandler ; PLL1 Handler
Вопрос, на какой адрес прыгает процессор LPC1766 (и т.п.) после сброса?
-
-
Младший бит адреса BLX выбирает режим работы процессора. В данном случае он должен быть равен "1", т.к. процессор может работать только в Thumb.
Теперь понятно.
Судя по скриншотам, прикладная программа просто неправильно записана.Да, действительно. :smile3046:
Спасибо.
Рано обрадовался. Были неправильные скриншоты. После скринов будлодера я несколько изменил прошивку.
Теперь сделал все заново. Прошики совпадают.
-
А почему, собственно, 0x10000 + 0x01 должно быть равно 0x10002?
:cranky: наверное никак.
Сбил с толку указанный выше пример:
void execute_user_code(void) { void (*user_code_entry)(void); /* Change the Vector Table to the USER_FLASH_START in case the user application uses interrupts */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_START); user_code_entry = (void (*)(void))((USER_FLASH_START)+1); user_code_entry(); }
А что может находиться по адресу 0x10000 + 0x01? На сколько мне известно при 16 битных инструкциях прыгать нужно на адреса, выровненные под 16 битное пространство (т.е. в последнем бите должен быть 0).
-
Был у меня загрузчик для LPC2378 и прочих.
Теперь стала задача переписать его под LPC1766.
Все переписалось без особых проблем, однако камнем предкновения оказалось сделать вызов прикладной программы.
Прикладная программа заливается вместе с векторами начиная с адреса 0x1 0000 (16-я страница). Т.е. в ней находятся сначала вектора, а потом все остальное.
Код вызова программы:
#define FIRST_PAGE_ADDR 0x10000 #define NVIC_VectTab_FLASH (0x00000000) // код вызова приложения volatile unsigned long *p = (volatile unsigned long*)NVIC_VECT_TABLE; *p = NVIC_VectTab_FLASH | (USER_FLASH_START & 0x1FFFFF80); void (*App)() = (void(*)())(FIRST_PAGE_ADDR + 1); App(); // уходим в прикладную программу
Код вызова брал по аналогии из LPC1700 USB Bootloader.
Сделал прикладную программу, которая настраивает порт светодиода на плате и зажигает его.
Прикладная программа вызывается неправильно. В ассемблерном коде используется BLX на адрес, 10001, хотя должен был быть 10002. И яр отображает код совсем подругому.
В приложенных файлах 001 и 002 показаны скриншоты яра при работе загрузчика и уходе в прикладную программу. На 003 - прикладная программа в отладочном режиме без загрузчика.
Как правильно вызывать?
-
Постановка задачи кардинально отличается от первоначальной формулировки. Скорее всего потребуется переносить частоту 1-30 МГц в область низких частот и там уже заниматься фильтрацией.
Не хватает ещё требований к полосовому фильтру: диапазон пропускаемых частот, неравномерность АЧХ в нём, диапазон задерживаемых частот, коэффициент подавления в нём.
Да, надо сделать квадратурный приемник пачки радиоимпульсов (АМ) (в дальнейшем предполагается менять демодуляторы). Перенос на ПЧ. Остальное будет в DSP процессоре. На входе стоит NCO+аппаратные умножители, после них надо сделать прореживающий фильтр с перечислинными выше полосами, неравномерность ачх в полосе 0-450кГц не должна превышать 0,1%, подавление на частоте 500кГц и далее должно быть не хуже 80дБ. Под все остальные фильтры требования изменяются пропорционально полосе пропускания. На сколько мне известно, обычный фир с полосами пропускания меньшими 50..100 относительно частоты найквиста, потребляют больше ресурсов, чем CIC+FIR. Задача проредить полосу в 80/2 = 40МГц в полосу 0,5МГц. Нелинейность АЧХ не критична. Желательно залезть в 500..1000 Альтеровских ячеек с двумя фильтрами.
Кстати а основная селекция у вас где будет делаться? просто есть красивый вариант поставить сначала переменный CIC, а потом уже фиксированный FIR на 128. В этом случае CIC можно вообще не корректировать. Подставил ваши параметры в выложенный маткадовский файл, на частоте найквиста после децимации такой цик будет вам заваливать полосу, в худшем случае на дикие 0.00065дБ для 3-х каскадов и 0.00102 дБ для 5ти каскадов %)Полученные IQ каналы будут подаваться на DSP процессор (причем это может подаваться как по проводному интерфейсу так и беспроводному, в общем имею то что имею, тз поставлено такое :unsure: ), в котором так же будет стоять квадратурный смеситель и FIR с переменной полосой пропускания (основная селекция на нем), после этого демодулятор сигналов.
Забыл упомянуть. Фаза должна быть линейна.
-
подцепить свое IP написаное на SV и синтезируемое в Synplify к микропроцессорной системе собраной в Альтиуме
отлаживать (debuger, JTAG) софт (С++) на этой платформе, отлаживается некое хардварь-индепендент ядро, но внутрисхемная отладка очень приветствуется
Одно время интересовался такой возможностью альтиума. Ни к чему не привело, было год назад и за недостатком литературы пришлось бросить и сделать проект в квартусе.
С джитагом была раньше такая политика, что вроде бы покупаешь у них некий нанобоард и там есть все что надо для счастья. Отдельных джитагов на тот момент вроде бы не было.
А так, конечно, кроссплатформенность это классная штука в наши дни.
-
Сейчас окончательно определился с т.з.
У меня 80Мгц ацп, надо принимать сигналы с полосой 500кГц в диапазоне частот 1-30МГц.
При этом полоса должна переключаться: 500кГц, 250кГц, 125кГц, 62,5кГц, чтобы уменьшить трафик.
Скажите чего еще не хватает?
что сложного то ? логика здравого смысла + сделайте 4 разных цик фильтра и сравните. Перестройка частоты вообще делается элементарно, этот блок на виду у всех. Остается только сделать перестройку усиления фильтра, т.к. у циков он сильно зависит от коэфф. децимации.Т.е. вы предлагаете сделать несколько циков и включать только нужное количество для децимации. При этом надо ставить еще умножители для коррекции усиления?
У меня родилась еще одна мысль, что если сделать один переменный цик + постоянный FIR. Только второму коэффициенты подгружать из вне. Получатеся, что не надо никаких умножителей дополнительных. Скорость переключаться будет один раз за сессию - очень редко. В этом случае нужно рассчитать 4 компенсирующих FIR. Что скажете?
-
В догонку, загляните еще в эту тему. Там решается похожая задача с примером в матлабе.
Успехов.
К сожалению пока нет матлаба. Обязательно гляну при возможности.
подумал на досуге о вашей проблеме.Варианта с нормальной производительностью/ресурсом вижу два
1. 5 каскадов циков с 30/34 бита арифметикой, правда придеться "поесть" памяти.
2. Каскадная децимация, сначала на 128 + FIR, потом уже хогенауэр. Арифметика будет "всего" 43 битная.
Что из этого будет в итоге "весить" меньше решать вам %)
ЗЫ. еще немаловажный вопрос время выхода фильтра на режим при перестройке полосы, помните что интегральные части циков надо сбрасывать.
Тогда вопрос, каким способом делать переменное прореживание?
Делаем прореживание в CICе и при этом используем один FIR, пренебрегая изменением АЧХ CICа?
Почему нельзя пользоваться усечением разрядности CIC?
p.s. приношу извинения за ламерские вопросы, не могу найти именно ответ на вопрос - как правильно сделать переменное прореживание в фильтре Хогенауэра.
-
Сказать, что нужна полоса после прореживания, близкая к Fs/2, это значит - ничего не сказать. Надо знать, насколько именно близко? На 1% от Fs/2 или на 0.01%? От этого порядок требуемого фильтра будет меняться в сотни раз, если есть требование подавления "зеркальных" частот при децимации.
В качестве аналогии могу привести такой пример: насколько сильно будут разгоняться протоны в Большом адронном коллайдере? Ответ - близко к скорости света. Так ведь это и ежу понятно, что близко, вопрос в том - насколько близко? На 1% от c или на 0.01%? Или ещё ближе? :) Энергия протонов при этом тоже будет меняться на порядки.
Уточню. На частоте Найквиста должно быть подавление не хуже 70дБ. Порядок FIR = 110.
-
Но полоса то вам нужна после децимации верно ? Теперь оцените на сколько вы делаете децимацию и какую часть вашей полосы портит CIC. Сложно делать заявления без опоры на цифры(считать лень), но по опыту начиная с коэфф. децимации 8 АЧХ различаются не более чем на 0.1Дб для 6ти каскадов CIC. Незнаю ваших требований к CIC фильтру, но если входная разрядность ~16, число каскадов больше 3-х, и делаете вы это на фпга то лучше вам НЕ делать фильтр хогенауэра. Для проца смотреть надо %)
Разрядность 18бит, исполнение в FPGA. Полоса нужна после децимации, близкая к Fs/2, где Fs - частота дискретизации после прореживания. Неравномерность АЧХ должна быть как можно меньше, 0.05% устроит. Число каскадов цика можно выбирать от 3 до 8, чем меньше - тем лучше. Фильтр Хогенауэра лучший вариант при таких коэффициентах прореживания, важно, что занимает мало места.
Вопрос тот же. Как правильно построить фильтр Хогенауэра с переменным коэффициентом прореживания?
В атаче расчет RC фильтра с коррекцией АЧХ CIC фильтра, 13 маткад. Все комментарии на русском. Ничего сложного %)Спасибо за информацию.
ADC(LPC1766)->Eth-->DAC(LPC1766)
в ARM
Опубликовано · Пожаловаться
Т.к. частота дискретизации устройства 100 кГц и 10 бит разрядность, т.е. получается 16 бит * 100 кГц = 1,6 Mbps, при Fast ethernet (100Mbps) эта задача теоретически реализуема. При уточнении тз, оказывается допустимым задержка на 2..3 буфера по 1024 байта. (p.s. не совсем понял что имелось в виду под словом slip).
1. В предложенной вами ссылке рассматриваются протоколы синхронизации часов. Я так понимаю этим можно воспользоваться для синхронизации тактовых сигналов ацп и цап (реализовывать протокол в полном виде в этой задаче будет бессмысленно), т.е., скажем, делаем счетчик отсчетов на обеих сторонах, и если, допустим, на цапе счетчик отличается, то мы пересчитываем предделитель тактовой частоты, чтобы скомпенсировать уход. Устройство, с которого предлагается цифровать сигнал - спец. микрофон, на другой стороне - громкоговоритель + возможно, осциллограф.
2. Есть предложение способа синхронизации потока из изернета: на стороне цапа есть большой кольцевой буфер, скажем на 100 буферов, и две возможные частоты дискретизации цапа, одна больше чем у ацп, а другая меньше. Синхронизация происходит следующим образом. Буфер накаплвивает, скажем, половину пакетов и запускается таймер, по прерыванию которого подсчитывается количество буферов и на основе этого делается установка первой или второй частоты дискретизации цапа. Если буфер начинает переполняться, т.е. пакетов становится больше чем половина буфера, значит цапу устанавливается бОльшая частота дискретизации, если буферу не хватает пакетов, то цапу ставим меньшую чд. Таким образом частота дискретизации цапа качается постоянно туда/сюда (искажения и прочее конечно будут). Минус этой системы: чем больше буферов - тем лучше, можно поставить чд1 и чд2 близкие к ацп. Но ресурсы памяти у MCU ограничены.
Собственно вот пока пришли в голову две идеи. Если что понял не так или есть что лучше - поправьте.