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

    

Ruslan-maniak

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о Ruslan-maniak

  • Звание
    Частый гость

Информация

  • Город
    Томск

Посетители профиля

1 240 просмотров профиля
  1. Подскажите опытные товарищи. Использую этот способ для сквозной нумерации в каналах. Но получается так что нумерация происходит, а вопросительный знак остаётся. Если в дезигнаторе удалить вопросительны знак, то и после нумерации его не будет. И в целом как-то там всё нестабильно с этим. Бывает что вообще любой вид нумерации оставляет знак вопроса, бывает починится. С чем это связано определить не получается.
  2. STM32F103 и сильный шум АЦП

    Некоторые дополнения. Смотрите, у меня 20 идентичных по схемотехнике каналов. Все 20 каналов идут через повторители на ОУ. Перед ОУ стоят цифровые потенциометры которые в данный момент прижимают сигнал к земле накоротко. Если замерить мультиметром то сопротивление получается там около 200-300 Ом. Так вот сейчас для эксперимента запускаю измерения только для одного канала циклически через ДМА (буфер на 10 замеров) и каждую миллисекунду смотрю что в буфере. И например на канале ADC1-15 среднее значение этого буфера всегда равно нулю, а максимальный пик фиксируется за длительное время не более 10 LSB. Если же взять канал ADC1-10 то там картина разительно отличается. Среднее значение буфера скачет от 20 до 80 LSB. А максимальный пик фиксируется практически сразу в районе 180 LSB, и постепенно доходит до 200 LSB. Даже если я замыкаю напрямую землю контроллера и пин АЦП. На мой взгляд такое поведение вряд ли можно объяснить (оправдать) неправильной разводкой (разводка отличается лишь тем что длина дорожки от ОУ до АЦП больше на 4 см), непромывкой, или проблемами с питанием. Кто что думает?
  3. STM32F103 и сильный шум АЦП

    Действительно, там шумновато. амплитуда шумов около 0.05 В. Попробую докинуть ёмкости. Но мне кажется, дело не только в шуме.
  4. STM32F103 и сильный шум АЦП

    До 4095 не доходит. В районе 4000 LSB. плюс-минус. Калибровку произвожу ADC_Cmd(adc->number, ENABLE); // калибровка АЦП ADC_ResetCalibration(adc->number); while(ADC_GetResetCalibrationStatus(adc->number)); ADC_StartCalibration(adc->number); while(ADC_GetCalibrationStatus(adc->number)); ADC_SoftwareStartConvCmd(adc->number, ENABLE);
  5. STM32F103 и сильный шум АЦП

    Приветствую. Пытаюсь запустить все АЦП каналы доступные на контроллере STM32F103ZCT (21 канал: 15 каналов в ADC1 и 6 каналов в ADC3) при одновременной работе через ДМА в циклическом режиме. То есть выборка происходит все время для всех каналов. И столкнулся со следующей проблемой. Очень большой шум в каналах (но не во всех). Даже если их накоротко посадить на землю, то на некоторых каналах (особенно у ADC3) измерения достигают 100-150 LSB. При чем эти значения не периодические, а постоянны, то есть ноль в канале я вижу реже чем значение выше например 50 LSB. При этом у каждого канала свой шум и он также зависит от Rank'а присвоенного при конфигурировании канала. Частота тактирования АЦП = 36МГц. Если её опускать то ничего не меняется. Время сэмплирования стоит максимальное ADC_SampleTime_239Cycles5. Подскажите как получить адекватные значения по всем каналам? Кто сталкивался с такой проблемой? Или СТМ на это не способен в принципе и стоит сразу смотреть в сторону внешних АЦП?
  6. STM32F1 USB Композитный

    Приветствую коллеги. Реализую композитное (virtual com port и MIDI) юсб устройство на STM32F103 с использованием STM32_USB-FS-Device_Lib_V4.1.0. И столкнулся со следующей проблемой. Дескриптор составного устройства виндой воспринимается нормально. Я вижу все доступные мне интерфейсы и дрова к ним цепляются без проблем. Но почему-то данные получает и передает лишь тот интерфейс который сидит на EP1. А интерфейс который на EP3 данные не принимает. А при передаче отправляет заявленное кол-во байт, но почему-то из нулевого адреса USB памяти под буферы, а не из адреса буфера используемой конечной точки. То есть если поменять местами EP у интерфейсов то будет работать уже другой интерфейс - у которого окажется EP1. Привожу дескриптор конфигурации: CODE0x09, 0x02, VIRTUAL_COM_PORT_SIZ_CONFIG_DESC, 0x00, 0x03, 0x01, 0x00, 0x80, 0x32, // Config // MIDI 0x09, 0x04, 0x00, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, // Interface 1 0x07, 0x24, 0x01, 0x00, 0x01, 0x41, 0x00, // CS Interface (midi) 0x06, 0x24, 0x02, 0x01, 0x01, 0x00, // IN Jack 1 (emb) 0x06, 0x24, 0x02, 0x02, 0x02, 0x00, // IN Jack 2 (ext) 0x09, 0x24, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x00, // OUT Jack 3 (emb) 0x09, 0x24, 0x03, 0x02, 0x04, 0x01, 0x01, 0x01, 0x00, // OUT Jack 4 (ext) 0x09, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, // Endpoint OUT 0x05, 0x25, 0x01, 0x01, 0x01, // CS EP IN Jack 0x09, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, // Endpoint IN 0x05, 0x25, 0x01, 0x01, 0x03, 0x08, /*length*/ 0x0B, /*Interface association descriptor type*/ 0x01, /*The first associated interface */ 0x02, /*Number of continuous associated interface*/ 0x02, /*bInterfaceClass of the first interface*/ 0x02, /*bInterfaceSubclass of the first interface*/ 0x02, /*bInterfaceProtocol of the first interface*/ 0x00, /*Interface string index*/ /*Interface Descriptor*/ 0x09, /* bLength: Interface Descriptor size */ USB_DESCRIPTOR_INTERFACE_TYPE, /* bDescriptorType: Interface */ /* Interface descriptor type */ 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ 0x00, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x00, /* bDescriptorSubtype: Header Func Desc */ 0x10, /* bcdCDC: spec release number */ 0x01, /*Call Management Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ 0x00, /* bmCapabilities: D0+D1 */ 0x01, /* bDataInterface: 1 */ /*ACM Functional Descriptor*/ 0x04, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 0x02, /* bmCapabilities */ /*Union Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ 0x00, /* bMasterInterface: Communication class interface */ 0x01, /* bSlaveInterface0: Data Class Interface */ /*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESCRIPTOR_ENDPOINT_TYPE, /* bDescriptorType: Endpoint */ 0x82, /* bEndpointAddress: (IN2) */ 0x03, /* bmAttributes: Interrupt */ 0x08, /* wMaxPacketSize: */ 0x00, 0xFF, /* bInterval: */ /*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_DESCRIPTOR_INTERFACE_TYPE, /* bDescriptorType: */ 0x02, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ 0x00, /* iInterface: */ /*Endpoint 3 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESCRIPTOR_ENDPOINT_TYPE, /* bDescriptorType: Endpoint */ 0x03, /* bEndpointAddress: (OUT3) */ 0x02, /* bmAttributes: Bulk */ 0x40, /* wMaxPacketSize: */ 0x00, 0x00, /* bInterval: ignore for Bulk transfer */ /*Endpoint 1 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESCRIPTOR_ENDPOINT_TYPE, /* bDescriptorType: Endpoint */ 0x83, /* bEndpointAddress: (IN3) */ 0x02, /* bmAttributes: Bulk */ 0x40, /* wMaxPacketSize: */ 0x00, 0x00, /* bInterval */ код конфигурации конечных точек CODEvoid Virtual_Com_Port_Reset(void) { /* Set Virtual_Com_Port DEVICE as not configured */ pInformation->Current_Configuration = 0; /* Current Feature initialization */ pInformation->Current_Feature = Virtual_Com_Port_ConfigDescriptor[7]; /* Set Virtual_Com_Port DEVICE with the default Interface*/ pInformation->Current_Interface = 0; SetBTABLE(BTABLE_ADDRESS); /* Initialize Endpoint 0 */ SetEPType(ENDP0, EP_CONTROL); SetEPTxStatus(ENDP0, EP_TX_STALL); SetEPRxAddr(ENDP0, ENDP0_RXADDR); SetEPTxAddr(ENDP0, ENDP0_TXADDR); Clear_Status_Out(ENDP0); SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); SetEPRxValid(ENDP0); /* Initialize Endpoint 1 */ SetEPType(ENDP1, EP_BULK); SetEPRxAddr(ENDP1, ENDP1_RXADDR); SetEPRxCount(ENDP1, 0x40); SetEPRxStatus(ENDP1, EP_RX_VALID); SetEPTxAddr(ENDP1, ENDP1_TXADDR); SetEPTxStatus(ENDP1, EP_TX_NAK); /* Initialize Endpoint 2 */ SetEPType(ENDP2, EP_INTERRUPT); SetEPTxAddr(ENDP2, ENDP2_TXADDR); SetEPRxStatus(ENDP2, EP_RX_DIS); SetEPTxStatus(ENDP2, EP_TX_NAK); // /* Initialize Endpoint 3 */ SetEPType(ENDP3, EP_BULK); SetEPRxAddr(ENDP3, ENDP3_RXADDR); SetEPRxCount(ENDP3, 0x40); SetEPRxStatus(ENDP3, EP_RX_VALID); SetEPTxAddr(ENDP3, ENDP3_TXADDR); SetEPTxStatus(ENDP3, EP_TX_NAK); /* Set this device to response on default address */ SetDeviceAddress(0); bDeviceState = ATTACHED; } определение адресов точек Код#define BTABLE_ADDRESS      (0x00) /* EP0  */ /* rx/tx buffer base address */ #define ENDP0_RXADDR        (0x18) #define ENDP0_TXADDR        (0x58) #define ENDP1_TXADDR        (0x98) #define ENDP1_RXADDR        (0xD8) #define ENDP2_TXADDR        (0x118) #define ENDP3_TXADDR        (0x130) #define ENDP3_RXADDR        (0x150) отправка и прием стандартные CODEuint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length) { /*if max buffer is Not reached*/ if(Send_length < VIRTUAL_COM_PORT_DATA_SIZE) { /*Sent flag*/ packet_sent1 = 0; /* send packet to PMA*/ UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length); SetEPTxCount(ENDP1, Send_length); SetEPTxValid(ENDP1); } else { return 0; } return 1; } void EP3_OUT_Callback (void) { receive_length = GetEPRxCount(ENDP3); PMAToUserBufferCopy((unsigned char*)receive_Buffer, ENDP3_RXADDR, receive_length); packet_receive = 1; SetEPRxValid(ENDP3); } количество EP определено как Код#define EP_NUM                          (7) Если что-то ещё нужно показать - говорите.
  7. Высокая (>1.5Mbit/s) скорость без TCP IP.

    Цитата(mantech @ Feb 22 2018, 13:08) ЗЫ. Вообще мне не понятно, чем так не угодил "стандартный" вариант использования вафли? То есть вы предлагаете на центральном модуле организовать точку доступа. Узлами подключиться к нему и слать широковещательный udp пакет? А какой модуль будет оптимальным для этого?
  8. Высокая (>1.5Mbit/s) скорость без TCP IP.

    Приветствую коллеги. У меня следущая задача: построить сеть типа звезда. При этом подавляющая часть данных одинаковая и должна уходить во все концы этой звезды одновременно. При этом нужна хорошая скорость. Хотя бы 1.5 Мбит/с, а лучше все 2. Предполагаю 2 решения: 1) Подобрать радиомодуль способные реализовать такую скорость. Пока из всех мне известных подходит DW1000 со своими 6.8 Мбит/с. Но он очень жирный, там много всего наворочено. Может кто знает другой модуль попроще и подешевше, но способный выдать нужную скорость? 2) Использовать WI-FI модуль. Но с вай-фаем я никогда не работал и возникает вопрос, реально ли вай-фай модули, хотя бы некоторые, использовать без tcp ip стека и всего иже с ним. А именно рассылать с одного модуля на несколько других сырые данные как-то. Не организуя обычную точку доступа, а реализуя все на низком уровне. Подскажите кто шарит в этой теме. Спасибо.
  9. STM32F103 и ч/б RGB интерфейс

    Оказалось что сигнал клока не заходил в шлейф. Исправил. Теперь в DE mode все работает как надо.
  10. STM32F103 и ч/б RGB интерфейс

    Цитата(aaarrr @ May 17 2017, 14:05) Переведите HS и VS в третье стостояние, а DE управляйте как обычно - это и будет DE-mode. Третье состояние - это оставить в воздухе? Все так и сделал. Глянул осцилом - все как надо. Но все равно результат не изменился. Надо искать логический анализатор.
  11. STM32F103 и ч/б RGB интерфейс

    Цитата(aaarrr @ May 17 2017, 01:57) В коде из первого сообщения неверная полярность DE - он должен быть в '1' при активных данных. HS и VS вообще не нужны, работайте в DE-mode. В коде с полярностью все верно. По DE подается именно '1' когда передаются данные. Спасибо что натолкнули на DE mode. Не знал про него. Только в даташите на матрицу не указаны параметры для реализации этого режима.
  12. STM32F103 и ч/б RGB интерфейс

    Соорудил все на ногодрыге из дма по таймеру. Но все равно матрица ничего не выдает. Такое ощущение что она вообще не воспринимает сигналы с стм. То есть без разницы включаю я питание и подаю сигналы или просто включаю питание логики без сигналов - реакция матрицы идентична: появляются некоторые вертикальные цветные линии. К сожалению нет под рукой логического анализатора, но то что можно увидеть по осцилографу - все как по даташиту матрицы.
  13. STM32F103 и ч/б RGB интерфейс

    А может кто-нибудь поделиться примером ногодрыга из дма по таймеру? Адекватных работающих примеров я не нагуглил.
  14. STM32F103 и ч/б RGB интерфейс

    Цитата(Эдди @ May 14 2017, 13:22) И да, для начала попробуйте просто повыкидывать все библиотечные функции из тела обработчика прерывания. Переключайте напрямую регистрами. Переход на работу с регистрами к сожалению не исправил положение. FSMC тоже вряд ли поможет, там ведь также придется отдельно работать с сигналами управления. Остается попробовать ногодрыг через дма.
  15. STM32F103 и ч/б RGB интерфейс

    Приветствую, коллеги. Пытаюсь реализовать на STM32F103 поддержку RGB интерфейса (DATA[24], DataCLK, VSYNC, HSYNC, DataEN) для передачи изображения на матрицу матрицу hsd050idw1-a20. Изображение нужно только черно-белое (не градиент, а именно только черное и только белое), поэтому пытаюсь сделать аналогично данной статье. Также использую SPI для формирования сигналов DATA[24] и DataCLK. Остальные сигналы реализуются просто на GPIO. Длительность этапов отправки данных формируются размером ДМА. То есть сформировал сигналы задал размер дма и запустил его, в прерывании завершения отправки дма переключаю сигналы в новое положение, задаю новый размер дма и запускаю отправку. и т.д. Естественно при каждом таком переходе образуется небольшая пауза в тактировании DataCLK. Собственно код прерывания дма следующий : CODEvoid LcdSpiHandler (void) { while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE) == RESET); while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_BSY) == SET); switch(lcd->vState) { case(eLcdState_PULSE): { switch(lcd->hState) { case(eLcdState_PULSE): { GPIOSet(lcd->gpioHSync); lcd->hState = eLcdState_BACK_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_BACK_PORCH): { lcd->hState = eLcdState_DATA; DMASetCurrDataCounter(100, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_DATA): { lcd->hState = eLcdState_FRONT_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_FRONT_PORCH): { if(lcd->hNumber == 2) { GPIOSet(lcd->gpioVSync); GPIOReset(lcd->gpioHSync); lcd->vState = eLcdState_BACK_PORCH; lcd->hState = eLcdState_PULSE; lcd->hNumber = 0; DMASetCurrDataCounter(6, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); } else { GPIOReset(lcd->gpioHSync); lcd->hNumber++; DMASetCurrDataCounter(6, lcd->spi->dmaTx); lcd->hState = eLcdState_PULSE; DMACmd(ENABLE, lcd->spi->dmaTx); } break; } } break; } case(eLcdState_BACK_PORCH): { switch(lcd->hState) { case(eLcdState_PULSE): { GPIOSet(lcd->gpioHSync); lcd->hState = eLcdState_BACK_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_BACK_PORCH): { lcd->hState = eLcdState_DATA; DMASetCurrDataCounter(100, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_DATA): { lcd->hState = eLcdState_FRONT_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_FRONT_PORCH): { if(lcd->hNumber == 28) { GPIOReset(lcd->gpioHSync); lcd->vState = eLcdState_DATA; lcd->hState = eLcdState_PULSE; lcd->hNumber = 0; DMASetCurrDataCounter(6, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); } else { GPIOReset(lcd->gpioHSync); lcd->hNumber++; DMASetCurrDataCounter(6, lcd->spi->dmaTx); lcd->hState = eLcdState_PULSE; DMACmd(ENABLE, lcd->spi->dmaTx); } break; } } break; } case(eLcdState_DATA): { switch(lcd->hState) { case(eLcdState_PULSE): { GPIOSet(lcd->gpioHSync); lcd->hState = eLcdState_BACK_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_BACK_PORCH): { GPIOSet(lcd->gpioDe); lcd->hState = eLcdState_DATA; DMASetCurrDataCounter(100, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_DATA): { GPIOReset(lcd->gpioDe); lcd->hState = eLcdState_FRONT_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_FRONT_PORCH): { if(lcd->hNumber == 479) { GPIOReset(lcd->gpioHSync); lcd->vState = eLcdState_FRONT_PORCH; lcd->hState = eLcdState_PULSE; lcd->hNumber = 0; DMASetCurrDataCounter(6, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); } else { GPIOReset(lcd->gpioHSync); lcd->hNumber++; DMASetCurrDataCounter(6, lcd->spi->dmaTx); lcd->hState = eLcdState_PULSE; DMACmd(ENABLE, lcd->spi->dmaTx); } break; } } break; } case(eLcdState_FRONT_PORCH): { switch(lcd->hState) { case(eLcdState_PULSE): { GPIOSet(lcd->gpioHSync); lcd->hState = eLcdState_BACK_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_BACK_PORCH): { lcd->hState = eLcdState_DATA; DMASetCurrDataCounter(100, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_DATA): { lcd->hState = eLcdState_FRONT_PORCH; DMASetCurrDataCounter(5, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); break; } case(eLcdState_FRONT_PORCH): { if(lcd->hNumber == 12) { GPIOReset(lcd->gpioVSync); GPIOReset(lcd->gpioHSync); lcd->vState = eLcdState_PULSE; lcd->hState = eLcdState_PULSE; lcd->hNumber = 0; DMASetCurrDataCounter(6, lcd->spi->dmaTx); DMACmd(ENABLE, lcd->spi->dmaTx); } else { GPIOReset(lcd->gpioHSync); lcd->hNumber++; DMASetCurrDataCounter(6, lcd->spi->dmaTx); lcd->hState = eLcdState_PULSE; DMACmd(ENABLE, lcd->spi->dmaTx); } break; } } break; } } } Но к сожалению так оно не взлетает. может есть способ как-то поумнее управлять сигналами управления, а не просто переключать в прерывании. К сожалению в вышеприведенной статье об этом не упоминается. Подскажите кто что думает.