Forum: Mikrocontroller und Digitale Elektronik ADNS 5020E über SPI ansteuern


von Karl F. (fkcm95)


Lesenswert?

Hallo Leute,
ich habe gerade die Maus geschlachtet und wollte erstmal nur über die 
SPI auslesen, ob er den Master erkannt hat.

Doch wenn ich den Sensor mit einer Frequenz mit 5mHz anschließe, 
flackert die LED als. Mit 5Hz flackert es nicht.
Doch machen 5Hz für die Übertragung von Daten sinn?
Was könnte der Grund dafür sein? Habe ich eine zu hohe Frequenz? Die 
Frequenz habe ich aus dem Datenblatt.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Karl F. schrieb:
> Doch wenn ich den Sensor mit einer Frequenz mit 5mHz anschließe

Gross- und Kleinschreibung ist hier wichtig. Du schreibst 5 milliHertz, 
also 5 tausendstel Hertz, meinst aber vermutlich 5 Megahertz (5 MHz). 
Und als was schliesst du das an? Als Taktoszillator? Als SPI Takt? In 
Quarzform? Als Externer TTL Oszillator?

von Karl F. (fkcm95)


Lesenswert?

Danke für die schnelle Antwort.
Meinte natürlich 5MHz. :=)

Ehm, dass sollte eig. Takt von der SPI sein. Aber irgendwie verwirrt 
mich das gerade, warum flackert die LED als hin und her? Ich habe doch 
nicht an Werten verändert?

von Karl F. (fkcm95)


Lesenswert?

Als Code habe ich in C# UWP folgendes:
1
using System;
2
using System.Collections.Generic;
3
using System.IO;
4
using System.Linq;
5
using System.Net;
6
using System.Threading;
7
using System.Threading.Tasks;
8
using System.Runtime.InteropServices.WindowsRuntime;
9
using Windows.Foundation;
10
using Windows.Foundation.Collections;
11
using Windows.UI.Xaml;
12
using Windows.UI.Xaml.Controls;
13
using Windows.UI.Xaml.Controls.Primitives;
14
using Windows.UI.Xaml.Data;
15
using Windows.UI.Xaml.Input;
16
using Windows.UI.Xaml.Media;
17
using Windows.UI.Xaml.Navigation;
18
using Windows.Devices.Gpio;
19
using Windows.Networking.Connectivity;
20
using Windows.Devices.Spi;
21
using Windows.Devices.Enumeration;
22
23
24
namespace LEDSteuerung
25
{
26
    public sealed partial class MainPage : Page
27
    {
28
29
        private const byte Mouse_ID = 0x00;                     
30
        private const byte Mouse_delta_y = 0x04;                 
31
        private const byte CS0 = 0;
32
       
33
34
        private const string SPI_PORT_NAME = "SPI0";
35
        private SpiDevice ADNS5020E;
36
37
38
        public MainPage()
39
        {
40
            this.InitializeComponent();
41
            InitSPI();
42
43
        }
44
45
        private async void InitSPI()
46
        {
47
            try
48
            {
49
                var setting_0 = new SpiConnectionSettings(CS0);
50
51
                setting_0.ClockFrequency = 1000000;                  
52
                setting_0.Mode = SpiMode.Mode3;  
53
54
                string aqs = SpiDevice.GetDeviceSelector();
55
                var dis = await DeviceInformation.FindAllAsync(aqs);
56
                ADNS5020E = await SpiDevice.FromIdAsync(dis[0].Id, setting_0);
57
                
58
59
                if ( ADNS5020E == null)
60
                {
61
                    ID1.Text = string.Format(
62
                        "SPI Controller {0} is currentyl use" +
63
                        "another application. Please ensure that nio other application are using SPI",
64
                        dis[0].Id
65
                        );
66
                    return;
67
                }
68
            }
69
            catch (Exception e)
70
            {
71
                ID1.Text = "Spi faild:" + e.Message;
72
                return;
73
            }
74
75
76
            byte[] ReadBuf;
77
            byte[] RegAdressBuf;
78
79
            ReadBuf = new byte[2 + 1];
80
            RegAdressBuf = new byte[1 + 2];
81
            RegAdressBuf[0] = Mouse_delta_y;
82
            ADNS5020E.TransferFullDuplex(RegAdressBuf, ReadBuf);
83
            Array.Copy(ReadBuf, 1, ReadBuf, 0, 2);
84
85
            if (!BitConverter.IsLittleEndian)
86
            {
87
                Array.Reverse(ReadBuf, 0, 2);
88
            }
89
90
            Teste.Text=BitConverter.ToInt16(ReadBuf, 0).ToString();
91
            
92
93
94
95
        }
96
97
    }
98
}

von Fritz M. (Gast)


Lesenswert?

5 MHz sind eindeutig zu viel. Der ADNS kann laut Datenblatt max. 1MHz. 
Aber wenn ich mir nicht sicher bin, ob überhaupt eine Verbindung 
aufgebaut wird, würde ich das sicherheitshalber nicht ausreizen.

5Hz sind wirklich sehr/zu langsam. du kannst schon in den xxxKHz Bereich 
vordringen.

Wie hast du den Sensor wo angeschlossen?

Ist der Sensor ausgelötet/bzw die Verbindung zum µC auf der Maus 
getrennt? Hat der ADNS die Minimalbeschaltung?

Wenn du einen LA hast, dann beobachte einmal die Kommunikation.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Da ist aber noch irgendeine andere Hardware im Spiel, denn normalerweise 
kennt ein Windows System ja keine SPI Devices von sich aus. Diese 
Hardware muss auch erstmal auf sinnvolle Signale abgeklopft werden, 
bevor man sich mit dem ADNS Sensor beschäftigt.
Dazu könnte es u.U. sogar möglich sein, MOSI und MISO der Hardware 
miteinander zu verbinden und mal was zu senden und gleichzeitig zu 
empfangen.
Wenn das funktioniert, gehts weiter zum Sensor.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl F. schrieb:
> ich habe gerade die Maus geschlachtet und wollte erstmal nur über die
> SPI auslesen, ob er den Master erkannt hat.
Wo und wie angeschlossen und welcher "Master"?

Du solltest das Datenblatt des Sensors besorgen und genau(!!) durchlesen 
und einhalten. Die Dinger sind recht eigen, was das Timing auf dem Bus 
angeht.

von Karl F. (fkcm95)


Lesenswert?

Vielen Dank für die ganzen Antworten. Ich habe die Maus ausgeschlachtet. 
An der Logik habe ich nichts verändert, lediglich drei Kabel gelötet; 
SDIO, SCLK und CS. Mit diesen Leitungen gehe ich an dem Controller. Da 
ich zusammengesetzte SDIO Leitung habe, habe ich erstmal auf dem 
Controller die MOSI und MiSO Leitung miteinander verbunden und dann die 
SDIO Leitung in Reihe zu MOSI gelegt.
Als Maximale Frequenz sind die 1MHz angesehen. Doch auch mit 1 MHz 
flackert es. Eine Verbindung sollte theorisch, nach dem
Code oben, aufgebaut sein, sonst müsste eine Fehlermeldung kommen, oder?

Der Master ist mein u-Controller(Rasberry Pi3)
Habe an dem ADNS nichts verändert.

Originalschaltung, lediglich nur die drei Leitungen dran gelötet. Was 
mir aber beim löten aufgefallen ist, das der PIN für CS und Nreset am 
ADNS zusammengelötet waren.. macht das Sinn?

von Karl F. (fkcm95)


Lesenswert?

Matthias S. schrieb:
> Da ist aber noch irgendeine andere Hardware im Spiel, denn
> normalerweise kennt ein Windows System ja keine SPI Devices von sich
> aus. Diese Hardware muss auch erstmal auf sinnvolle Signale abgeklopft
> werden, bevor man sich mit dem ADNS Sensor beschäftigt. Dazu könnte es
> u.U. sogar möglich sein, MOSI und MISO der Hardware miteinander zu
> verbinden und mal was zu senden und gleichzeitig zu empfangen. Wenn das
> funktioniert, gehts weiter zum Sensor.

Wie meinst du das? Wie kann ich die Hatdware denn testen? Bin in dieser 
Ebene ziemlich neu, deswegen frage ich so ?

von pangaea (Gast)


Lesenswert?

Karl F. schrieb:
> An der Logik habe ich nichts verändert

Das ist eines deiner Hauptprobleme.
Deine Maus besitzt neben dem Sensor noch einen uC, der 
Steuerungsaufgaben übernimmt und nur die Mausbewegungen deinem Computer 
vmtl. über USB mitteilt. Wenn der weiterhin in Betrieb ist, brauchst du 
dich nicht wundern, wenn nichts funktioniert.

Karl F. schrieb:

> auf dem Controller die MOSI und MiSO Leitung miteinander
> verbunden und dann die SDIO Leitung in Reihe zu MOSI gelegt

Mosi und Miso zu verbinden ist schon mal richtig. Das ergibt SDIO.
Was meinst du mit "in Reihe gelegt"?

Karl F. schrieb:
> Doch auch mit 1 MHz flackert es

Warscheinlich stört dein Raspi die Kommunikation zwischen dem "Maus-uC" 
und dem Sensor.

Ich gehe davon aus, dass du den Sensor auslesen möchtest. Dabei ist es 
ersteinmal egal, ob es blinkt oder leuchtet, er besitzt nämlich eine 
Stromsparfunktion, die die LED nur bei Bedarf einschaltet.

Du benötigst dafür einen funktionierenden Treiber, der die SPI 
Schnittstelle/IO-Pins des SBCs richtig ansteuert. Das Timing kannst du 
dem Datenblatt des Adns 5020 entnehmen.
Eine Ui zur Anzeige der Daten ist auch nötig.

Dann versuche zuerst einmal ein Register mit bekanntem Inhalt (siehe 
Datenblatt) bei einer Busfrequenz von zB. 100KHz auslesen.


Ob Windows UWP dafür geeignet ist, bezweifle ich.

Tipps:
Lese das Datenblatt!!
Befasse dich mit der Spi-Schnittstelle des Raspis.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl F. schrieb:
> An der Logik habe ich nichts verändert, lediglich drei Kabel gelötet;
> SDIO, SCLK und CS. Mit diesen Leitungen gehe ich an dem Controller.
Das kann nicht funktionieren, denn diese Leitungen führen ja schon 
Signale. Du erzeugst da eine Buskollision. Dabei kommt nichts sinnvolles 
raus.

von Strubi (Gast)


Lesenswert?

Mein Gott, was soll das ganze werden?

Linux und SPI schreit schon mal aus Erfahrung nach Problemen, besonders 
bei echtzeitrelevanten Sachen wie Maussensoren. Also die Sache mit dem 
Raspi schon mal der falsche Ansatz, abgesehen vom Aufwand, einen 
SPI-Treiber mit garantiertem Timing hinzukriegen, da musst du dich mit 
RT-Erweiterungen beschäftigen. Keep it simple, fang mit einem uC an.
Ich habe für vernünftige Positionserkennung damals einen DSP-Hybriden 
eingesetzt. Was ist deine Zielanwendung?

von Karl F. (fkcm95)


Lesenswert?

Sollte ich eher auf ein Arduino umsteigen um das zu lösen?

Das Problem beim Arduino war, dass es keinen integrierte Ethneret
Anschluss gab. Dafür gibt es nur einen Shield, was mir aber die SPI Pins
wegnimmt. Und ein weiteres Problem ist, ich habe nicht nur eine Maus,
sondern 3 Mäuse. Diese drei Mäuse brauchen jeweils eine SS Leitung. Das
Arduino hat aber nur einen.

Generell zu meinem Projekt: Ich will die Delta_Y Daten von drei Mäusen
auslesen und in einem Server erstmal speichern. Dafür habe ich mir die
ADNS5020 ausgesucht, weil es eine SDIO Leitung hat. Hatte mich direkt
für Windows entschieden, da ich mit Linux kaum Ahnung hatte.

Jetzt die Frage, welchen Controller sollte ich am besten für dieses
Projekt nutzen? Komme ich mit dem Raspberry Pi nicht weit? Würde mich um
Tipps freuen..

PS:
Ich habe erweiterte Kenntnisse in Programmierung ( C/C++ ). Kann mich
aber mit Python oder C# auch anfreunden.

von InFo (Gast)


Lesenswert?

Karl F. schrieb:
> Das Problem beim Arduino war, dass es keinen integrierte Ethneret
> Anschluss gab

Du kannst ja deine Sensoren mit dem Arduino/AVR auslesen und die Daten 
dann über TWI oder UART weitergeben.

Karl F. schrieb:
> Diese drei Mäuse brauchen jeweils eine SS Leitung. Das
> Arduino hat aber nur einen

Beim AVR muss man die SS Leitung(en) manuell bedienen. Dabei ist es 
theoretisch möglich alle freien IO-Pins als SS Leitungen zu benutzen und 
zig Slaves anzuschliessen.

Karl F. schrieb:
> welchen Controller sollte ich am besten für dieses
> Projekt nutzen?

Prinzipiell ist es Egal, aber wenn du schon Erfahrung mit halbwegs 
aktuellen µCs hast, dann nim den, den du kennst.

Wenn du einen  Arduino rumliegen hast, bietet es sich an den AVR darauf 
(der Atmega 328 @16-20 MHz ist ausreichend und auf vielen 
Arduino-Boards) zu nutzen. AVRs sind auch nicht sehr komplex.
Von den Arduino Librarys kann man nur abraten, die Besitzen nämlich viel 
overhead. Zur Nutzung der Standardlibs gibt es hier im Forum ein sehr 
gutes Tutorial.
Es müsste möglich sein diese Libs auch in die Arduino "IDE" einzubinden.
Ansonsten nim das Atmel Studio und einen vernünftigen, externen 
Programmer.

Mit am meisten Dampf haben die 32Bit ARM Cortex M. Die spielen aber auch 
von der Komplexität her in einer ganz anderen Liga.

Jeder wird dir auf diese Frage etwas anderes empfehlen.


Kaufe dir auf jeden Fall einen Logic Analyser, ein Saleae-Clone für 12€ 
reicht ersteinmal aus. Sowas ist gerade zum Debuggen von Bussystemen 
äußerst hilfreich.

Karl F. schrieb:
> Ich habe erweiterte Kenntnisse in Programmierung ( C/C++ )

Das erleichtert dir den Einstieg in die Welt der µCs enorm, denn was 
anderes benötigst du dafür nicht.

von Strubi (Gast)


Lesenswert?

Moin,


Karl F. schrieb:
> Sollte ich eher auf ein Arduino umsteigen um das zu lösen?
>

Wenn du nur mal die HW evaluieren willst: Ja, warum nicht.
Wenn es eine robuste industrielle Anwendung werden soll: Vergiss es.

> Das Problem beim Arduino war, dass es keinen integrierte Ethneret
> Anschluss gab. Dafür gibt es nur einen Shield, was mir aber die SPI Pins
> wegnimmt. Und ein weiteres Problem ist, ich habe nicht nur eine Maus,
> sondern 3 Mäuse. Diese drei Mäuse brauchen jeweils eine SS Leitung. Das
> Arduino hat aber nur einen.
>

Wozu brauchst du drei Mäuse?

> Generell zu meinem Projekt: Ich will die Delta_Y Daten von drei Mäusen
> auslesen und in einem Server erstmal speichern. Dafür habe ich mir die
> ADNS5020 ausgesucht, weil es eine SDIO Leitung hat. Hatte mich direkt
> für Windows entschieden, da ich mit Linux kaum Ahnung hatte.
>

Vergiss mal Windows/Linux, und schau, dass du den Sensor mal so nackt 
angesteuert kriegst. Tauchen dann noch genügend Probleme auf...je nach 
deiner Anwendung.

> Jetzt die Frage, welchen Controller sollte ich am besten für dieses
> Projekt nutzen? Komme ich mit dem Raspberry Pi nicht weit? Würde mich um
> Tipps freuen..
>

Das kann dir keiner richtig sagen, wenn du nicht mit 
Fakten/Anforderungen zur Zielanwendung rausrückst. Wenn du eine saubere 
Positionserkennung in X/Y/Z hinkriegen willst: Die richtig kniffligen 
Sachen kommen noch. Genau deswegen hatten wir damals dafür ein 
DSP-Framework entwickelt (Timing ist alles). Und dann musst du die 
richtigen Sensoren nehmen...

Für industrielle Anwendung würde ich nach der Uebernahme von Avago durch 
Broadcom komplett von den ADNS absehen, das hat damals schon in 
Gefrickel ausgeartet, und mit handelsüblichen Global-Shutter-Sensoren 
kriegt man das gleiche besser hin und hat noch mehr Möglichkeiten 
(Rotation, ...)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

InFo schrieb:
> Mit am meisten Dampf haben die 32Bit ARM Cortex M. Die spielen aber auch
> von der Komplexität her in einer ganz anderen Liga.

Es würde nur dann einen Sinn haben, wenn man unbedingt viele Hardware 
SPI Schnittstellen braucht. M.W. hat der grösste ATMega nur 2, wovon 
eines auch zur Programmierung belegt wird.
Das man Bitbanging machen kann, also einfach Pins im Programm wackelt, 
kann man dem TE vermutlich jetzt noch nicht aufdrücken, so kann das dann 
natürlich jeder AVR mit ausreichend Portpins.
Man kann auch jedem Sensor seinen eigenen AVR spendieren, muss sich dann 
aber überlegen, wie man die Daten zusammenführt.

: Bearbeitet durch User
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.