Jump to content
    

deni

Участник
  • Posts

    53
  • Joined

  • Last visited

Reputation

0 Обычный

About deni

  • Rank
    Участник
    Участник

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1,847 profile views
  1. https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
  2. STM32Fxxx + MAC Ethernet

    Почему 4? Всего два, один на прием, другой на передачу. Там обычно 4 дескриптора, в цепи из 4 буферов.
  3. Еще погонял тесты, не всегда происходит прерывание по окончанию транзакции OUT. Прерывание RXFNEIF (Rx FIFO non-empty interrupt flag) вызывается всегда после получения OUT, один или несколько раз если общий размер больше передачи EP. А вот OEPIF (OUT endpoint interrupt flag), который должен быть вызван по окончанию получению всех данных иногда пропускается.
  4. В библиотеке включается наличием #define USB_HS_INTERNAL_DMA_ENABLED в usb_conf.h, у USB_HS собственный DMA контроллер. Ну куда уже больше, для RX 512 * 4 = 2048 байт, для TX 128 *4 = 512 байт, для режима FS максимальный размер EP = 64 байта. Сейчас прием и передача происходит размером в один пакет (64 байта), там FIFO и так пустые по большей части. Размер FIFO конфигурируется через библиотеку, если смотреть регистры USB блока в работе, то делает она это верно. Организация RXFIFO такая же как в ST, при получении данных сначала в буфер FIFO кладется статус слово, за ним данные.
  5. stm32f4 spi dma cmsis

    TXE тоже ничего не даст, он также выставляется по опустошению буфера, для отслеживания опустошения передатчика надо мониторить BSY: Busy flag, но от него нет прерывания.
  6. Попробовал, можно крутить размеры FIFO по всякому, не влияет никак. Влияет только время которое прошло от момента получения до начала чтения из FIFO, чем дольше тем больше вероятность ошибки.
  7. Сейчас нарезано вот так: #ifdef USB_FS_CORE #define RX_FIFO_FS_SIZE 128 #define TX0_FIFO_FS_SIZE 64 #define TX1_FIFO_FS_SIZE 64 #define TX2_FIFO_FS_SIZE 64 #define TX3_FIFO_FS_SIZE 0 #ifdef USB_HS_CORE #define RX_FIFO_HS_SIZE 512 #define TX0_FIFO_HS_SIZE 128 #define TX1_FIFO_HS_SIZE 128 #define TX2_FIFO_HS_SIZE 128 #define TX3_FIFO_HS_SIZE 0 #define TX4_FIFO_HS_SIZE 0 #define TX5_FIFO_HS_SIZE 0 завтра попробую, что-нибудь не кратное 64байт.
  8. В HS блоке они одинаково распределены, что для режима с DMA, что для режима без DMA. Для всего что копируется в/из FIFO выровнены адреса по 4 байта, что для режима DMA обязательно. Ну я столько кода ещё не написал ). Мне ещё не понятно как такое может получиться, я попробовал (в качестве эксперимента) программно записать по адресу RXFIFO, запись туда не возможна, только чтение. Похоже что когда при чтении буфера из RXFIFO процесс прерывается, в этот момент приходит IN транзакция, и во внутренней памяти USB адрес переключается на TXFIFO, и при продолжении чтения выдается одно слово из TXFIFO, далее уже нормально. У компилятора одно чтение 32b, одна запись 32b: *(uint32_t *)dest_buf = *fifo; 800a090: 69bb ldr r3, [r7, #24] 800a092: 681a ldr r2, [r3, #0] 800a094: 68bb ldr r3, [r7, #8] 800a096: 601a str r2, [r3, #0]
  9. Может быть у кого встречалось, и кто подскажет решение. В микроконтроллере GD32F450 при интенсивном обмене через USBFS наблюдается следующее: после OUT транзакции, если во время чтения RX FIFO, происходит IN транзакция, то возможна ситуация когда при чтении RX FIFO будет однократно прочитано значение из TX FIFO. Искажается одно 32bit слово, равное размеру чтения из FIFO, в произвольном месте приемного буфера. Может повредится первое статусное слово (GRSTATP), расположенное в начале каждого блока данных. И чем дальше во времени после OUT транзакции происходит чтение, тем вероятнее проявляется ошибка. Если в системе повысить уровень приоритета прерывания USB до максимального, то вероятность ошибки будет минимальной. Такое поведение наблюдается как в USBFS, так и в USBHS (режим FS) блоке. Если в USBHS (режим FS) включить чтение буферов через DMA, то ошибок не будет. Компилятор GCC и родные китайские библиотеки.
  10. stm32f4 spi dma cmsis

    Возможно не стоит настройки последовательно записывать в регистр CR, а сформировать в переменной и разом записать значение CR. А что показывает отладчик, что в итоге попало в регистры DMA контроллера?
  11. stm32f4 spi dma cmsis

    В F4 DMA контроллер работает несколько отлично от того же F1. Если источник 8 бит, а назначение 16 бит, то из памяти будет два чтения и одна запись. При этом первый байт попадет в младшие [7..0] бит SPI, а второй в старшие [15..8], при этом передач должно быть кратно 2. Но насколько я понимаю хотелось не этого, нужно изменить размер назначения в 8 bit.
  12. stm32f4 spi dma cmsis

    Может быть стоит дождаться окончания передачи DMA? Если в бесконечном цикле постоянно перенастраивать, то канал скорее всего встанет в ошибку. Надо смотреть статус регистр.
  13. Можно использовать драйвера от FTDI VCP, там как раз по 2 эндпоинта на порт. Можно получить 1, 2 или 4 порта, на 5 эндпоинтах. Состояние линий там передается в первых двух байтах каждой посылки. Но это если не смущает использование их драйверов, так как они запрещают использовать для другого железа.
  14. Можно попробовать через интерфейс IntLib API Manager Interfaces https://techdocs.altium.com//node/295780 А что хочется сделать в итоге? Так как скрипты это средства автоматизации, то всё равно надо будет сначала открыть эту библиотеку. Для редактирования компонента в библиотеке, скрипт должен выполняться в редакторе библиотеки, причём для схематичного отображения в ISch_Lib, а для посадочного места в IPCB_Library.
  15. Что значит посмотреть поля любого объекта? Если документацию по API, то здесь https://techdocs.altium.com/display/SCRT/Altium+Designer+API+Reference
×
×
  • Create New...