Ардуино не полностью принимает и передает данные конечных точек
- Войдите на сайт для отправки комментариев
Хочу поблагодарить всех ГУФОв, принявших участие в обсуждении предедущей темы “Адуино не входит в прерывание конечных точек”.
Мне очень понравились команды с маской ori, andi, но они не были главными.
Мое устройство стало определяться в Windows XP, Windows 7, установил драйвер usbser.sys, правда Windows 10 драйвер проигнорировала, установила свой и написала код ошибки 10.
Далее доработал код, ввел еще две точки EP1 (Bulk, принимает данные с хоста, размер памяти 64байта, использует один банк) и EP2 (Bulk, передает данные в хост, размер буфера 64 байта, один банк). Проверил проект на делфи. Все заработала хост исправно отправлял и считывал данные.
И тут начались грабли……..
- Точка EP1 настроена на прием FIFO в 64 байта, но это максимальное количество байт принимает только в Windows XP (процессор поддерживает команду se2) и Windows 7.
В (процессор не поддерживает команду 2) принимает только 63 байта. Если точку 1 сконфигурировать на прием 256 байт, то примет все равно только 64. Хотя это вроде бы не страшно, но не приятно.
- Точка EP2 настроена на передачу через FIFO в 64 байта, но передает во всего 63 байта. Где собака зарыта в драйвере, в коде, в настройках системы. Прошу указать возможные направления поиска.
Привожу коды инициализации точек и подпрограмму передачи данных, может флаги не так использую.
ep1_iniz: ldi r16,$01 sts UENUM,r16; выбор точки 1 ldi r16,0x01 sts UECONX,r16; разрешение точки EPEN ldi r16,0x80; bulk, OUT STS UECFG0X,r16 ldi r16,0X30;50;buffer 256 byte sts UECFG1X,r16 lds r16, UECFG1X ldi r23, ALLOC call wybor_bit_or sts UECFG1X, r16 USB_wait_vbus11: LDS R16,UESTA0X SBRS R16,CFGOK ; подтверждение конфигурации RJMP USB_wait_vbus11 lds r16, UEIENX ldi r23, RXOUTE; разрешение прерывания по приему данных call wybor_bit_or sts UEIENX,r16 ret ep2_iniz: ldi r16,0X02; выбор точки 2 sts UENUM,r16 ldi r16,0x01; разрешение точки EPEN sts UECONX,r16 ldi r16,0x81 ; bulk, IN STS UECFG0X,r16 ldi r16,0X30;buffer 64 byte sts UECFG1X,r16 lds r16, UECFG1X ldi r23, ALLOC call wybor_bit_or sts UECFG1X, r16 USB_wait_vbus12: LDS R16,UESTA0X SBRS R16,CFGOK ; подтверждение конфигурации RJMP USB_wait_vbus12 ret ldi r16, 2 sts UENUM,r16 ldi r28, $00 ldi r29, $03 dannye_read: LDS R16,UEINTX SBRS R16, TXINI RJMP dannye_read no_razr_zap_bank: LDS R16,UEINTX SBRs R16, RWAL JMP no_razr_zap_bank zikl_otvet: ld prom1, y+ sts UEDATX, prom1 cp r28, $3f; 40 brne zikl_otvet lds r16, UEINTX ldi r23, TXINI; первый сброшен call wybor_bit_and sts UEINTX, r16 lds r16, UEINTX ldi r23, FIFOCON call wybor_bit_and; второй сброшен sts UEINTX, r16 GDD0p1: ; Подождем когда буфер FIFO будет готов LDS R16,UEINTX ; SBRS R16,TXINI ; RJMP GDD0p1 ret
1. При правильном приеме-передаче размер буфера не имеет значение. Просто не нужно пытаться впихнуть в буфер больше, чем он может вместить. Проверяйте, есть ли еще в буфере свободное место.
2. В Ардуино принят язык Си++. Если Вы рассчитываете на помощь, потрудитесь использовать в своих сообщениях именно этот язык.
1. При правильном приеме-передаче размер буфера не имеет значение. Просто не нужно пытаться впихнуть в буфер больше, чем он может вместить. Проверяйте, есть ли еще в буфере свободное место.
2. В Ардуино принят язык Си++. Если Вы рассчитываете на помощь, потрудитесь использовать в своих сообщениях именно этот язык.
Правильно ли я понимаю. Если размер памяти точки 64байта, то и размер буфера 64 байта.
Вы что-то писали насчет точек в другой теме, но я уже не помню. А раз не помню, что такое точка, не могу быть уверенным, что правильно понимаю Ваш вопрос.
Мне кажется, что одно с другим не должно быть связано.
Но чтобы знать наверняка, не могли бы Вы переформулировать вопрос, пользуясь общепринятой терминологией?
Но чтобы знать наверняка, не могли бы Вы переформулировать вопрос, пользуясь общепринятой терминологией?
Cережа! Сорри, но терминология более, чем общепринятая. Endpoint наименование конечной сущности USB модели взаимодействия. Память у ТС в вопросе - это тоже не память контроллера ;)))), а специальная двухпортовая память USB системы в 32U4. Там можно выделить для каждой Endpoint некий размер.
Я думаю, что ты сам сможешь поискать описание USB в сети.
Для FS режима МАКСИМАЛЬНЫЙ размер Control, Bulk и Interrupt Transfers точек 64 байта. Если приходит 63, то в следующем фрейме придет оставшийся. Просто надо проверять сколько конкретно пришло и считывать пришедшее количество.
С приемом проверю, а как быть с теми данными, которые отправляет контролер. Там только 63 байта отправляется.
Конкретно на 32U4 проверить не могу - ибо он меня катает в авто ...
STM32F103 шлёт 64.
Что то у вас (помимо кривого ассемблера) не в порядке с арифметикой:
58 cp r28, $3f; 40
Это же после инкремента y+ ... почему сравниваете с 63, а не 64 ??? если сравнивать с 63, то brne надо заменить !
Конкретно на 32U4 проверить не могу - ибо он меня катает в авто ...
STM32F103 шлёт 64.
Что то у вас (помимо кривого ассемблера) не в порядке с арифметикой:
58 cp r28, $3f; 40
Это же после инкремента y+ ... почему сравниваете с 63, а не 64 ??? если сравнивать с 63, то brne надо заменить !
Там загрузка в ФИФО начинается с нулевого адреса, поэтому когда счетчик доходит до 63 значит в ФИФО загружено 62+ нулевой байт- всего 63. А когда ставлю 64 программа виснет, видимо флаг TXINE не дает.
Все больше склоняюсь, что не корректная работа точек связана с драйвером и типом ОС. Я применяю драйвер из книги Агурова П. рограммирование интерфейса USB 2006г. Называется usbser.sys. Вчера также выяснилось, что Windows 7 64 разрядная не видит дрова для устройства. Кто может прокомментировать содержание файла inf. Где находятся сведения о типе ОС, разрядности устройства. Код привожу. Может есть где-то подробное описание файла инф, а еще лучше рамочная программа для его создания. Заранее благодарен.