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
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
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]);
}
}