He terminado de construir un osciloscopio digital con un ADC + memoria sram 32K + 18f2550 para la transferencia usb.
Estoy usando el protocolo HID en CCS C que me ha funcionado perfectamente en otros casos pero en este no (o no muy bien).
Mi constante USB_CONFIG_HID_TX_SIZE es 64, la idea es enviar 512 paquetes de 64 bytes a la PC. Trabajo a 48mhz, no uso WDT
Funciona, pero tarda al menos 10 segundos en enviar los 32K de datos a la PC, otras veces la PC no reporta que haya terminado la transferencia (sin embargo el pic no se cuelga, si le envio un dato desde la PC empieza a responder de nuevo enviando mas caracteres)
Segun mis calculos, 64 bytes cada 1ms (timeframe del usb hid) deberian ser 512 ms, digamos 2 segundos como mucho, cierto?
Preguntas:
1)- ¿Es normal que tarde tanto en HID para enviar 32KB? Aclaro que la PC no hace ningun proceso que pudiera demorar mientras espera datos.
2)- ¿Hay algo hecho con bulk? he mirado las paginas pero entiendo que aun no esta estudiado
Esta instruccion:
while(usb_tbe(1) == FALSE);
La puse porque me pasaba que la instruccion usb_puts() devolvia false luego de varios envios (indicando que el buffer de salida aun no estaba vacio)
Esta otra:
usb_task();
La puse porque he visto en foros que cada cierto tiempo hay que ejecutarla (no estoy muy convencido pero sin ella tengo los mismos resultados)
¿Usando usb_put_packet() habra diferencia?
Pongo aqui la parte conflictiva del codigo.
Código:
p = 0;
for(i=0;i < 32768;i++) {
// Esperar buffer de endpoint vacio
while(usb_tbe(1) == FALSE);
// Habilita el periferico usb y las interrupciones.
usb_task();
respuesta[p] = input_b();
p++;
if (p == 64) {
p = 0;
usb_puts(1, respuesta, USB_CONFIG_HID_TX_SIZE, 0);
}
// Avanzar el contador
output_high(OUT_CLK_LOWSPD);
output_low(OUT_CLK_LOWSPD);
}
}