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