Ардуино не полностью принимает и передает данные конечных точек

vladsf
Offline
Зарегистрирован: 30.03.2021

Хочу поблагодарить всех ГУФОв, принявших участие в обсуждении  предедущей темы  “Адуино не входит в прерывание конечных точек”.

Мне очень понравились команды с маской ori, andi, но они не были главными.

Мое устройство стало определяться в Windows XP, Windows 7, установил драйвер usbser.sys, правда Windows 10 драйвер проигнорировала, установила свой и написала код ошибки 10.

Далее доработал код, ввел еще две точки EP1 (Bulk, принимает данные с хоста,  размер памяти 64байта, использует один банк) и EP2 (Bulk, передает данные в хост, размер буфера 64 байта, один банк). Проверил проект на делфи. Все заработала хост исправно отправлял и считывал данные.

И тут начались грабли……..

  1. Точка EP1 настроена на прием FIFO  в 64 байта, но это максимальное количество байт принимает только в Windows XP (процессор поддерживает команду se2) и Windows 7.

В (процессор не поддерживает команду 2) принимает только 63 байта. Если точку 1 сконфигурировать на прием 256 байт, то примет все равно только 64. Хотя это вроде бы не страшно, но не приятно.

  1.  Точка 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

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. При правильном приеме-передаче размер буфера не имеет значение. Просто не нужно пытаться впихнуть в буфер больше, чем он может вместить. Проверяйте, есть ли еще в буфере свободное место.

2. В Ардуино принят язык Си++. Если Вы рассчитываете на помощь, потрудитесь использовать в своих сообщениях именно этот язык.

vladsf
Offline
Зарегистрирован: 30.03.2021

andriano пишет:

1. При правильном приеме-передаче размер буфера не имеет значение. Просто не нужно пытаться впихнуть в буфер больше, чем он может вместить. Проверяйте, есть ли еще в буфере свободное место.

2. В Ардуино принят язык Си++. Если Вы рассчитываете на помощь, потрудитесь использовать в своих сообщениях именно этот язык.

Правильно ли я понимаю. Если размер памяти точки 64байта, то и размер буфера 64 байта.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вы что-то писали насчет точек в другой теме, но я уже не помню. А раз не помню, что такое точка, не могу быть уверенным, что правильно понимаю Ваш вопрос.

Мне кажется, что одно с другим не должно быть связано.

Но чтобы знать наверняка, не могли бы Вы переформулировать вопрос, пользуясь общепринятой терминологией?

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

Но чтобы знать наверняка, не могли бы Вы переформулировать вопрос, пользуясь общепринятой терминологией?

Cережа! Сорри, но терминология более, чем общепринятая. Endpoint  наименование конечной сущности USB модели взаимодействия.  Память у ТС в вопросе - это тоже не память контроллера ;)))), а специальная двухпортовая память USB системы в 32U4. Там можно выделить для каждой Endpoint  некий размер.

Я думаю, что ты сам сможешь поискать описание USB в сети.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для FS режима МАКСИМАЛЬНЫЙ размер Control, Bulk и Interrupt Transfers точек 64 байта. Если приходит 63, то в следующем фрейме придет оставшийся. Просто надо проверять сколько конкретно пришло и считывать пришедшее количество.

vladsf
Offline
Зарегистрирован: 30.03.2021

С приемом проверю, а как быть с теми данными, которые отправляет контролер. Там только 63 байта отправляется.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Конкретно на 32U4 проверить не могу - ибо он меня катает в авто ...

STM32F103 шлёт 64.

Что то у вас (помимо кривого ассемблера) не в порядке с арифметикой:

58 cp r28, $3f; 40

Это же после инкремента y+ ... почему сравниваете с 63, а не 64 ??? если сравнивать с 63, то brne надо заменить !

vladsf
Offline
Зарегистрирован: 30.03.2021

Komandir пишет:

Конкретно на 32U4 проверить не могу - ибо он меня катает в авто ...

STM32F103 шлёт 64.

Что то у вас (помимо кривого ассемблера) не в порядке с арифметикой:

58 cp r28, $3f; 40

Это же после инкремента y+ ... почему сравниваете с 63, а не 64 ??? если сравнивать с 63, то brne надо заменить !

Там загрузка в  ФИФО начинается с нулевого адреса, поэтому когда счетчик доходит до 63 значит в ФИФО загружено 62+ нулевой байт- всего 63. А когда ставлю 64 программа виснет, видимо флаг TXINE не дает.

vladsf
Offline
Зарегистрирован: 30.03.2021

Все больше склоняюсь, что не корректная работа точек связана с драйвером и типом ОС. Я применяю драйвер из книги Агурова П. рограммирование интерфейса USB 2006г. Называется usbser.sys. Вчера также выяснилось, что Windows 7 64 разрядная не видит дрова для устройства. Кто может прокомментировать содержание файла inf. Где находятся сведения о типе ОС, разрядности устройства. Код привожу. Может есть где-то подробное описание файла инф, а еще лучше рамочная программа для его создания. Заранее благодарен.

; Windows 2000 and XP setup File for AT89C5131 demo 

[Version] 
Signature="$Chicago$" 
Class=Ports 
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} 

Provider=%ATMEL% 
LayoutFile=layout.inf 

[Manufacturer] 
%ATMEL%=ATMEL 

[ATMEL] 
%ATMEL_CDC%=Reader, USB\VID_03EB&PID_2009 


[Reader_Install.NTx86] 
;Windows2000 

[DestinationDirs] 
DefaultDestDir=12 
Reader.NT.Copy=12 

[Reader.NT] 
CopyFiles=Reader.NT.Copy 
AddReg=Reader.NT.AddReg 

[Reader.NT.Copy] 
usbser.sys 

[Reader.NT.AddReg] 
HKR,,DevLoader,,*ntkern 
HKR,,NTMPDriver,,usbser.sys 
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" 

[Reader.NT.Services] 
AddService = usbser, 0x00000002, Service_Inst 

[Service_Inst] 
DisplayName = %Serial.SvcDesc% 
ServiceType = 1 ; SERVICE_KERNEL_DRIVER 
StartType = 3 ; SERVICE_DEMAND_START 
ErrorControl = 1 ; SERVICE_ERROR_NORMAL 
ServiceBinary = %12%\usbser.sys 
LoadOrderGroup = Base 

[Strings] 
ATMEL = "ATMEL, Inc." 
ATMEL_CDC = "ATMEGA32U4 CDC USB to UART" 
Serial.SvcDesc = "USB Serial emulation driver"