реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема с искажением данных на USB
Sevens
сообщение Oct 6 2006, 12:22
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 5-08-06
Пользователь №: 19 337



Возникла такая проблема: есть устройство на AT89C5131, написана прошивка и как казалось драйвер. Передаю данные устройству - массив 32 байта, заполненный "1" в аски коде (т.е. цифрами 49)

Шлю штук 20 таких массивов, смотрю что принимается. Почему-то иногда искажаются принимаемы данные, причем на одни и те же цифры 188,69. И в разных местах. Драйвер написан с помощью Driver Studio, вот процедура записи в устройство:

NTSTATUS CandDV2Device::CANDDV2_IOCTL_804_Handler(KIrp I)
{

DbgPrint("CandDDriverDevice::Write START");

NTSTATUS status = STATUS_SUCCESS;


PUCHAR pBuffer = (PUCHAR)I.IoctlBuffer();

ULONG dwTotalSize = I.IoctlInputBufferSize(CURRENT);
ULONG dwBytesSent = 0;


ULONG dwMaxSize = m_Endpoint4OUT.MaximumTransferSize();
DbgPrint("CandDV2Device::CANDDV2_IOCTL_804_Handler (write to EP4) START");

DbgPrint(" Write: Requested=%d, MaxSize=%d", dwTotalSize, dwMaxSize);

if(dwTotalSize==0)
{
return status;
}

if (dwTotalSize > dwMaxSize)
{
dwTotalSize = dwMaxSize;
}


DbgPrint("Endpoint 4");

for (int i=0; i<(int)dwTotalSize; i++)
DbgPrint("write buffer: %d", ((PCHAR)(pBuffer))[i] );

PURB pUrb = m_Endpoint4OUT.BuildBulkTransfer(
pBuffer, // Where is data coming from?
dwTotalSize, // How much data to write?
FALSE // Short OK
);

if (pUrb == NULL)
{
I.Information() = 0;
DbgPrint("ERROR: BuildInterrupt");
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

// Submit the URB to our USB device, synchronously - say less is OK
pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
(USBD_TRANSFER_DIRECTION_OUT);

if (!m_Endpoint4OUT.IsOpen())
{
I.Information() = 0;
DbgPrint("ERROR: m_Endpoint4OUT is not open!");
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

status = m_Endpoint4OUT.SubmitUrb(pUrb);

dwBytesSent = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;


delete pUrb;

I.Information() = dwBytesSent;

DbgPrint("CandDV2Device::CANDDV2_IOCTL_804_Handler END");
return status;

}

В чём может быть проблема?

Сообщение отредактировал Sevens - Oct 6 2006, 13:08
Go to the top of the page
 
+Quote Post
PAB
сообщение Oct 16 2006, 17:40
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717



Возможно, что проблема связана с возникновением ошибки DataUderrun. То есть хост посылает устройству меньше данных чем ожидает устройство. Таким образом, возможно, что устройство байты CRC считает данными. Чтоб проверить это необходимо посчитать CRC код для того пакета данных, на котором появляются искажения.

Так же было бы неплохо почитать errata на тот контроллер, который используете. Может там что-нибудь про это написано

Сообщение отредактировал PAB - Oct 16 2006, 17:42
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.0134 секунд с 7
ELECTRONIX ©2004-2016