Forum: PC-Programmierung [?] libmpsse.dll, Fehler bei SPI-Lesen


von Thomas P. (topla)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.