FT232HL FTDI consecutivo SPI bytes retraso problema

1

Tengo un problema con el FT232HL FTDI ic.

La aplicación de Windows envía datos al chip a través de USB y el chip envía los datos con un canal SPI.

Verifiqué con un analizador lógico, los bytes se envían correctamente y el reloj SPI coincide con la configuración. Sin embargo, entre cada byte, hay un retraso de 64 uS, lo que significa que no importa qué tan alto sea el reloj SPI, la transferencia de datos toma minutos en lugar de segundos.

Imaginé que tal vez jugar con channelConf.LatencyTimer ayudaría, pero no muestra ninguna diferencia sin importar el valor utilizado (10, 128, 255), el retardo permanece 64uS entre bytes consecutivos.

Debe haber algo que arreglar porque hay numerosos ejemplos de personas que alcanzan altas tasas de transferencia. Además, el retraso entre bytes debería ser un ajuste en algún lugar.

He usado código de muestra proporcionado con sample-dynamic.c El flujo de bytes se envía con una sola llamada a p_SPI_Write () con una longitud total de 2048 bytes. He intentado otra longitud (256, 8192, etc) sin cambios. Aquí está la configuración utilizada:

channelConf.ClockRate = 5000*1000; 
channelConf.LatencyTimer= 10; 
channelConf.configOptions = SPI_CONFIG_OPTION_MODE0| SPI_CONFIG_OPTION_CS_DBUS3/*|*/ ;
channelConf.Pin = 0x00000000; /* FinalVal-FinalDir-InitVal-InitDir (for dir: 0=in, 1=out) */

SO: windows7 X64 Compilador: GCC Biblioteca y código de: enlace

Para tu información: me puse en contacto con el servicio de asistencia técnica de FTDI, me pidieron que actualizara las bibliotecas a la más reciente (lo que hice) y luego no me brindaron más ayuda.

Cualquier ayuda apreciada. Gracias.

    
pregunta ggadde29

1 respuesta

2

Normalmente trabajo con el chip FT2232H, pero saqué un chip FT232HQ solo para poder ver este problema que tenías. Es el mismo chip que el chip FT232HL que tiene, solo en un paquete QFN en lugar de un QFP.

Intenté recrear el problema que describiste, pero no pude hacerlo exactamente. Esto es lo que parecía en mi analizador lógico cuando enviaba 6 bytes a la vez a una velocidad de reloj de 5MHz. Hay un pequeño retraso entre los bytes, pero en ningún caso es tan grande como 64us.

Aquí hay algunas cosas para verificar.

  • El temporizador de latencia realmente no debería importar porque es simplemente un tiempo de espera antes de que USB envíe un paquete incompleto. Lo tengo configurado en 255, pero a menudo para cronometrar cosas sensibles, lo tengo más bajo (2 -10)
  • Pruebe primero una velocidad de reloj más lenta solo para probar y asegúrese de que el dispositivo se está comunicando correctamente (supongo que lo hizo, solo estoy agregando esto en caso de que alguien más no lo haya intentado aún).
  • Las direcciones de los pines no importan, excepto GPIO, ya que se sobrescriben con la libreta SPI.
  • En lugar de p_SPI_Write() , usa SPI_Write() . Si realiza una sola llamada, agregue la selección de chip adecuada habilitar y deshabilitar indicadores (ver más abajo). Si realiza varias llamadas, asegúrese de agregar los indicadores de selección de chip a las primeras y últimas llamadas de la serie.
  • Asegúrese de pasar el número de bytes para transmitir y establezca el indicador SPI_TRANSFER_OPTIONS_SIZE_IN_BYTES .
  • Si se trata de un diseño de placa personalizado, o si compró una placa adaptadora FT232H con descuento, asegúrese de que tenga la frecuencia de reloj correcta del sistema. El retraso entre bytes se basa en el tiempo que tarda el chip en mover el siguiente byte de su búfer interno a los registros de desplazamiento de salida. Si el chip se sincroniza lentamente, esto se mostrará en las frecuencias más altas como un espacio mayor entre bytes. Tenga en cuenta que para SPI no importa si el reloj se alarga un poco aquí y allá, ya que se basa en los bordes de la señal del reloj (leído en un borde y propagado en el otro). Pruebe el cristal o el chip de cristal CMOS y asegúrese de que obtiene 12 MHz.

Aquí hay un código de ejemplo rápido sobre cómo enviar múltiples bytes de datos en caso de que ayude.

uint32 sizeToTransfer = 0;
uint32 sizeTransfered = -1;
uint8 buffer[256]; //Must be large enough for what you are sending.
FT_STATUS status;

//add data
buffer[sizeToTransfer++] = 0x20; //First data byte (can be what you need)
/*
 * More bytes added....
 */
buffer[sizeToTransfer++] = 0x00; //Last data byte (can be what you need)

status = SPI_Write(*handle, buffer, sizeToTransfer, &sizeTransfered,
    SPI_TRANSFER_OPTIONS_SIZE_IN_BYTES |
    SPI_TRANSFER_OPTIONS_CHIPSELECT_ENABLE |
    SPI_TRANSFER_OPTIONS_CHIPSELECT_DISABLE);

//Don't forget to check status. It should equal FT_OK if everything went well
    
respondido por el techdude

Lea otras preguntas en las etiquetas