Перейти к содержанию
    

Проблема с передачей данных от хоста девайсу at91sam7s

От хоста девайсу at91sam7s по USB передаю послыки одинаковый длины 50 байт. Содержимое следующих друг за другом посылок разное и повторяется через одну псылку. В качестве подтверждения, жду от девайса пакет, содержащий контрольную сумму (сумма значений всех байт посылки). По идее я должен принимать два чередующихся значения этой суммы, т.е. примерно такую последовательность 300 228 300 228 ... и т.д. А на самом деле числа повторяются, т.е. 300 300 300 228 300 228 300 228 228 .. и т.п. Если запускать приложение в режиме отладки, то повторений почти не встречается, но все же они есть, а если в обычном режиме запускать приложение, то повторений очень много.

 

Пример кода приложения:

 

nBytes = 50;
PurgeComm(PipeOut,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
Success = WriteFile(PipeOut, &buf_w, 50, &nBytes, NULL);

//Ожидание подтверждения прихода на передачу
while(RealRead<64)
{
    ReadFile(PipeIn, &buff, 64, &RealRead, NULL); 
}
RealRead = 0;
PurgeComm(PipeIn,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

 

Может еще как-то буфер надо чистить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по тому, что в режиме отладки гораздо меньше повторений контрольной суммы, видимо в нормальном режиме не успевает очишаться буфер, хотя я же дожидаюсь подтверждения от девайса...?? Никто не сталкивался с подобной проблемой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а прием со стороны девайса как организован? атмелевским драйвером?

 

и кусок кода:

//Ожидание подтверждения прихода на передачу
while(RealRead<64)
{
    ReadFile(PipeIn, &buff, 64, &RealRead, NULL); 
}

зачем там вайл? может я чего-то не понимаю, что должен делать этот цикл? если Вы так ждете окончания операции - то очень зря.. в любом случае последний параметр нулл - следовательно вызов не overlapped и до завершения чтения (или до таймаута) ReadFile не вернется...

Что бы посмотреть что там происходит на уровне пакетов поставте какой-нибудь USBTrace.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я использую драйвер atm6124.sys.

Да, с while(RealRead<64) я переборщил и без него работает)

Но как же все таки решить проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

USBTrace показал, что после однократного выполнения WriteFile(PipeOut, buf, 50, &nBytes, NULL) было передано 2(!) пакета по 50 байт, а не один! Что это значит?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После однократного выполнения WriteFile(PipeOut, buf, 50, &nBytes, NULL) USBTrace показал 2 передачи по 50 байт:

- одна через device objects Device\USBPDO-9 (он относится к драйверу хоста usbuhci.sys),

- другая через device objects Device\USBPDO-4 (он относится к драйверу хаба usbhub.sys).

Но при приеме USBTrace показал только один пакет (сколько и должно быть) через device objects Device\USBPDO-4.

Так и должно быть??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После однократного выполнения WriteFile(PipeOut, buf, 50, &nBytes, NULL) USBTrace показал 2 передачи по 50 байт:

- одна через device objects Device\USBPDO-9 (он относится к драйверу хаба usbhub.sys),

- другая через device objects Device\USBPDO-4 (он относится к драйверу хоста usbuhci.sys).

Но при приеме USBTrace показал только один пакет (сколько и должно быть) через device objects Device\USBPDO-4.

Так и должно быть??

Я посмотрел как работает обычный флеш-накопитель, при отправке данных на флешку также посылаются 2 пакета:

- первый пакет через драйвер хаба Device\USBPDO-9 (usbhub.sys);

- второй пакет через драйвер самого девайса (драйвер класса \Device\000000b3 USBSTOR.SYS ). В отличие от моего случая, когдав второй пакет посылался через драйвер хоста Device\USBPDO-4 (usbuhci.sys), а не через драйвер моего девайса atm6124.sys (\Device\000000b1).

 

Это особенность драйвера atm6124.sys?

P.S. Проверял на других USB-девайсах, картина такая же как и с флеш-накопителем, то есть отличается от моего девайса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Через atm6124.sys USB делать не пробовал, так что как именно он работает - не знаю. Но две передачи, которые показывает USBTrace - это везде так.

Могу разве-что посоветовать сделать вывод в DBGU на устройстве и посмотреть с той стороны в динамике, только с ним аккуратно надо быть т.к. атмелевская либа ждет вывода всего сообщения и могут появиться нежелательные задежки, либо написать свой буферизованный вывод через PDC.

 

PS я сам пробовал делать USB через стандартный usbser.sys, но что-то там не заладилось - уж не помню что именно. Попробовал libusb.. он конечно не столь интуитивен, как эмулированный com-порт, но ничего сложного в нем нет, и затыков с ним не было, с тех пор только им и пользуюсь. Если интересно - libusb-win32.sourceforge.net у интерфейсной части есть порти и под C и под C++ и под C#. Со стороны железки ничего менять не нужно, только инф поправить.. там в доках все есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Через atm6124.sys USB делать не пробовал, так что как именно он работает - не знаю. Но две передачи, которые показывает USBTrace - это везде так.

Могу разве-что посоветовать сделать вывод в DBGU на устройстве и посмотреть с той стороны в динамике, только с ним аккуратно надо быть т.к. атмелевская либа ждет вывода всего сообщения и могут появиться нежелательные задежки, либо написать свой буферизованный вывод через PDC.

 

PS я сам пробовал делать USB через стандартный usbser.sys, но что-то там не заладилось - уж не помню что именно. Попробовал libusb.. он конечно не столь интуитивен, как эмулированный com-порт, но ничего сложного в нем нет, и затыков с ним не было, с тех пор только им и пользуюсь. Если интересно - libusb-win32.sourceforge.net у интерфейсной части есть порти и под C и под C++ и под C#. Со стороны железки ничего менять не нужно, только инф поправить.. там в доках все есть.

Спасибо, буду разбираться.

 

 

 

 

Я посмотрел как работает обычный флеш-накопитель, при отправке данных на флешку также посылаются 2 пакета:

- первый пакет через драйвер хаба Device\USBPDO-9 (usbhub.sys);

- второй пакет через драйвер самого девайса (драйвер класса \Device\000000b3 USBSTOR.SYS ). В отличие от моего случая, когдав второй пакет посылался через драйвер хоста Device\USBPDO-4 (usbuhci.sys), а не через драйвер моего девайса atm6124.sys (\Device\000000b1).

 

Это особенность драйвера atm6124.sys?

P.S. Проверял на других USB-девайсах, картина такая же как и с флеш-накопителем, то есть отличается от моего девайса.

Кто-нибудь работал с atm6124.sys? Что вы можете сказать по этому вопросу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, Булат!

 

Отвечу Вам прямо на форуме, хотя, к сожалению, вряд ли смогу Вам помочь по существу вопроса.

В свое время я принципиально отказался от использования драйвера atm6124 по причине его множественных странностей. Это и Вам могу посоветовать ;)

Если объем передаваемых данных невелик, то лучше пользоваться M$-ским usbser. Он работает без вопросов, но у него один существенный недостаток - сильно тормозной (больше 60 кБод эффективной скорости мне из него выжать не удалось).

В противном случае нужно искать другой драйвер или писать свой.

 

P.S. Еще, как вариант, могу предложить обратиться в службу поддержки Atmel. По крайней мере мне там в свое время помогли дельным советом, хоть и не очень оперативно.

Изменено пользователем Aurochs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...