Hallo,
ich versuche momentan, eine Logitech PS/2-Maus (RX250, also USB und
PS/2) mit meinem Arduino auszulesen.
Die Kommunikation mit der Maus scheint nach einigem Probieren zu gehen,
leider weigert sich das kleine Nagetier beharrlich, Bewegungs-Reports zu
vermelden. Reset, Konfiguration etc. funktioniert alles wunderbar, nur
beim entscheidenen Kommando 0xF4 (Enable Reports) liefert die Maus kein
0xFA (ACK), sondern 0xFE (NACK). Hier ist der dazugehörige init-Code -
er ist größtenteils von https://www.youtube.com/watch?v=awYNxfDK7fg
inspiriert und auf den ATMega328 angepasst (andere Interrupts):
1 | void MouseInit(void) {
|
2 | stream_mode = 0;
|
3 | status = INIT;
|
4 |
|
5 | //low level initialisation
|
6 | PS2_Init();
|
7 |
|
8 | //enable Global interrupt
|
9 | sei();
|
10 | Serial.println("Resetting...");
|
11 | PS2_SendToDevice(0xFF);
|
12 | Serial.println("Waiting for ACK...");
|
13 | while( status != ACK);
|
14 | Serial.println("Waiting for BAT_PASSED...");
|
15 | //wait until we receive self-test result and mouse id
|
16 | while( status != BAT_PASSED);
|
17 | Serial.println("Waiting for ID_OK...");
|
18 | while( status != ID_OK);
|
19 |
|
20 | Serial.println("Setting resolution...");
|
21 | status = INIT;
|
22 | PS2_SendToDevice(0xE8);
|
23 | Serial.println("Waiting for ACK...");
|
24 | while(status != ACK) ;
|
25 | status = INIT;
|
26 | PS2_SendToDevice(0x03);
|
27 | Serial.println("Waiting for ACK...");
|
28 | while(status != ACK);
|
29 |
|
30 | Serial.println("Setting sample rate...");
|
31 | status = INIT;
|
32 | PS2_SendToDevice(0xF3);
|
33 | Serial.println("Waiting for ACK...");
|
34 | while(status != ACK) ;
|
35 | status = INIT;
|
36 | PS2_SendToDevice(10);
|
37 | Serial.println("Waiting for ACK...");
|
38 | while(status != ACK);
|
39 |
|
40 | Serial.println("Enabling reporting...");
|
41 | status = INIT;
|
42 | PS2_SendToDevice(0xF4);
|
43 | Serial.println("Waiting for ACK...");
|
44 | //wait for acknowledgement(0xFA) from device
|
45 | while(status != ACK);
|
46 |
|
47 | //set mouse in stream mode
|
48 | stream_mode = 1;
|
49 | buffcnt = 0;
|
50 | Serial.println("DONE");
|
51 | }
|
Das letzte "ACK" wird leider nie empfangen, einfach weil die Maus 0xF4
nicht schluckt. Hat jemand schonmal Erfahrungen mit dem Problem
gesammelt?