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

Vitaliy_ARM

Свой
  • Постов

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

  • Посещение

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


  1. Для того, чтобы не плодить тем по простым вопросам, решил написать сюда. Есть выражение: thr1 <= (data_o > 32'd30) ? 1'b1 : 1'b0; thr0 <= (data_o < -32'd30) ? 1'b1 : 1'b0; Первая строчка работает исправно, вторая строчка выдает 0 при бОльших по модулю отрицательных числах вместо 1. В чем может быть дело? Неужели в таком выражении нельзя использовать сравнение со знаковыми числами?
  2. Keil+LPC1778

    Стоит следующая задача. Вектора прерываний надо расположить в начале 0-го сектора Flash (по 0-му адресу). А все остальное содержимое прошивки нужно расположить начиная с 0x10000 адреса. Как это правильно сделать в линкере Keil? Мой код ниже не работает, прошивка улетает в HardFault_Handler спустя некоторое время. Подскажите, где грабли?
  3. Провел несколько экспериментов и не совсем понял, когда там появляется сигнал. Постоянно его там нет. В итоге решил задачу по-другому. Плис тактируется от 120 МГц и этой частоты было достаточно, чтобы написать контроллер асинхронной памяти в ПЛИС. Таким образом я получил максимальную скорость обмена 10 мегабайт в секунду по 16-битной шине и меня это устроило. Спасибо за помощь.
  4. Отличная идея, жаль не смогу так сделать. CLKOUT не выведена на поверхность. Выведен EMC_CLK0. Может есть возможность его использовать без сигналов RAS, CAS, и т.п?
  5. Синхронная внешняя шина

    По интерфейсу внешней шины к микроконтроллеру подключена FPGA. Шина позволяет работать с динамической памятью SDRAM, которая синхронная. Подскажите, существует ли возможность настроить внешнюю шину этого контроллера, чтобы сигналы WE и OE выдавались на шину с некоторым тактовым сигналом. Т.е. нужны ADDR, DATA, OE, WE и некий CLK.???
  6. Не совсем понял вас. Как делить на степерь двойки я знаю. Есть 120 коэффициентов, при перемножении коэффициентов с максимальным уровнем входного сигнала на выходе каждого умножителя разрядная сетка будет скакать в пределах 32...64 бита (зависит от конкретного коэффициента фильтра), потом эти значения попадают на сумматор, на котором тоже увеличивается разрядная сетка. Вот собственно вопрос, как правильно сделать усечение на выходе, чтобы использовать максимально разрядную сетку? Так как не всегда старшие биты сумматора будут нести информацию.
  7. У меня другой вопрос, написал фильтр на verilog. Регистр сдвига сделан на двухпортовой памяти, коэффициенты так же хранятся в двухпортовой памяти. Количество коэффициентов, TAPS = 120. Входные данные и коэффициенты имеют разрядность = 32. Какую разрядность должен иметь MAC? И как правильно сделать усечение для получения 32 битного результата на выходе. P.S. Максимальная разрядность MAC расчитывается (разр. коэфф. + разрядность входа) + log2(TAPS) ??? У меня сделано так, на выход подаю старшие 32 бита MAC. В итоге имею на выходе фильтра дрейфующую в небольших пределах постоянку. Как победить?
  8. Понятно. У меня минимальная длительность импульса может быть 0,5 мкс и тактовая частота у AD9957 используется 600 МГц. Приведенным мной способом не получится сделать такой модулятор. Идеальное решение, получается, это только использовать квадратуры и формировать FSK в ПЛИС подобным образом: http://www.dsplib.ru/content/fsk/fsk.html Может кто-то использовал или знает другие решения скоростного формирователя FSK?
  9. Чтобы не плодить тем, пишу сюда. Стоит задача реализовать FSK модулятор на этой микросхеме. Самый простой способ - использовать два профиля, пишем в один профиль частоту MARK, а в другой - SPACE. И путем переключения профилей осуществляем модуляцию. Вопрос, это переключение будет происходит без разрыва фаз? (переключаться частота будет в тот момент, когда на выходе синусоида проходит через 0).
  10. Добрый день, возникла необходимость использовать высокоскоростной цап, у которого применен этот интерфейс. У Lattice есть специальное ядро для этого протокола, но оно, похоже, платное. Подходит для семейств EPC3 и EPC4: http://www.latticesemi.com/documents/I0197.pdf Может кто уже занимался этим вопросом. Можно ли влезть в цену 50-80$ за ПЛИС при использовании этого интерфейса и можно ли обойтись без покупки ядер JESD204A?????
  11. Всем доброго времени! Подскажите, что это за функция для комплексных чисел, может есть русский аналог этого названия? Как ее считать?
  12. Пишу спец загрузчик и как раз столкнулся с тем, что мне надо иметь две таблицы векторов прерываний. Задача загрузчика записать приложение по адресам 0x0-0xFFFF, т.е после чего он уже будет не нужен. И на место него пользовательское приложение будет писать другие данные, но это не важно. Механизм такого загрузчика предполагается сделать так. 1. Копируются вектора прерываний куда-нибудь (во флешь или озу) 2. Делается ремап. 3. Стартует загрузчик Можно ли сделать копирование векторов прерываний в другую страницу на этапе линковки загрузчика, скажем по адресу 0x18000?
  13. USB HID LPC1768

    Спасибо за подсказку. Не нашел сразу эти константы. Допилил следующие моменты: 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. Прикрепляю сей проект к этому топику :) USBHID.zip
  14. Может у кого попадалось. Была у меня плата MCB2300, выбросил от туда LPC2378 и поставил LPC1768. Перенес проект со стеком ARP+ICMP+UDP на этот микроконтроллер. Написал программу. Блок данных передается от платы в ПК и возвращается обратно в плату. После некоторых манипуляций заметил следующую ерунду. Каждый десятый пакет приходит битый. Причем битый там всего один байт. Может быть в начале, может в конце, происходит случайно. Проверил снифером, пакет бьется в микроконтроллере по приему, так как входящие пакеты на пк и исходящие - целые. Думал, вышли из строя микросхемы LPC и PHY. Обе заменил, все тоже самое. Может у кого было нечто подобное?
  15. USB HID LPC1768

    В одно время сделал устройство в виде небольшой клавиатуры с кнопками и светодиодами на микропроцессоре 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 мс?
  16. Всем доброго времени. Есть задача подключения АЦП 14 бит 160 МГц к ПЛИС, в качестве которой хочу выбрать EP3C25E144C8N. Шина данных - CMOS. Вопрос, можно ли шину данных цеплять на разные банки плис при такой тактовой? (p.s. нужно ли в разрыв шины ставить низкоомные резисторы?).
  17. LPC13XX

    Это сделано. Вопрос такого плана. Может кто имеет опыт работы с HID устройством. Вытаюсь организовать передачу данных от устройства в ПК без потерь. В процессоре в функции GetInReport() стоит счетчикЮ который инкрементируется каждый раз, когда вызывается функция. В проге на ПК делается следующее, в цикле параллельного процесса вызывается постоянно функция ReadFile() и читаются данные из устройства. Иногда наблюдаю пропуски пакетов. Такая задача реализуема или это по другому делается?
  18. LPC13XX

    Вариант 1 - ошибка в имени обработчика. Подсмотрел в стартапе :rolleyes: , заменил на void USB_IRQHandler(void) и все сразу заработало. Спасибо! В общем мне процессор очень понравился, если бы не мои ошибки, то вообще было бы все замечательно. Аппаратный хид работает как часы. Всем спасибо за внимание.
  19. LPC13XX

    Примеры победил. Ошибка была в плате. На вывод USB_VBUS не было подано +5V от разъема. Подал - все заработало! :08: И мышка и виртуальный ком порт. Только драйвер на VCP под виндовс 7 не захотел ставиться. Мой проект пока не работает. IAR не компилирует обработчик прерывания: void USBIRQ_IRQHandler(void) { (*rom)->pUSBD->isr(); } В чем может быть дело?
  20. LPC13XX

    Я учел, что нужно оставить место для аппартного усб стека и прописал это в файл компановщика, так как описано в апликейшин ноте по усб на этот проц. Все равно не работает. Подпаял джитаг. Почистил примеры яра от инициализаций дисплеев и прочего. По прежнему HID и VCP примеры не работают. Пример микрофона работает. После отладки своего проекта получил следующее: Увидел, что в моем проекте не проходит функция (*rom)->pUSBD->init_clk_pins(); Отладчик на ней останавливается. Разбираюсь, в чем может быть дело.
  21. LPC13XX

    Попробую подпаять джитаг. Лучше один раз увидеть :) . Потом отпишусь.
  22. LPC13XX

    Внизу кода, после функции main, прописан обработчик прерывания USB. Если я не ошибаюсь, все настройки прерываний и прочего делают функции, зашитые в область памяти USB драйвера. Это отражено в презентациях NXP и даташите на процессор. Одну из презентаций приложил. Попробовал встроить также __enable_interrupt() в часть кода, результат все равно тот же: устройство не опознано. Хотя usb загрузчик работает без проблем. (*rom)->pUSBD->init(&DeviceInfo); (*rom)->pUSBD->connect(TRUE); __enable_interrupt(); while(1); lpc13xx.usb.pdf
  23. LPC13XX

    Интересно, а кто-нибудь вообще использует HID или MSD на этом процессоре?
  24. LPC13XX

    Если не трудно, могут ли владельцы плат 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(); } Hid.zip
  25. Интересное решение. Что будет, если пропадут сразу, скажем, 3 пакета. Замещаете уже существующими?
×
×
  • Создать...