[?] libmpsse.dll, Fehler bei SPI-Lesen

OP #8013851
Lesenswert?

Moin zusammen,

ich habe hier einen SPI-EEPROM 95640, der für die Parametrierung eines anderen Controllers genutzt wird und bisher über einen Galep-4 seine Daten bekommen hat. Nun möchte ich das Umstellen und das vorhandene PC-Programm soll die Daten über einen Adapter mit FT2232D von B. Redemann auf den EEPROM schreiben/lesen. Dazu nutze ich ein vb.net_programm mit libmpsse.dll. Die Initialisierung sieht so aus:

1
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles USB_Start.Click
2
    ' Start Test
3
    Dim deviceCount As UInteger = 0
4

5
    USBlog.Items.Clear()
6

7
    Init_libMPSSE()
8

9
    SPI_GetNumChannels(deviceCount)
10
    Dim deviceList As New FT_DEVICE_LIST_INFO_NODE
11

12
    If (deviceCount > 0) Then
13
        For i As UInteger = 0 To deviceCount - 1
14
            fT_STATUS = SPI_GetChannelInfo(i, deviceList)
15

16
            If fT_STATUS = FT_OK Then
17
                USBlog.Items.Add("Kanal #" & i)
18
                USBlog.Items.Add("  Beschreibung   : " & deviceList.Description)
19
                USBlog.Items.Add("  Seriennummer   : " & deviceList.SerialNumber)
20
                USBlog.Items.Add("  Typ            : " & deviceList.Type)
21
                USBlog.Items.Add("  Flags          : " & deviceList.Flags)
22
                USBlog.Items.Add("  Location ID    : " & deviceList.LocId)
23
                USBlog.Items.Add(" ")
24
                If (((deviceList.Type = 4) Or (deviceList.Type = 6)) And myChannel = 0) Then
25
                    myChannel = i ' channel A des ersten gefundenen Devices
26
                    myLocId = deviceList.LocId
27
                    mySerNum = deviceList.SerialNumber
28
                End If
29
            Else
30
                USBlog.Items.Add("Fehler beim Abrufen von Kanalinformationen für Kanal " & i & ". Status: " & fT_STATUS)
31
            End If
32
        Next
33
    Else
34
        USBlog.Items.Add("Es wurde kein geeignetes USB-Device gefunden!")
35
    End If
36

37
    ' jetzt SPI-Kanal öffnen
38
    fT_STATUS = SPI_OpenChannel(myChannel, fthandle)    ' hier wird fthandle gesetzt
39
    If (fT_STATUS = (FTDI.FT_STATUS.FT_OK)) Then
40
        USBlog.Items.Add("Device " & myLocId.ToString("X") & " " & fT_STATUS & " erfolgreich geöffnet.")
41
    Else
42
        USBlog.Items.Add("Device " & myLocId.ToString("X") & " " & fT_STATUS & " konnte nicht geöffnet werden!")
43
    End If
44

45
    Dim ftconfig As New ChannelConfig With {
46
        .ClockRate = 1000000,         ' 1 MHz
47
        .LatencyTimer = 2,
48
        .configOptions = &H0,  ' SPI Mode 0 + CS active low, MPSSE-Standardbelegung
49
        .Pin = &HB  ' kann auch 0 statt &HB bleiben, hat im MPSSE-Modus keine Wirkung
50
    }
51
    ' SPI-Kanal initialisieren
52
    fT_STATUS = SPI_InitChannel(fthandle, ftconfig)
53
    If (fT_STATUS = (FTDI.FT_STATUS.FT_OK)) Then
54
        USBlog.Items.Add("Device " & myLocId.ToString("X") & " " & fT_STATUS & " SPI-Parameter gesetzt.")
55
    Else
56
        USBlog.Items.Add("Device " & myLocId.ToString("X") & " " & fT_STATUS & " SPI-Parameter konnten nicht gesetzt werden!")
57
    End If
58
    'SPI_ChangeCS(fthandle, &H20)    ' CS active high
59
    'SPI_ChangeCS(fthandle, &H0)    ' CS active low
60
End Sub

Anschließend kommt der Leseversuch mit:

1
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles EEPROM_lesen.Click
2
    ' eeprom lesen
3
    ' als Dokumentation:
4
    ' Const SPI_TRANSFER_OPTIONS_SIZE_IN_BYTES = &H0 ' Transfer Size in Byte (&H1 in Bits)
5
    ' Const SPI_TRANSFER_OPTIONS_CHIPSELECT_ENABLE = &H2 ' CS wird vor der Operation gesetzt
6
    ' Const SPI_TRANSFER_OPTIONS_CHIPSELECT_DISABLE = &H4 ' CS wird nach der Operation zurückgenommen
7

8
    USBlog.Items.Add("EEPROM-Daten lesen.")
9

10
    Dim SpiWriteBuffer As Byte() = New Byte(32) {}  ' eeprom Schreibpuffer
11
    Dim i As Integer
12

13
    ' kompletten eeprom einlesen
14
    Dim BytesRead As UInt32
15
    Dim cmd(2) As Byte
16
    ' READ Befehl vorbereiten
17
    cmd(0) = &H3              ' READ
18
    cmd(1) = &H0              ' Address High
19
    cmd(2) = &H0              ' Address Low
20
    'SPI_ChangeCS(fthandle, &H0)    ' CS active low
21

22
    ' READ Command + Adresse senden
23
    fT_STATUS = SPI_Write(fthandle, cmd, 3, BytesRead, &H2)
24
    If fT_STATUS <> FTDI.FT_STATUS.FT_OK Then
25
        USBlog.Items.Add("EEPROM READ Command fehlgeschlagen!")
26
        Exit Sub
27
    End If
28

29
    ' Lesen vom EEPROM
30
    fT_STATUS = SPI_Read(fthandle, eeprom_buffer, 2048, BytesRead, 4)
31

32
    If fT_STATUS = FTDI.FT_STATUS.FT_OK Then
33
        USBlog.Items.Add("EEPROM erfolgreich gelesen: " & BytesRead & " Bytes")
34
    Else
35
        USBlog.Items.Add("EEPROM Lesen fehlgeschlagen!")
36
    End If
37

38
    Dim check As Integer = 0
39
    For i = 0 To 2047
40
        If eeprom_buffer(i) = &HFF Then check += 1
41
    Next
42
End Sub

Das Ganze funktioniert ohne Fehlermeldungen, allerdings gehen die Lesezugriffe schief, es wird nur 0xFF gelesen. Eine Analyse mit dem LA ergab, dass sich CS invers verhält, also high-aktiv ist. Die Hardware ist ok, alle Verbindungen geprüft und zumindest CS, MOSI und CLK mit dem LA gecheckt. Trotz intensivem Draufschauen (kann man schon glotzen nennen) finde ich den Fehler im Programm nicht. Auch das Umstellen von low-aktiv auf high-aktiv habe ich erfolglos versucht. Kann da bitte mal Jemand mit mehr Erfahrung drüberschauen? Wenn garnichts hilft, dann löte ich einen Inverter zwischen FT2232D und EEPROM, aber mit Sicherheit habe ich hier einen ganz blöden Fehler eingebaut, mit FTs arbeiten doch viele und solche Probleme wären doch mal aufgetaucht.

Viele Grüße Thomas

Angehängte Dateien:
OP #8014482
Lesenswert?

Moin,

ich mache hier mal die Ingrid: Nach längerem Herumgehampel mit der libmpsse und den Parametern habe ich jetzt kurzentschlossen einen BC337 zum Invertieren des CS-Signals eingebaut - funktioniert alles problemlos. Würde mich trotzdem interessieren, ob es da noch andere Lösungen gibt und ob das Problem mit dem FT2232H nicht besteht.

Thomas

OP #8014796
Lesenswert?

Beim FT2232D geht das laut Anleitung über die libmpsse.dll mit einem Parameter, soll auch Standardeinstellung sein - funktioniert hier bei mir aber nicht. Beim Öffnen des Channels geht CS auf low und das war es dann. Stellt man das auf CS-active high um, arbeitet alles einwandfrei, braucht aber eben einen Inverter am CS-Ausgang.

Thomas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren