Зарегистрирован: Ср мар 22, 2017 09:52:52 Сообщений: 130
Рейтинг сообщения:0
Отключение отладочной информации не помогает, если конечно я её правильно отключаю (убираю галку в Flash/Configure Flash Tools/Output с Debug Information). Без неё, кстати, на Level 0 также не работает, причём на любой частоте, но это уже не важно...
Ставлю настройки PLL, как на картинке из Куба, которую oleg110592 прислал: На частоте 168MHz, при PLL_P = 2 ничего не работает. Стоит только поменять на PLL_P = 4, что соответствует частоте 84MHz, так тут же USB запускается. Не связано ли это с тем что где-нибудь глубоко в функциях работы USB используются временные задержки реализованные по типу for(i=0; i<delay; i++){......} ?
Вот, кстати, нашёл в файле usb_bsp.c одну какую-то подобную:
да туповатая задержка - в файле usb_core.c есть вызовы такой задержки: USB_OTG_BSP_uDelay(3); Посмотрел - в родных либах присутствует такое же. Индусы четко под 84МГц писали что ли?
Стартап для серии Connectivity берет кварц на 25МГц, на плате 8. Поправил. На выходе MCO частота 72МГц +0.0003 . Кстати, странная какая-то форма сигнала, я думал там должен быть прямоугольные импульсы. Если до 8МГц еще что-то похоже, то далее, чем выше частота, тем больше постоянная составляющая и меньше размах сигнала. Так например, если частота 40МГц, то размах меньше вольта при постоянной составляющей 1.7В. А если на выход MCO пустить все 72МГц, то при той же постоянной составляющей размах всего-лишь 400мВ (но тут ладно, выше 50МГц и не должно работать). Странно как-то, но частота 72МГц есть. Ну можно будет еще какой-нибудь ШИМ с таймера пустить на выход, но вроде как и так 72МГц, что еще проверять.
//----------
Теперь что касается USB. Инициализирую так. Спойлер
OTG_FS_GENERAL->RSTCTL=OTG_FS_GENERAL_RSTCTL_RXFFLSH; while (OTG_FS_GENERAL->RSTCTL & OTG_FS_GENERAL_RSTCTL_RXFFLSH);
//---------- /*1. Set the NAK bit for all OUT endpoints – SNAK = 1 in OTG_FS_DOEPCTLx (for all OUT endpoints) */ //OTG_FS_DEVICE->OUTEP[0].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_SNAK; OTG_FS_DEVICE->OUTEP[0].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_CNAK;
//---------- /* 3. Set up the Data FIFO RAM for each of the FIFOs – Program the OTG_FS_GRXFSIZ register, to be able to receive control OUT data and setup data. If thresholding is not enabled, at a minimum, this must be equal to 1 max packet size of control endpoint 0 + 2 words (for the status of the control OUT data packet) + 10 words (for setup packets). – Program the OTG_FS_TX0FSIZ register (depending on the FIFO number chosen) to be able to transmit control IN data. At a minimum, this must be equal to 1 max packet size of control endpoint 0. */
OTG_FS_GENERAL->RXFSIZ = RX_FIFO_SIZE;//размер буфера для приема OTG_FS_GENERAL->TX0FSIZ = (TX_EP0_FIFO_SIZE<<16) | RX_FIFO_SIZE;//размер буфера и адрес для передачи точки 0
//---------- /* 4. Program the following fields in the endpoint-specific registers for control OUT endpoint 0 to receive a SETUP packet – STUPCNT = 3 in OTG_FS_DOEPTSIZ0 (to receive up to 3 back-to-back SETUP packets) */ OTG_FS_DEVICE->OUTEP[0].TSIZ = OTG_FS_DEVICE_ENDPOINT_TSIZ_STUPCNT_OUT0 | OTG_FS_DEVICE_ENDPOINT_TSIZ_PKTCNT_OUT0 | OTG_FS_DEVICE_ENDPOINT_TSIZ_XFRSIZ_OUT0 | 0;
OTG_FS_GENERAL_INTMSK_RXFLVLM | //буфер приема не пустой OTG_FS_GENERAL_INTMSK_OEPM | //прерывание от OUT EP 0; //---------- OTG_FS_DEVICE->OUTEP[0].CTL|= OTG_FS_DEVICE_ENDPOINT_CTL_CNAK | //сбросить NAK 0;
};
Далее я должен поймать запрос дескриптора, хост этот запрос шлет, вижу я его лог. анализатором. Но никаких флагов установленных я не вижу, в том числе не вижу флага SOF. С меня, за помощь, огромное спасибо.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Добрый вечер. Пытаюсь запустить USB на stm32f103c8 и столкнулся со следующей проблемой: после того, как я получаю запрос дескриптора устройства (0x8006_0100_0000_4000), не могу передать сам дескриптор хосту. Долго не мог понять в чём заключается дело, пока не стал проверять значения регистра COUNTn_TX и буфера данных передачи. Как оказалось значения там не во всех случаях такие, которые я пытаюсь туда поместить. Например, если я пишу по адресу 0x6000_4000 + 0*16 + 4 (COUNTn_TX для нулевой точки, btable = 0) значение 0xffff_f1ff, то прочитав этот адрес, в дебаггере получаю значение 0x0000_f1ff (вроде бы всё как и должно быть, поскольку только два первых байта записываются), а вот если я пытаюсь записать туда размер передаваемого дескриптора (0x0000_0012), то получаю в консоле только 3 байта - 0x00, 0x00, 0x00. Возможно это проблема самособранного дебаггера (uart + xxd), но раньше с таким не встречался. Или я плохо разобрался с адресацией PMA, хотя, опять же, получение данных работает корректно. Проверил на двух контроллерах, результат один, значит где-то в софте косяки. Не подскажете, в каком направлении начать искать ошибки? Спасибо
У f103 PMA "дырявый". Писать надо 32-битными словами, но значащих только 16 бит. В отладчике будешь видеть пакеты в виде: два байта - два нуля - два байта - два нуля и т.д.
Ну я так и делаю. Если я пишу по адресу 0x4000_6000 (адрес буфера передачи нулевой точки при btable = 0) значение 0x0000_00040, то потом могу его так же просто считать оттуда и получу свои 0x0040. Если я проделаю ту же самую операцию, но уже для регистра 0x4000_6000 + 4 со значением, например, 0x0000_fff1, потом значение регистра перешлю побайтово через usart, то получу ожидаемый результат - 0x00, 0x00, 0xff, 0xf1. Но если я пытаюсь записать туда размер передаваемых данных (0x0000_0012), то по uart мне приходит уже не 4 байта, как раньше, а почему-то только 3, причем все равны 0. Какие-то проблемы с настройкой интерфейса может быть?
PS: Наводящий вопрос. Где лежат дескрипторы буферов приёма/передачи?
Ну если я указал btable = 0, то для нулевой точки: 0x4000_6000 - адрес буфера передачи, 0x4000_6004 - размер передаваемых данных, 0x4000_6008 - адрес буфера приема, 0x4000_600С - размер буфера приема + размер принятых данных. Если я правильно понял Ваш вопрос
Ну если я указал btable = 0, то для нулевой точки: 0x4000_6000 - адрес буфера передачи, 0x4000_6004 - размер передаваемых данных, 0x4000_6008 - адрес буфера приема, 0x4000_600С - размер буфера приема + размер принятых данных. Если я правильно понял Ваш вопрос
Хорошо, тогда пишите "Войну и мир" в буфер передачи и давайте команду на его отправку. Следующая грабля лежит в регистре управления конечной точкой. Там биты статуса меняются операцией XOR.
Ну если я указал btable = 0, то для нулевой точки: 0x4000_6000 - адрес буфера передачи, 0x4000_6004 - размер передаваемых данных, 0x4000_6008 - адрес буфера приема, 0x4000_600С - размер буфера приема + размер принятых данных. Если я правильно понял Ваш вопрос
Хорошо, тогда пишите "Войну и мир" в буфер передачи и давайте команду на его отправку. Следующая грабля лежит в регистре управления конечной точкой. Там биты статуса меняются операцией XOR.
Вот я сейчас как раз на этом моменте и застрял. Я записываю необходимые данные в буфер передачи, но почему-то данные не записываются. В руководстве к контроллеру в разделе USB я ничего такого не нашел, но может есть какие-то ограничения на запись/чтение PMA? Потому что работу с памятью отдельно я, в общем-то, не изучал
Записываем количество передаваемых данных в дескриптор буфера, сами данные в буфер и ставим статус TX_VALID в регистре управления конечной точкой. После чего ловим прерывания успешной передачи и следом следующий запрос (Set address).
Добавлено after 9 hours 9 minutes 20 seconds: Вчера спросонья перепутал последовательность. Сначала в буфер кладём, а затем размер указываем.
Спойлер
Код:
template<uint32_t EPNum> static inline void WriteEP(uint8_t *pData, uint32_t cnt) { if constexpr (EPNum==0) { // Очередь отправки только в EP0 if(cnt>=64) { WritePAM_TX<0>(pData, 64); ep_tx_q_adr=pData+64; //Размер очереди делаем на 1 больше, чтобы отправить ZLP в случае кратности 64 ep_tx_q_cnt=cnt-63; } else WritePAM_TX<0>(pData, cnt); } else WritePAM_TX<EPNum>(pData, cnt); EPSetStatus<EPNum>(EP_TX_STAT::VALID); }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения