Параллельный интерфейс на CH341.

Тема в разделе "MASM", создана пользователем Devasya, 22 авг 2023.

  1. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Спасибо.
     
  2. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Как оказалось мне для компиляции текста программы в файле .inc нет никакой необходимости в определении процедур, просто удалил их оттуда.Работает. А так-же удалил определение IOCTL-тоже работает. Похоже они нужны когда используешь голый чип, для его программирования, а он у нас уже запрограммирован (здорово). Единственная проблемка была при написании прототипов, но выручил WordPad, Открыл ним файл библиотеки и выписал оттуда всё что нужно типа: CH341OpenDevice@4 в отдельный файл
    EXTERN CH341OpenDevice@4:NEAR, а под ним: CH341OpenDevice PROTO DWORD то есть, если в Windows все данные четырёхбайтные
    то разумно @4 разделить на 4 и получаем количество DWORD.
    Следовательно:
    EXTERN CH341WriteRead@28:NEAR

    Код (ASM):
    1. CH341WriteRead PROTO :DWORD, :DWORD,:DWORD, :DWORD,:DWORD, :DWORD,:DWORD
    Как-то так. А поиски программы которая сама пишет инклуды, у меня по крайней мере, не увенчались успехом.
    Единственное что удалось нарыть это dllexp.exe
    --- Сообщение объединено, 27 авг 2023 ---
    И очень жалею об огромном количестве времени потраченном на изучение написания кода драйверов и изучение протоколов USB.
    Как оказывается в этом нет никакой необходимости в простейшем виде.
     
  3. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Теперь кажется всё-разобрались. Остался последний вопрос и возможно слегка не по теме.
    Решил использовать такой финт для просмотра, что принимает ПК:
    Код (ASM):
    1. .data
    2.                            InBufDATASize    db ?
    3.                            InBufDATA        db ?
    4. .code
    5.             mov al, 1
    6.             mov InBufDATASize, al
    7.             invoke CH341EppReadData, iIndex, ADDR InBufDATA, ADDR InBufDATASize
    8.             mov    eax,OFFSET InBufDATA  ; изменяем название окна программы на принятое число
    9.             movzx  edx,ofn.nFileOffset
    10.             add    eax,edx
    11.             invoke SetWindowText,hWnd,eax ; показываем новое название, но почему-то не показывается
    Хотя :
    Код (ASM):
    1.               mov eax, 7
    2.             mov iBuffer, eax
    3.             mov al, 1
    4.             mov ioLength, al
    5.             invoke CH341EppWriteData, iIndex, ADDR iBuffer, ADDR ioLength
    Передаёт чётко. Приходит цифра 7 в бинаре, а при приёме хостом пусто.
    Где косяк?
     
  4. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Благодаря Вашему молчанию нашёл другой способ проверить, что принял ПК. Это принять от МК байт и отправить его обратно. Полученное отобразить на счётчике импульсов.
    Спасибо всем.
     
  5. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Devasya, у вас прям один способ лучше другого.
    нельзя что-ли нормально вывести результат на консоль или в форточку?

    Это во-первых.. а во-вторых - вы используете вызов функций по соглашению _stdcall, где аргументы передаются через стек (хотя в исходники пишите их в одну строчку). Стек в системе должен быть всегда выровнен, а у вас аргумент "InBufDATASize" размером в байт, хотя в х32 все аргументы должны быть 4-байта. Не знаю как masm, но fasm вообще-бы не скомпилировал такой исходник, ругаясь на размер операнда. Короче вам нужно задать всем переменным размер "dd", и под буфер резервировать не байт, а 1 Кб, как указывается в инклуде, т.е. "InBufDATA rb 1024".
     
  6. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Marylin, на счёт способов это кому какой доступнее. А в одну строчку потому как использую invoke. Разница в размерах из-за объёма информации, обработка идёт не буферная, а побайтная для точности передачи. Скорость ниже но какчество лучше. Я разобрался, в заголовочном файле всё написано для программирования самого чипа, по этому убрал из своих инклудов всё лишнее оставив только сами функции и их прототипы потому, что в DLL драйвера всё это уже имеется. Возвращаясь к способу проверки, то меня устроил бы ответ по первому способу. Думаю, что, нужна конвертация?
     
  7. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Что вы передаёте в качестве "iIndex" в своей программе?
     
  8. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Вычисленный CH341_MAX_NUMBER ,а точнее ноль.
    Код (ASM):
    1. .else
    2.                                     mov eax, CH341_MAX_NUMBER
    3.                                     dec eax
    4.                                     cmp  eax, -1
    5.                                     jle  metka2    ; сообщаем об отсутствии
    6.                                     mov  CH341_MAX_NUMBER, eax
    7.                                     jnl  metka1    ; возвращаемся
     
    Последнее редактирование: 3 сен 2023
  9. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Константа MAX_NUMBER прописана в хидере и равна 16 - это макс.возможное значение "iIndex", а реальное вы должны посмотреть в диспетчере устройств Windows. Когда система обнаружит ваше устройство CH341, то выделит ему порт USB, а номер этого порта вы должны передать программе как "iIndex".
    Код (Text):
    1. mCH341_MAX_NUMBER    =  16     ;// потолок iIndex
    2. mMAX_BUFFER_LENGTH   =  4096   ;// макс размер буфера
    3. mDEFAULT_BUFFER_LEN  =  1024   ;// размер буфера в дефолте
    вы можете вызывать функцию как угодно, но ассемблер переведёт ваш текст на язык процессора "push -> call".
    поэтому я и говорю, что размер "push" (а это аргумент функции) должен быть строго 4-байта.
    вот как это выглядит в отладчике (см.последний столбец):

    dbg.png
     
    Последнее редактирование: 3 сен 2023
    q2e74 нравится это.
  10. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Чтобы подтвердить Ваше высказывание изменил eax на ax и dd на dw. Скомпилировалось, но вызов устройства не прошёл указывая на его отсутствие согласно программы. Но вот со всеми остальными аргументами всё норм, размер байт ведь в хидере указан максимальный размер, а мы уже говорим точно, главное не превышать также? Как назвать аргумент решает программист, для компилятора важно содержание это я уже понял год назад, ну и конечно же синтаксис- это как за-кон. И в общем то не так всё грустно.
    --- Сообщение объединено, 3 сен 2023 ---
    Посмотрите у себя на отладчике пожалуйста.
    --- Сообщение объединено, 3 сен 2023 ---
    Филе .EXE не хочет загружать
    --- Сообщение объединено, 3 сен 2023 ---
    В заголовочном файле есть ещё такие строчки:
    #define mCH341_PACKET_LENGTH 32 // Длина пакетов данных, поддерживаемых CH341
    #define mCH341_PKT_LEN_SHORT 8 // Длина коротких пакетов поддерживаемых CH341
     
    q2e74 нравится это.
  11. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Devasya, вы можете ответить на простой вопрос: "Под каким номером в диспетчере у вас определяется девайс CH341" ??? Нужно смотреть или в разделе COM или USB. Например у меня там пусто, т.к. нет устройства, иначе появился-бы ещё один COM, с номером в диапазоне от 3 до "mCH341_MAX_NUMBER=16".

    task.png
     
  12. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Устройство по типу.
    Interface
    USB-EPP/I2C...CH341A
    Port_#0001/Hub_#0004
    драйвер
    CH341WDM.SYS
    (Рекомендую потому как даже программаторы на них собраны.)
     
    Последнее редактирование: 3 сен 2023
  13. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    короче я пас... дальше сами.
    ато у нас разговор слепого с глухим.
     
    q2e74 нравится это.
  14. Devasya

    Devasya New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2023
    Сообщения:
    19
    Жаль. Хотя в общем , по подключению и связи посредством этой платы с внешним устройством мне всё понятно. А в китайский документ ch341a-datasheet_code , к языкам использования можно дописать Assembler.