Je cherche à savoir pourquoi j ai une erreur 6 dans ce code pour lire l'eeprom du composant FT230X :
Code : Tout sélectionner
; ===============================================
; Communication FT230XS via DLL FTDI (FTD2XX.dll)
; Avec gestion EEPROM
; ===============================================
; Constantes FTDI
#FT_OK = 0
#FT_INVALID_HANDLE = 1
#FT_DEVICE_NOT_FOUND = 2
#FT_DEVICE_NOT_OPENED = 3
#FT_IO_ERROR = 4
#FT_INSUFFICIENT_RESOURCES = 5
#FT_INVALID_PARAMETER = 6
#FT_OPEN_BY_SERIAL_NUMBER = 1
#FT_OPEN_BY_DESCRIPTION = 2
#FT_OPEN_BY_LOCATION = 4
#FT_BAUD_9600 = 9600
#FT_BAUD_115200 = 115200
#FT_BITS_8 = 8
#FT_STOP_BITS_1 = 0
#FT_PARITY_NONE = 0
; Variables globales
Global ftHandle.i = 0
Global LibraireFTDI.i
; Structure pour informations du périphérique
Structure FT_DEVICE_LIST_INFO_NODE
Flags.l
Type.l
ID.l
LocId.l
SerialNumber.s{16}
Description.s{64}
ftHandle.i
EndStructure
; Structure EEPROM pour FT230X
Structure FT_EEPROM_230X
Common_Signature1.l ; Header - must be 0x00000000
Common_Signature2.l ; Header - must be 0xFFFFFFFF
Common_Version.l ; Version
VendorId.w ; 0x0403 = FTDI VID
ProductId.w ; 0x6015 = FT230X PID
Manufacturer.i ; Pointer to Manufacturer string
ManufacturerId.i ; Pointer to ManufacturerId string
Description.i ; Pointer to Description string
SerialNumber.i ; Pointer to SerialNumber string
MaxPower.w ; Max power consumption (mA)
PnP.w ; Plug and Play
SelfPowered.w ; Self powered
RemoteWakeup.w ; Remote wakeup
; FT230X specific
Cbus0.a ; CBUS0 configuration
Cbus1.a ; CBUS1 configuration
Cbus2.a ; CBUS2 configuration
Cbus3.a ; CBUS3 configuration
RIsD2XX.a ; RI is D2XX
Common_SerNum.a ; Use serial number
Common_InvertTXD.a ; Invert TXD
Common_InvertRXD.a ; Invert RXD
Common_InvertRTS.a ; Invert RTS
Common_InvertCTS.a ; Invert CTS
Common_InvertDTR.a ; Invert DTR
Common_InvertDSR.a ; Invert DSR
Common_InvertDCD.a ; Invert DCD
Common_InvertRI.a ; Invert RI
EndStructure
; ===============================================
; Chargement de la DLL FTDI
; ===============================================
Procedure ChargerDLL()
LibraireFTDI = OpenLibrary(#PB_Any, "FTD2XX.dll")
If LibraireFTDI
Debug "DLL FTD2XX.dll chargée avec succès"
ProcedureReturn #True
Else
Debug "ERREUR: Impossible de charger FTD2XX.dll"
Debug "Assurez-vous que la DLL est dans le même dossier ou dans System32"
ProcedureReturn #False
EndIf
EndProcedure
; ===============================================
; Prototypes des fonctions FTDI
; ===============================================
PrototypeC FT_CreateDeviceInfoList(*lpdwNumDevs)
PrototypeC FT_GetDeviceInfoList(*pDest, *lpdwNumDevs)
PrototypeC FT_Open(deviceNumber, *pHandle)
PrototypeC FT_OpenEx(*pArg1, Flags, *pHandle)
PrototypeC FT_Close(ftHandle)
PrototypeC FT_Read(ftHandle, *lpBuffer, dwBytesToRead, *lpBytesReturned)
PrototypeC FT_Write(ftHandle, *lpBuffer, dwBytesToWrite, *lpBytesWritten)
PrototypeC FT_SetBaudRate(ftHandle, BaudRate)
PrototypeC FT_SetDataCharacteristics(ftHandle, WordLength, StopBits, Parity)
PrototypeC FT_SetTimeouts(ftHandle, ReadTimeout, WriteTimeout)
PrototypeC FT_Purge(ftHandle, Mask)
PrototypeC FT_GetQueueStatus(ftHandle, *dwRxBytes)
PrototypeC FT_EEPROM_Read(ftHandle, *eepromData, eepromDataSize, *Manufacturer, *ManufacturerId, *Description, *SerialNumber)
PrototypeC FT_EEPROM_Program(ftHandle, *eepromData, eepromDataSize, *Manufacturer, *ManufacturerId, *Description, *SerialNumber)
; ===============================================
; Lister les périphériques FTDI
; ===============================================
Procedure ListerPeripheriques()
Protected numDevs.l = 0
Protected status.l
Protected i.i
If Not LibraireFTDI
Debug "DLL non chargée"
ProcedureReturn 0
EndIf
Protected FT_CreateDeviceInfoList.FT_CreateDeviceInfoList = GetFunction(LibraireFTDI, "FT_CreateDeviceInfoList")
If FT_CreateDeviceInfoList
status = FT_CreateDeviceInfoList(@numDevs)
If status = #FT_OK
Debug "Nombre de périphériques FTDI: " + Str(numDevs)
ProcedureReturn numDevs
Else
Debug "Erreur lors de la liste des périphériques: " + Str(status)
ProcedureReturn 0
EndIf
EndIf
ProcedureReturn 0
EndProcedure
; ===============================================
; Ouvrir le périphérique
; ===============================================
Procedure OuvrirPeripherique(deviceIndex.i = 0)
Protected status.l
Protected FT_Open.FT_Open
Protected FT_SetBaudRate.FT_SetBaudRate
Protected FT_SetDataCharacteristics.FT_SetDataCharacteristics
Protected FT_SetTimeouts.FT_SetTimeouts
Protected FT_Purge.FT_Purge
If Not LibraireFTDI
Debug "DLL non chargée"
ProcedureReturn #False
EndIf
FT_Open = GetFunction(LibraireFTDI, "FT_Open")
If FT_Open
status = FT_Open(deviceIndex, @ftHandle)
If status = #FT_OK And ftHandle <> 0
Debug "Périphérique " + Str(deviceIndex) + " ouvert (Handle: " + Str(ftHandle) + ")"
; Configuration du port série
FT_SetBaudRate = GetFunction(LibraireFTDI, "FT_SetBaudRate")
FT_SetDataCharacteristics = GetFunction(LibraireFTDI, "FT_SetDataCharacteristics")
FT_SetTimeouts = GetFunction(LibraireFTDI, "FT_SetTimeouts")
FT_Purge = GetFunction(LibraireFTDI, "FT_Purge")
If FT_SetBaudRate
FT_SetBaudRate(ftHandle, #FT_BAUD_9600)
EndIf
If FT_SetDataCharacteristics
FT_SetDataCharacteristics(ftHandle, #FT_BITS_8, #FT_STOP_BITS_1, #FT_PARITY_NONE)
EndIf
If FT_SetTimeouts
FT_SetTimeouts(ftHandle, 1000, 1000) ; 1 seconde
EndIf
If FT_Purge
FT_Purge(ftHandle, 3) ; RX + TX
EndIf
Debug "Configuration: 9600 bauds, 8N1"
ProcedureReturn #True
Else
Debug "ERREUR: Impossible d'ouvrir le périphérique (Status: " + Str(status) + ")"
ProcedureReturn #False
EndIf
EndIf
ProcedureReturn #False
EndProcedure
; ===============================================
; Écrire des données
; ===============================================
Procedure EcrireDonnees(*Buffer, Taille.i)
Protected bytesWritten.l = 0
Protected status.l
Protected FT_Write.FT_Write
If ftHandle = 0
Debug "Périphérique non ouvert"
ProcedureReturn #False
EndIf
FT_Write = GetFunction(LibraireFTDI, "FT_Write")
If FT_Write
status = FT_Write(ftHandle, *Buffer, Taille, @bytesWritten)
If status = #FT_OK
Debug "Écrit: " + Str(bytesWritten) + " octets"
ProcedureReturn bytesWritten
Else
Debug "Erreur d'écriture: " + Str(status)
ProcedureReturn 0
EndIf
EndIf
ProcedureReturn 0
EndProcedure
; ===============================================
; Écrire du texte
; ===============================================
Procedure EcrireTexte(Texte.s)
Protected *Buffer = UTF8(Texte)
Protected Taille.i = StringByteLength(Texte, #PB_UTF8)
Protected Resultat.i
Resultat = EcrireDonnees(*Buffer, Taille)
FreeMemory(*Buffer)
ProcedureReturn Resultat
EndProcedure
; ===============================================
; Lire des données
; ===============================================
Procedure LireDonnees(*Buffer, TailleMax.i)
Protected bytesRead.l = 0
Protected rxBytes.l = 0
Protected status.l
Protected FT_GetQueueStatus.FT_GetQueueStatus
Protected FT_Read.FT_Read
If ftHandle = 0
Debug "Périphérique non ouvert"
ProcedureReturn 0
EndIf
FT_GetQueueStatus = GetFunction(LibraireFTDI, "FT_GetQueueStatus")
FT_Read = GetFunction(LibraireFTDI, "FT_Read")
If FT_GetQueueStatus
status = FT_GetQueueStatus(ftHandle, @rxBytes)
If status = #FT_OK And rxBytes > 0
If rxBytes > TailleMax
rxBytes = TailleMax
EndIf
If FT_Read
status = FT_Read(ftHandle, *Buffer, rxBytes, @bytesRead)
If status = #FT_OK
Debug "Lu: " + Str(bytesRead) + " octets"
ProcedureReturn bytesRead
EndIf
EndIf
EndIf
EndIf
ProcedureReturn 0
EndProcedure
; ===============================================
; Lire l'EEPROM
; ===============================================
Procedure LireEEPROM(*eepromData.FT_EEPROM_230X)
Protected status.l
Protected FT_EEPROM_Read.FT_EEPROM_Read
Protected Manufacturer.s{64}
Protected ManufacturerId.s{64}
Protected Description.s{64}
Protected SerialNumber.s{64}
If ftHandle = 0
Debug "Périphérique non ouvert"
ProcedureReturn #False
EndIf
FT_EEPROM_Read = GetFunction(LibraireFTDI, "FT_EEPROM_Read")
If FT_EEPROM_Read
; Initialiser la structure
*eepromData\Common_Signature1 = 0
*eepromData\Common_Signature2 = $FFFFFFFF
*eepromData\Common_Version = 0
status = FT_EEPROM_Read(ftHandle, *eepromData, SizeOf(FT_EEPROM_230X),
@Manufacturer, @ManufacturerId, @Description, @SerialNumber)
If status = #FT_OK
Debug "=== Lecture EEPROM réussie ==="
Debug "Fabricant: " + PeekS(@Manufacturer, -1, #PB_Ascii)
Debug "Description: " + PeekS(@Description, -1, #PB_Ascii)
Debug "Numéro de série: " + PeekS(@SerialNumber, -1, #PB_Ascii)
Debug "VID: 0x" + Hex(*eepromData\VendorId, #PB_Word)
Debug "PID: 0x" + Hex(*eepromData\ProductId, #PB_Word)
Debug "Max Power: " + Str(*eepromData\MaxPower) + " mA"
ProcedureReturn #True
Else
Debug "ERREUR lecture EEPROM: " + Str(status)
ProcedureReturn #False
EndIf
EndIf
ProcedureReturn #False
EndProcedure
; ===============================================
; Écrire dans l'EEPROM
; ===============================================
Procedure EcrireEEPROM(Manufacturer.s, Description.s, SerialNumber.s, MaxPower.w = 90)
Protected status.l
Protected FT_EEPROM_Program.FT_EEPROM_Program
Protected eepromData.FT_EEPROM_230X
If ftHandle = 0
Debug "Périphérique non ouvert"
ProcedureReturn #False
EndIf
FT_EEPROM_Program = GetFunction(LibraireFTDI, "FT_EEPROM_Program")
If FT_EEPROM_Program
; Initialiser la structure EEPROM
eepromData\Common_Signature1 = 0
eepromData\Common_Signature2 = $FFFFFFFF
eepromData\Common_Version = 0
eepromData\VendorId = $0403 ; FTDI VID
eepromData\ProductId = $6015 ; FT230X PID
eepromData\MaxPower = MaxPower
eepromData\SelfPowered = 0
eepromData\RemoteWakeup = 0
; Configuration CBUS (exemple)
eepromData\Cbus0 = 0 ; TxLED
eepromData\Cbus1 = 0 ; RxLED
eepromData\Cbus2 = 0 ; TxRxLED
eepromData\Cbus3 = 0 ; PWREN#
eepromData\Common_SerNum = 1 ; Utiliser le numéro de série
Debug "=== Écriture EEPROM ==="
Debug "Fabricant: " + Manufacturer
Debug "Description: " + Description
Debug "Numéro de série: " + SerialNumber
Debug "Max Power: " + Str(MaxPower) + " mA"
Protected *Manuf = UTF8(Manufacturer)
Protected *Desc = UTF8(Description)
Protected *Serial = UTF8(SerialNumber)
status = FT_EEPROM_Program(ftHandle, @eepromData, SizeOf(FT_EEPROM_230X),
*Manuf, 0, *Desc, *Serial)
FreeMemory(*Manuf)
FreeMemory(*Desc)
FreeMemory(*Serial)
If status = #FT_OK
Debug "EEPROM programmée avec succès!"
Debug "ATTENTION: Débranchez et rebranchez le périphérique pour appliquer les changements"
ProcedureReturn #True
Else
Debug "ERREUR programmation EEPROM: " + Str(status)
ProcedureReturn #False
EndIf
EndIf
ProcedureReturn #False
EndProcedure
; ===============================================
; Fermer le périphérique
; ===============================================
Procedure FermerPeripherique()
Protected FT_Close.FT_Close
If ftHandle <> 0
FT_Close = GetFunction(LibraireFTDI, "FT_Close")
If FT_Close
FT_Close(ftHandle)
Debug "Périphérique fermé"
EndIf
ftHandle = 0
EndIf
EndProcedure
; ===============================================
; Programme principal - Exemples
; ===============================================
Debug "=== Test FT230XS avec DLL FTDI ==="
Debug ""
; Charger la DLL
If ChargerDLL()
; Lister les périphériques
Define numDevices.i = ListerPeripheriques()
If numDevices > 0
Debug ""
; Ouvrir le premier périphérique
If OuvrirPeripherique(0)
; Exemple 1: Lire l'EEPROM
Debug ""
Debug "=== Test 1: Lecture EEPROM ==="
Define eeprom.FT_EEPROM_230X
LireEEPROM(@eeprom)
; Exemple 2: Écrire dans l'EEPROM (DÉCOMMENTER AVEC PRÉCAUTION!)
; Debug ""
; Debug "=== Test 2: Écriture EEPROM ==="
; EcrireEEPROM("Mon Fabricant", "Mon FT230XS", "SN12345678", 90)
Debug "=== Test 2: Écriture EEPROM ==="
EcrireEEPROM("Mon Fabricant", "Mon FT230XS", "SN12345678", 90)
; Exemple 3: Communication série
Debug ""
Debug "=== Test 3: Communication série ==="
EcrireTexte("Hello FT230XS!")
Delay(100)
Dim Buffer.a(255)
Define bytesLus.i = LireDonnees(@Buffer(), 255)
If bytesLus > 0
Debug "Données reçues:"
For i = 0 To bytesLus - 1
Debug " [" + Str(i) + "] = 0x" + Hex(Buffer(i), #PB_Byte)
Next
EndIf
; Fermer
Debug ""
FermerPeripherique()
EndIf
Else
Debug "Aucun périphérique FTDI détecté"
EndIf
CloseLibrary(LibraireFTDI)
Else
Debug "Impossible de continuer sans la DLL"
EndIf
Debug ""
Debug "Programme terminé - Appuyez sur Entrée"
Input()
Eric