Trabajar con la biblioteca FTDI para acceder a la memoria FPGA

3

Hice una pregunta relacionada aquí .
El tablero es Lattice MACHX02 1200 ZE. Estoy usando la Biblioteca FTDI FTCSPI para acceder a Lattice FPGA UFM a través del FTPTT. Configuré el FPGA en SPI esclavo usando IPExpress. Estoy seguro de que el FPGA ahora está bien configurado, ya que el siguiente código me da el valor correcto de la identificación del dispositivo.

    WriteControlBuffer[0]=224; //0xe0

    Status = SPI_ReadHiSpeedDevice(ftHandle, &ReadStartCondition, true, false, NUM_LATTICE_CMD_CONTOL_BITS,
            &WriteControlBuffer, NUM_LATTICE_CMD_CONTOL_BYTES, true, false, NUM_LATTICE_CMD_DATA_BITS,
            &ReadDataBuffer, &dwNumDataBytesReturned, &HighPinsWriteActiveStates);

    if (Status == FTC_SUCCESS)
    { 
        printf(" success ");
    }
    else
    {
        printf("failed");
    }

    printf(" ID read = %x%x%x%x", ReadDataBuffer[0],ReadDataBuffer[1], ReadDataBuffer[2], ReadDataBuffer[3]);
}

Esto imprime:

escribí

WriteControlBuffer[0]=224;//0xe0

porque la guía de programación de UFM de Lattice FPGA en la página no. 17-61 dice que el comando para leer la identificación del dispositivo es E0 o 224 en decimal.

Ahora, el siguiente problema al que me enfrento es el uso del código para verificar la ID del dispositivo, es decir, 0xE2 00 00 00 01 2B 20 43. A continuación se muestra una captura de pantalla de la página a la que me refiero:

Ahoranopuedoentenderquéfunciónde FTDI library Tengo que usar para esto propósito. SPI_ReadHiSpeedDevice se utiliza para leer algunos datos. Pero aquí tengo que verificar, por lo que me pregunto si la biblioteca tiene alguna otra función para tal fin.

Si no, ¿cuál podría ser la otra forma de pasar el comando E2 con las entradas 01 2B 20 43 como se muestra en Guía de programación de celosía y captura de pantalla de arriba.

Código de ejemplo de FTDI. Esto es para acceder a algunas EEPROM y no para FPGA.

Se proporcionan algunos más ejemplos .

Summary

Después de leer la ID del dispositivo con el comando E0 (puedo hacer esto correctamente), tengo que verificar la ID del dispositivo con otro comando: 0xE2 00 00 00 01 2B 20 43. Mi problema simple es cómo ingresar el comando 0xE2 00 00 00 01 2B 20 43 a mis funciones C, y ¿qué función C de la biblioteca tengo que usar? El documento dice que el comando 0xE2 00 00 00 se usa con una entrada de 32 bits (en mi caso es 01 2B 20 43) para verificar el ID de dispositivo. Esto establecerá el bit 27 en SR, eso es lo que se menciona en el documento de celosía. ¿Cómo lograr esto utilizando la función de biblioteca FTCSPI?

Este documento es otra guía para la programación

Esto está en P no: 14-38

Nopuedohacerlaetapa¿IdMatch?.EstosehaceenviandoelcomandoE2000012B2043.

EsteesmicódigohastaahoraqueleecorrectamentelaIDdeldispositivo:

int_tmain(intargc,_TCHAR*argv[]){FTC_STATUSStatus=FTC_SUCCESS;DWORDdwNumHiSpeedDevices=0;charszDeviceName[100];charszChannel[5];DWORDdwLocationID=0;DWORDdwHiSpeedDeviceType=0;DWORDdwHiSpeedDeviceIndex=0;FTC_HANDLEftHandle=0;charszDeviceDetails[150];BYTEtimerValue=0;DWORDdwClockFrequencyHz=0;BOOLbPerformCommandSequence=false;FTC_CHIP_SELECT_PINSChipSelectsDisableStates;FTH_INPUT_OUTPUT_PINSHighInputOutputPins;FTH_LOW_HIGH_PINSHighPinsInputData;FTC_INIT_CONDITIONWriteStartCondition;FTC_WAIT_DATA_WRITEWaitDataWriteComplete;WriteControlByteBufferWriteControlBuffer;WriteDataByteBufferWriteDataBuffer;DWORDdwNumDataBytesToWrite=0;FTH_HIGHER_OUTPUT_PINSHighPinsWriteActiveStates;FTC_CLOSE_FINAL_STATE_PINSCloseFinalStatePinsData;DWORDdwDataWordInitValue=0;DWORDdwDataWordValue=0;DWORDdwWriteDataWordAddress=0;DWORDdwControlLocAddress1=0;DWORDdwControlLocAddress2=0;FTC_INIT_CONDITIONReadStartCondition;DWORDdwReadDataWordAddress=0;DWORDdwReadWordValue=0;ReadDataWordBufferReadWordData;DWORDdwNumDataBytesReturned=0;DWORDdwDataWordWritten=0;DWORDdwCharCntr=0;ReadDataByteBufferReadDataBuffer;DWORDdwReadDataIndex=0;ReadCmdSequenceDataByteBufferReadCmdSequenceDataBuffer;intMsgBoxKeyPressed=0;DWORDdwLoopCntr=0;//DECLARATIONWRITEPFTC_INIT_CONDITIONpWriteStartCondition;charszDllVersion[10];charszTitleErrorMessage[100];charszStatusErrorMessage[100];charszErrorMessage[200];charszMismatchMessage[100];for(dwCharCntr=0;(dwCharCntr<100);dwCharCntr++)szMismatchMessage[dwCharCntr]='
WriteControlBuffer[0]=224;//0xe0Status=SPI_ReadHiSpeedDevice(ftHandle,&ReadStartCondition,true,false,NUM_LATTICE_CMD_CONTOL_BITS,&WriteControlBuffer,NUM_LATTICE_CMD_CONTOL_BYTES,true,false,NUM_LATTICE_CMD_DATA_BITS,&ReadDataBuffer,&dwNumDataBytesReturned,&HighPinsWriteActiveStates);if(Status==FTC_SUCCESS){printf(" success ");
    }
    else
    {
        printf("failed");
    }

    printf(" ID read = %x%x%x%x", ReadDataBuffer[0],ReadDataBuffer[1], ReadDataBuffer[2], ReadDataBuffer[3]);
}
'; Status = SPI_GetDllVersion(szDllVersion, 10); // Get version of DLL file MessageBox(NULL, szDllVersion, "FTCSPI DLL Version", MB_OK); Status = SPI_GetNumHiSpeedDevices(&dwNumHiSpeedDevices); if ((Status == FTC_SUCCESS) && (dwNumHiSpeedDevices > 0)) { do { // This gets the name and location identifier for any FTDI HiSpeed device connected to the host. Status = SPI_GetHiSpeedDeviceNameLocIDChannel(dwHiSpeedDeviceIndex, szDeviceName, 100, &dwLocationID, szChannel, 5, &dwHiSpeedDeviceType); dwHiSpeedDeviceIndex = dwHiSpeedDeviceIndex + 1; // Increment to look for other HiSpeed device connected to host. } while ((Status == FTC_SUCCESS) && (dwHiSpeedDeviceIndex < dwNumHiSpeedDevices) && (strcmp(szChannel, "A") != 0)); if (Status == FTC_SUCCESS) { if (strcmp(szChannel, "A") != 0) Status = FTC_DEVICE_IN_USE; } if (Status == FTC_SUCCESS) { // Opens a handle to the Hi Speed device and initializes the device to default state. Status = SPI_OpenHiSpeedDevice(szDeviceName, dwLocationID, szChannel, &ftHandle); if (Status == FTC_SUCCESS) { // Returns the device type, either FT2232H or FT4232H. Status = SPI_GetHiSpeedDeviceType(ftHandle, &dwHiSpeedDeviceType); if (Status == FTC_SUCCESS) { strcpy_s(szDeviceDetails, "Type = "); if (dwHiSpeedDeviceType == FT4232H_DEVICE_TYPE) // Is the device a FT4232H ? strcat_s(szDeviceDetails, "FT4232H"); else if (dwHiSpeedDeviceType == FT2232H_DEVICE_TYPE) // Is the device a FT222H ? strcat_s(szDeviceDetails, "FT2232H"); strcat_s(szDeviceDetails, ", Name = "); strcat_s(szDeviceDetails, szDeviceName); MessageBox(NULL, szDeviceDetails, "Hi Speed Device", MB_OK); } } } Status = SPI_InitDevice(ftHandle, MAX_FREQ_LATTICE_CLOCK_DIVISOR); Status = SPI_SetDeviceLatencyTimer(ftHandle, 16); Status = SPI_GetDeviceLatencyTimer(ftHandle, &timerValue); } ReadStartCondition.bClockPinState = false; ReadStartCondition.bDataOutPinState = false; ReadStartCondition.bChipSelectPinState = true; //Chip Select is active high. ReadStartCondition.dwChipSelectPin = ADBUS3ChipSelect; { { WriteControlBuffer[0]=224; //0xe0 COMMAND FOR READING DEVICE Id Status = SPI_ReadHiSpeedDevice(ftHandle, &ReadStartCondition, true, false, NUM_LATTICE_CMD_CONTOL_BITS, &WriteControlBuffer, NUM_LATTICE_CMD_CONTOL_BYTES, true, false, NUM_LATTICE_CMD_DATA_BITS, &ReadDataBuffer, &dwNumDataBytesReturned, &HighPinsWriteActiveStates); if (Status == FTC_SUCCESS) { printf(" success "); } else { printf("failed"); } printf(" ID read = %x%x%x%x", ReadDataBuffer[0],ReadDataBuffer[1], ReadDataBuffer[2], ReadDataBuffer[3]); } }
    
pregunta gpuguy

1 respuesta

1

Todavía no está del todo claro cuál es el problema. Debería poder usar la función SPI_ReadHiSpeedDevice() nuevamente, tal como lo hizo con el primer comando. Algo como esto:

/* issue the "verify device ID" command
 */
Writecontrolbuffer[0] = 0xE2;
WriteControlBuffer[1] = 0x00;
WriteControlBuffer[2] = 0x00;
WriteControlBuffer[3] = 0x00;
WriteControlBuffer[4] = 0x01;
WriteControlBuffer[5] = 0x2B;
WriteControlBuffer[6] = 0x20;
WriteControlBuffer[7] = 0x43;
Status = SPI_ReadHiSpeedDevice (ftHandle,
                                &ReadStartCondition,
                                true,
                                false,
                                8*8,        // length of command in bits
                                &WriteControlBuffer,
                                8,          // length of command in bytes
                                true,
                                false,
                                NUM_LATTICE_CMD_DATA_BITS,
                                &ReadDataBuffer,
                                &dwNumDataBytesReturned,
                                &HighPinsWriteActiveStates);

/* read the status register to get the results
 */
Writecontrolbuffer[0] = 0x3C;
WriteControlBuffer[1] = 0x00;
WriteControlBuffer[2] = 0x00;
WriteControlBuffer[3] = 0x00;
Status = SPI_ReadHiSpeedDevice (ftHandle,
                                &ReadStartCondition,
                                true,
                                false,
                                4*8,        // length of command in bits
                                &WriteControlBuffer,
                                4,          // length of command in bytes
                                true,
                                false,
                                NUM_LATTICE_CMD_DATA_BITS,
                                &ReadDataBuffer,
                                &dwNumDataBytesReturned,
                                &HighPinsWriteActiveStates);
printf(" SR read = %02x%02x%02x%02x", ReadDataBuffer[0], ReadDataBuffer[1],
   ReadDataBuffer[2], ReadDataBuffer[3]);
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas