![](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
-
-
Стоит следующая задача.
Вектора прерываний надо расположить в начале 0-го сектора Flash (по 0-му адресу). А все остальное содержимое прошивки нужно расположить начиная с 0x10000 адреса.
Как это правильно сделать в линкере Keil?
Мой код ниже не работает, прошивка улетает в HardFault_Handler спустя некоторое время. Подскажите, где грабли?
; *************************************************************; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x00000000 0x00001000 { ; load region size_region
ER_IROM1 0x00000000 0x00001000 { ; load address = execution address
*.o (RESET, +First)
}
}
LR_IROM2 0x00010000 0x00060000 { ; load region size_region
ER_IROM2 0x00010000 0x00060000 { ; load address = execution address
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x10000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x20000000 0x00001F40 {
*(EMAC_RAM)
}
}
-
В этом не подскажу, но можно сконфигурировать EMC под ваши нужды и попробовать глянуть осциллографом, что на линии EMC_CLK0. Вот только не знаю, присутствует ли этот сигнал постоянно
Провел несколько экспериментов и не совсем понял, когда там появляется сигнал. Постоянно его там нет. В итоге решил задачу по-другому. Плис тактируется от 120 МГц и этой частоты было достаточно, чтобы написать контроллер асинхронной памяти в ПЛИС. Таким образом я получил максимальную скорость обмена 10 мегабайт в секунду по 16-битной шине и меня это устроило.
Спасибо за помощь.
-
А тактовый сигнал с контроллера нельзя подать? Например, с CLKOUT. Думаю, всё-равно указанные выше сигналы привязаны к оной.
Отличная идея, жаль не смогу так сделать. CLKOUT не выведена на поверхность. Выведен EMC_CLK0. Может есть возможность его использовать без сигналов RAS, CAS, и т.п?
-
По интерфейсу внешней шины к микроконтроллеру подключена FPGA. Шина позволяет работать с динамической памятью SDRAM, которая синхронная.
Подскажите, существует ли возможность настроить внешнюю шину этого контроллера, чтобы сигналы WE и OE выдавались на шину с некоторым тактовым сигналом.
Т.е. нужны ADDR, DATA, OE, WE и некий CLK.???
-
Найти информацию по теме "реализация деления знаковых целых чисел на степень двойки". Можно и самостоятельно понять суть проблемы : берёте отрицательное 16-разрядное число, отбрасываете у него 8 младших разрядов, затем сравниваете полученное число с исходным, поделённым на 256 на калькуляторе... Думаете... Объясняете полученные результаты... Пишите код. Всё.
Не совсем понял вас. Как делить на степерь двойки я знаю. Есть 120 коэффициентов, при перемножении коэффициентов с максимальным уровнем входного сигнала на выходе каждого умножителя разрядная сетка будет скакать в пределах 32...64 бита (зависит от конкретного коэффициента фильтра), потом эти значения попадают на сумматор, на котором тоже увеличивается разрядная сетка. Вот собственно вопрос, как правильно сделать усечение на выходе, чтобы использовать максимально разрядную сетку? Так как не всегда старшие биты сумматора будут нести информацию.
-
У меня другой вопрос, написал фильтр на verilog. Регистр сдвига сделан на двухпортовой памяти, коэффициенты так же хранятся в двухпортовой памяти.
Количество коэффициентов, TAPS = 120.
Входные данные и коэффициенты имеют разрядность = 32. Какую разрядность должен иметь MAC? И как правильно сделать усечение для получения 32 битного результата на выходе.
P.S. Максимальная разрядность MAC расчитывается (разр. коэфф. + разрядность входа) + log2(TAPS) ??? У меня сделано так, на выход подаю старшие 32 бита MAC. В итоге имею на выходе фильтра дрейфующую в небольших пределах постоянку. Как победить?
-
На выходе сигнал появляется, если не ошибаюсь, через 79 тактов опорной частоты, а переключение профилей происходит по фронту такта деленного на 4, если все это учесть, то наверно можно попробовать, но в общем виде и для произвольных частот, мне кажется, без разрыва фазы таким способом не получится.
Понятно. У меня минимальная длительность импульса может быть 0,5 мкс и тактовая частота у AD9957 используется 600 МГц. Приведенным мной способом не получится сделать такой модулятор.
Идеальное решение, получается, это только использовать квадратуры и формировать FSK в ПЛИС подобным образом: http://www.dsplib.ru/content/fsk/fsk.html
Может кто-то использовал или знает другие решения скоростного формирователя FSK?
-
Чтобы не плодить тем, пишу сюда.
Стоит задача реализовать FSK модулятор на этой микросхеме. Самый простой способ - использовать два профиля, пишем в один профиль частоту MARK, а в другой - SPACE. И путем переключения профилей осуществляем модуляцию. Вопрос, это переключение будет происходит без разрыва фаз? (переключаться частота будет в тот момент, когда на выходе синусоида проходит через 0).
-
Добрый день, возникла необходимость использовать высокоскоростной цап, у которого применен этот интерфейс.
У Lattice есть специальное ядро для этого протокола, но оно, похоже, платное. Подходит для семейств EPC3 и EPC4: http://www.latticesemi.com/documents/I0197.pdf
Может кто уже занимался этим вопросом. Можно ли влезть в цену 50-80$ за ПЛИС при использовании этого интерфейса и можно ли обойтись без покупки ядер JESD204A?????
-
Всем доброго времени!
Подскажите, что это за функция для комплексных чисел, может есть русский аналог этого названия? Как ее считать?
-
Пишу спец загрузчик и как раз столкнулся с тем, что мне надо иметь две таблицы векторов прерываний.
Задача загрузчика записать приложение по адресам 0x0-0xFFFF, т.е после чего он уже будет не нужен. И на место него пользовательское приложение будет писать другие данные, но это не важно.
Механизм такого загрузчика предполагается сделать так.
1. Копируются вектора прерываний куда-нибудь (во флешь или озу)
2. Делается ремап.
3. Стартует загрузчик
Можно ли сделать копирование векторов прерываний в другую страницу на этапе линковки загрузчика, скажем по адресу 0x18000?
-
Недавно "допиливал" данный код. У меня это выглядит так:
hiduser.c
#define HID_INPUT_REPORT_BYTES 33 /* size of report in Bytes */ #define HID_OUTPUT_REPORT_BYTES 33 /* size of report in Bytes */ #define HID_FEATURE_REPORT_BYTES 2 /* size of report in Bytes */ };
Для понимания того, как заполняется дескриптор, рекомендую почитать документ "HID Usage Tables".
Спасибо за подсказку. Не нашел сразу эти константы.
Допилил следующие моменты:
1. Файл usbcfg.h
#define USB_MAX_PACKET0 64 //8 // максимальный размер конечной точки
2. Файл usbdesc.c
#define HID_INPUT_REPORT_BYTES 64 /* size of report in Bytes */ #define HID_OUTPUT_REPORT_BYTES 64 /* size of report in Bytes */ #define HID_FEATURE_REPORT_BYTES 1 /* size of report in Bytes */
3. Немного переделал функции репортов примерно таким образом (используется непосредственно буфер конечной точки для экономии памяти)
BOOL HID_GetReport (void) { /* ReportID = SetupPacket.wValue.WB.L; */ switch (SetupPacket.wValue.WB.H) { case HID_REPORT_INPUT: memset(EP0Buf, 0, HID_INPUT_REPORT_BYTES); GetInReport(EP0Buf); break; case HID_REPORT_OUTPUT: return (__FALSE); /* Not Supported */ case HID_REPORT_FEATURE: /* EP0Buf[] = ...; */ /* break; */ return (__FALSE); /* Not Supported */ } return (__TRUE); } /* * HID Set Report Request Callback * Called automatically on HID Set Report Request * Parameters: None (global SetupPacket and EP0Buf) * Return Value: TRUE - Success, FALSE - Error */ BOOL HID_SetReport (void) { /* ReportID = SetupPacket.wValue.WB.L; */ switch (SetupPacket.wValue.WB.H) { case HID_REPORT_INPUT: return (__FALSE); /* Not Supported */ case HID_REPORT_OUTPUT: SetOutReport(EP0Buf); break; case HID_REPORT_FEATURE: return (__FALSE); /* Not Supported */ } return (__TRUE); }
4. Интервал опроса описывается в файле usbdesc.c в следующей структуре. Вместо константы 0ч20 по умолчанию (32 мс), я вставил директиву HID_INPUT_REPORT_INTERVAL для удобства.
/* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor) */ const U8 USB_ConfigDescriptor[] = { /* Configuration 1 */ USB_CONFIGUARTION_DESC_SIZE, /* bLength */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL( /* wTotalLength */ USB_CONFIGUARTION_DESC_SIZE + USB_INTERFACE_DESC_SIZE + HID_DESC_SIZE + USB_ENDPOINT_DESC_SIZE ), 0x01, /* bNumInterfaces */ 0x01, /* bConfigurationValue: 0x01 is used to select this configuration */ 0x00, /* iConfiguration: no string to describe this configuration */ USB_CONFIG_BUS_POWERED /*|*/ /* bmAttributes */ /*USB_CONFIG_REMOTE_WAKEUP*/, USB_CONFIG_POWER_MA(100), /* bMaxPower, device power consumption is 100 mA */ /* Interface 0, Alternate Setting 0, HID Class */ USB_INTERFACE_DESC_SIZE, /* bLength */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x01, /* bNumEndpoints */ USB_DEVICE_CLASS_HUMAN_INTERFACE, /* bInterfaceClass */ HID_SUBCLASS_NONE, /* bInterfaceSubClass */ HID_PROTOCOL_NONE, /* bInterfaceProtocol */ 0x04, /* iInterface */ /* HID Class Descriptor */ /* HID_DESC_OFFSET = 0x0012 */ HID_DESC_SIZE, /* bLength */ HID_HID_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(0x0100), /* 1.00 */ /* bcdHID */ 0x00, /* bCountryCode */ 0x01, /* bNumDescriptors */ HID_REPORT_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(HID_REPORT_DESC_SIZE), /* wDescriptorLength */ /* Endpoint, HID Interrupt In */ USB_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_IN(1), /* bEndpointAddress */ USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ WBVAL(0x0004), /* wMaxPacketSize */ HID_INPUT_REPORT_INTERVAL, /* 32ms */ /* bInterval */ /* Terminator */ 0 /* bLength */ };
5. Последним этапом перенес все нужные константы в одно место, в hiduser.h
#ifndef __HIDUSER_H__ #define __HIDUSER_H__ #define HID_INPUT_REPORT_BYTES 64 /* size of report in Bytes */ #define HID_OUTPUT_REPORT_BYTES 64 /* size of report in Bytes */ #define HID_INPUT_REPORT_INTERVAL 0x20 /* report interval in ms (32 ms) */ #define HID_FEATURE_REPORT_BYTES 1 /* size of report in Bytes */ /* HID Number of Reports */ #define HID_REPORT_NUM 1 /* HID In/Out Endpoint Address */ #define HID_EP_IN 0x81 /* HID Global Variables */ extern U8 HID_Protocol; extern U8 HID_IdleTime[HID_REPORT_NUM]; /* HID Requests Callback Functions */ extern BOOL HID_GetReport (void); extern BOOL HID_SetReport (void); extern BOOL HID_GetIdle (void); extern BOOL HID_SetIdle (void); extern BOOL HID_GetProtocol (void); extern BOOL HID_SetProtocol (void); #endif /* __HIDUSER_H__ */
6. Прикрепляю сей проект к этому топику :)
-
Смотря какую полезную нагрузку вкладывать. В принципе, при верном подходе утилизируется вся доступная полоса.
Да, кстати, собственно по теме топика. Оказывается, у меня не была припаяна ножка RX- на PHY - работало по одному проводу. В результате после окончания пакета на 10МБит были еще дрыгания, которые интерпретировались PHY как начало нового фрейма. А MAC, как оказалось, даже такой в упор непакет все таки отбрасывает с установкой флага прерывания.
В общем, имейте в виду, что может происходить и такая ересь.
Может у кого попадалось. Была у меня плата MCB2300, выбросил от туда LPC2378 и поставил LPC1768. Перенес проект со стеком ARP+ICMP+UDP на этот микроконтроллер. Написал программу. Блок данных передается от платы в ПК и возвращается обратно в плату. После некоторых манипуляций заметил следующую ерунду. Каждый десятый пакет приходит битый. Причем битый там всего один байт. Может быть в начале, может в конце, происходит случайно. Проверил снифером, пакет бьется в микроконтроллере по приему, так как входящие пакеты на пк и исходящие - целые. Думал, вышли из строя микросхемы LPC и PHY. Обе заменил, все тоже самое. Может у кого было нечто подобное?
-
В одно время сделал устройство в виде небольшой клавиатуры с кнопками и светодиодами на микропроцессоре LPC1343.
За основу было взято описание использования встроенного аппаратного стека HID устройства в этот микропроцессор: http://www.nxp.com/documents/application_note/AN10904.pdf
и презентация http://ics.nxp.com/literature/presentation...lpc13xx.usb.pdf
Структура с настройками этого устройства приведена ниже:
HidDevInfo.idVendor = USB_VENDOR_ID; HidDevInfo.idProduct = USB_PROD_ID; HidDevInfo.bcdDevice = USB_DEVICE; HidDevInfo.StrDescPtr = (uint32_t)&USB_StringDescriptor[0]; HidDevInfo.InReportCount = 17; HidDevInfo.OutReportCount = 1; HidDevInfo.SampleInterval = 0x02; HidDevInfo.InReport = GetInReport; HidDevInfo.OutReport = SetOutReport;
Для LPC1768 существует аналогичный пример от Keil, который лежит в папке с установленной программой по адресу: "C:\Keil\ARM\Boards\Keil\MCB1700\USBHID\"
Вопрос к тем, кто разбирался с этим HID.
В этом примере функции SetOutReport и GetInReport могут передавать и принимать только один байт. Каким образом размер буфера можно увеличить до 64 (в описанном мной примере это делается путем установки переменных InReportCount и OutReportCount )?
Второй вопрос: как поднять скорость вызова функции GetInReport() до 2 мс?
-
Всем доброго времени.
Есть задача подключения АЦП 14 бит 160 МГц к ПЛИС, в качестве которой хочу выбрать EP3C25E144C8N. Шина данных - CMOS.
Вопрос, можно ли шину данных цеплять на разные банки плис при такой тактовой? (p.s. нужно ли в разрыв шины ставить низкоомные резисторы?).
-
Ещё подсказка на будущее - при компиляции в С++ режиме стандартные обработчики нужно объявлять как С-функции:
extern "C" void USB_IRQHandler()
{
...
}
Это сделано.
Вопрос такого плана. Может кто имеет опыт работы с HID устройством. Вытаюсь организовать передачу данных от устройства в ПК без потерь. В процессоре в функции GetInReport() стоит счетчикЮ который инкрементируется каждый раз, когда вызывается функция. В проге на ПК делается следующее, в цикле параллельного процесса вызывается постоянно функция ReadFile() и читаются данные из устройства. Иногда наблюдаю пропуски пакетов. Такая задача реализуема или это по другому делается?
-
Дело в том, что не подключен свой или стандартный startup.s
Его можно взять из проекта с примером.
Точнее даже так. В том стартапе, который подключается (ИАРом?) по умолчанию имена обработчиков (в том числе и от USB) могут отличаться. Поэтому варианта два.
1. Узнать имя и изменить своё имя обработчика.
2. Использовать всегда свой стартап и своё имя (любое) обработчика в майне и в стартапе.
Вариант 1 - ошибка в имени обработчика. Подсмотрел в стартапе :rolleyes: , заменил на void USB_IRQHandler(void) и все сразу заработало. Спасибо!
В общем мне процессор очень понравился, если бы не мои ошибки, то вообще было бы все замечательно. Аппаратный хид работает как часы.
Всем спасибо за внимание.
-
Примеры победил. Ошибка была в плате. На вывод USB_VBUS не было подано +5V от разъема. Подал - все заработало! :08:
И мышка и виртуальный ком порт. Только драйвер на VCP под виндовс 7 не захотел ставиться.
Мой проект пока не работает. IAR не компилирует обработчик прерывания:
void USBIRQ_IRQHandler(void) { (*rom)->pUSBD->isr(); }
В чем может быть дело?
-
Нашёл такую вот инфу
Memory Restrictions: The rom-based HID drivers use sections 0x10000050 to 0x10000180 of the on-chip RAM, meaning that you will need to configure the linker in your toolchain to avoid this area. Any attempt to use this memory for your own code will almost certainly result in system failure. The project files provided with the LPC1343 Code Base are configure to exclude these chunks of memory from system use, but if you are implementing your own custom project and making use of rom-based HID you will need to make sure the linker is properly configured to avoid this memory range.
Из исходников в сети нашёл только один
http://www.microbuilder.eu/Projects/LPC134...43CodeBase.aspx
http://www.microbuilder.eu/Projects/LPC134...umentation.aspx
Но там вроде как похожий код, тоже без __enable_interrupt().
Только баг бутового (*rom)->pUSBD->init_clk_pins() описан. Точнее полубаг. Ядро начинает работать на 48 МГц, хотя это не обязательно и не всегда удобно.
Я учел, что нужно оставить место для аппартного усб стека и прописал это в файл компановщика, так как описано в апликейшин ноте по усб на этот проц.
Все равно не работает. Подпаял джитаг. Почистил примеры яра от инициализаций дисплеев и прочего. По прежнему HID и VCP примеры не работают. Пример микрофона работает.
После отладки своего проекта получил следующее:
Увидел, что в моем проекте не проходит функция (*rom)->pUSBD->init_clk_pins(); Отладчик на ней останавливается. Разбираюсь, в чем может быть дело.
-
Если речь о USBIRQ_IRQHandler, то в коде не видно ни указателя, ни прямого вызова. Так что его никто не догадается вызвать. И соответственно все прерывания от USB будут недоступны.
Попробую подпаять джитаг. Лучше один раз увидеть :) . Потом отпишусь.
-
Vitaliy_ARM, где разрешение прерываний в майне?
USBIRQ_IRQHandler кто будет вызывать? Даже указателя на него не видно.
Контроллер прерываний разве не надо настраивать?
Внизу кода, после функции main, прописан обработчик прерывания USB.
Если я не ошибаюсь, все настройки прерываний и прочего делают функции, зашитые в область памяти USB драйвера.
Это отражено в презентациях NXP и даташите на процессор.
Одну из презентаций приложил. Попробовал встроить также __enable_interrupt() в часть кода, результат все равно тот же: устройство не опознано.
Хотя usb загрузчик работает без проблем.
(*rom)->pUSBD->init(&DeviceInfo); (*rom)->pUSBD->connect(TRUE); __enable_interrupt(); while(1);
-
Интересно, а кто-нибудь вообще использует HID или MSD на этом процессоре?
-
Если не трудно, могут ли владельцы плат MCB1300 или LPCXpresso 1343 проверить приложенную прошивку?
Вроде бы сделано все правильно. Файл компановщика сконфигурирован в соответствии с AN10904.
Прошивка очень простая, но уже весь мозг сломал - не работает HID. :smile3046:
Основная часть кода выглядит следующим образом:
#include "includes.h" /* LPC13xx definitions */ #define USB_VENDOR_ID 0x1FC9 #define USB_PROD_ID 0x0003 #define USB_DEVICE 0x0100 USB_DEV_INFO DeviceInfo; HID_DEVICE_INFO HidDevInfo; ROM ** rom = (ROM **)0x1fff1ff8; #define EN_TIMER32_1 (1<<10) #define EN_IOCON (1<<16) #define EN_USBREG (1<<14) #define PORT0 0 #define PORT1 1 #define PORT2 2 #define PORT3 3 /* * Get HID Input Report -> InReport */ void GetInReport (uint8_t src[], uint32_t length) { uint8_t PCInReportData = 0; /* */ src[0] = PCInReportData; } /* * Set HID Output Report <- OutReport */ void SetOutReport (uint8_t dst[], uint32_t length) { uint8_t PCOutReportData = dst[0]; } int main (void) { volatile int n; HidDevInfo.idVendor = USB_VENDOR_ID; HidDevInfo.idProduct = USB_PROD_ID; HidDevInfo.bcdDevice = USB_DEVICE; HidDevInfo.StrDescPtr = (uint32_t)&USB_StringDescriptor[0]; HidDevInfo.InReportCount = 1; HidDevInfo.OutReportCount = 1; HidDevInfo.SampleInterval = 0x20; HidDevInfo.InReport = GetInReport; HidDevInfo.OutReport = SetOutReport; DeviceInfo.DevType = USB_DEVICE_CLASS_HUMAN_INTERFACE; DeviceInfo.DevDetailPtr = (uint32_t)&HidDevInfo; LPC_SYSCON->SYSAHBCLKCTRL |= (EN_TIMER32_1 | EN_IOCON | EN_USBREG); (*rom)->pUSBD->init_clk_pins(); for (n = 0; n < 75; n++) {}; (*rom)->pUSBD->init(&DeviceInfo); (*rom)->pUSBD->connect(TRUE); while(1); } void USBIRQ_IRQHandler(void) { (*rom)->pUSBD->isr(); }
-
Делал. Правда микрофон у меня не спец и терять пакеты можно.
ЦАП работает с частотой дискретизации чуть выше требуемой (точнее ближайшей возможной выше требуемой).
Заполняет некоторый буфер. Компандируется, вычисляется энергия, максимумы и проч. Буфер расщепляется на два: один содержит все четные отсчеты, второй - все нечетные. Буфера маркируются инкрементным счетчиком и по UDP отсылаются.
Приемная сторона накапливает принятые пакеты в кольцевом буфере. Если потерян один из пакетов пары - происходит копирование из существующего пакета (эквивалентно снижению частоты дискретизации). Если потеряны оба, то копируется предыдущие существующие (ослабленные).
Если кольцо заполнено больше чем на половину, то воспроизвожу на один отсчет меньше (один пропускаю), иначе - на один отсчет больше (проигрываю один лишний). При сильном отклонении число отбрасываемых/дополняемый отсчетов пропорционально отклонению. При малом отклонении - корректировку не производим.
Интересное решение. Что будет, если пропадут сразу, скажем, 3 пакета. Замещаете уже существующими?
частичная выборка индесков на Verilog.
в Языки проектирования на ПЛИС (FPGA)
Опубликовано · Пожаловаться
Для того, чтобы не плодить тем по простым вопросам, решил написать сюда.
Есть выражение:
Первая строчка работает исправно, вторая строчка выдает 0 при бОльших по модулю отрицательных числах вместо 1. В чем может быть дело?
Неужели в таком выражении нельзя использовать сравнение со знаковыми числами?